การทำ Cluster Load Balancing เพื่อเพิ่มประสิทธิภาพและรองรับการขยายขนาด (scalability) ของเว็บไซต์บน 3 VM สามารถทำได้โดยการใช้เครื่องมือเช่น HAProxy หรือ Nginx เพื่อกระจายโหลดไปยัง VM แต่ละเครื่อง ในกรณีนี้ เราจะใช้ HAProxy เป็นตัวอย่างในการทำ Load Balancer สำหรับเว็บไซต์
 

โครงสร้างของ Cluster:
 

  • VM1: Web server 1
  • VM2: Web server 2
  • VM3: Web server 3
  • HAProxy (Load Balancer): เครื่องที่ทำหน้าที่เป็นตัวกลางเพื่อกระจายโหลดไปยัง VM ต่าง ๆ
     

ขั้นตอนการตั้งค่า HAProxy สำหรับ Load Balancing:

  1. ติดตั้ง HAProxy บน VM ที่จะทำหน้าที่เป็น Load Balancer:

    bash

    sudo apt update sudo apt install haproxy

  2. ตั้งค่าไฟล์ configuration ของ HAProxy: เปิดไฟล์ /etc/haproxy/haproxy.cfg และเพิ่มการตั้งค่าเพื่อกำหนด backend servers (VM1, VM2, VM3):

    
     

    bash

    global
        log /dev/log local0
        log /dev/log local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

    defaults
        log global
        option redispatch
        option forwardfor
        option httplog
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms

    frontend http_front
        bind *:80
        default_backend web_servers

    backend web_servers
        balance roundrobin
        server web1 192.168.1.101:80 check
        server web2 192.168.1.102:80 check
        server web3 192.168.1.103:80 check

     

     

    • Frontend: กำหนด port ที่ Load Balancer จะรับ traffic (เช่น port 80 สำหรับ HTTP)
    • Backend: กำหนด IP ของแต่ละ VM ที่เป็น web server พร้อม port ที่รับส่งข้อมูล (เช่น 192.168.1.101, 192.168.1.102, 192.168.1.103)

    ในตัวอย่างนี้ ใช้ roundrobin สำหรับการกระจายโหลด ซึ่งจะส่ง request ไปยัง web server แต่ละตัวอย่างเป็นลำดับ

  3. Restart HAProxy:

    
     

    bash

    sudo systemctl restart haproxy

  4. ตรวจสอบการทำงาน: หลังจากตั้งค่าเสร็จแล้ว คุณสามารถตรวจสอบ HAProxy logs ได้ด้วยคำสั่ง:

    
     

    bash

    sudo tail -f /var/log/haproxy.log
     

การทำให้เว็บไซต์สามารถขยายได้ (scalable):
 

  • การเพิ่ม VM: หากมีความต้องการในการขยายจำนวน web server คุณสามารถเพิ่ม VM เข้าไปใน backend web_servers โดยไม่ต้องหยุดการทำงานของ Load Balancer
  • การทำ health checks: คุณสามารถเพิ่มตัวเลือกการตรวจสอบสถานะของแต่ละ VM เช่นการใช้คำสั่ง check ในการกำหนดให้ HAProxy ตรวจสอบว่า VM ใดทำงานได้ปกติหรือไม่
     

Scaling Options:
 

หากการขยายต้องการระบบอัตโนมัติมากขึ้น คุณอาจพิจารณาใช้บริการ cloud auto-scaling หรือเครื่องมือเช่น Kubernetes ที่สามารถจัดการการ scale ของ containerized services ได้โดยอัตโนมัติ

การทำ Cluster Load Balancing ช่วยให้เว็บไซต์รองรับจำนวนผู้ใช้ที่มากขึ้นได้อย่างมีประสิทธิภาพ และลดการเสียหายหากมี VM ใดเกิดปัญหา เนื่องจากโหลดจะถูกกระจายไปยังเครื่องอื่น
 

การจัดการ Domain และ DNS
 

ในการจัดการ โดเมน (domain) และ DNS สำหรับการทำ Cluster Load Balancing โดยใช้ HAProxy เพื่อให้เว็บไซต์สามารถเข้าถึงได้ผ่านโดเมนเดียว คุณจะต้องกำหนดค่าทั้งในส่วนของ DNS และเซิร์ฟเวอร์เว็บให้ทำงานร่วมกันได้อย่างมีประสิทธิภาพ
 

1. ตั้งค่า DNS บน Cloudflare หรือบริการ DNS อื่น ๆ:
 

คุณต้องกำหนด DNS เพื่อชี้ไปยัง Load Balancer (ซึ่งอาจเป็น IP ของ HAProxy) และสามารถใช้บริการ DNS เช่น Cloudflare เพื่อช่วยในเรื่องการจัดการโดเมน

  • A Record: สร้าง A Record เพื่อชี้โดเมนของคุณไปยัง IP ของ Load Balancer

    • ตัวอย่าง: example.com -> 192.168.1.50 (IP ของ HAProxy)
       
  • CNAME Record (ถ้าต้องการ subdomain): หากคุณต้องการให้ subdomain ชี้ไปที่โดเมนหลัก

    • ตัวอย่าง: www.example.com -> example.com
       
  • การเปิด Proxy ของ Cloudflare (ถ้าใช้): Cloudflare มีบริการ proxy ที่สามารถช่วยป้องกัน DDoS และเพิ่มประสิทธิภาพการโหลดของเว็บไซต์ คุณสามารถเปิดโหมด proxy ใน Cloudflare ได้หากต้องการใช้งาน

     

2. ตั้งค่า HAProxy ให้รองรับการใช้งานกับโดเมน:
 

ในไฟล์คอนฟิกของ HAProxy (/etc/haproxy/haproxy.cfg), คุณอาจต้องกำหนดค่า frontend ให้รองรับการเรียกใช้งานจากโดเมน:


 

bash

frontend http_front bind *:80 acl host_example hdr(host) -i example.com use_backend web_servers if host_example
 

ในกรณีนี้, HAProxy จะตรวจสอบ header ของคำร้อง (request) และใช้ backend ที่กำหนดหากโดเมนตรงกับ example.com
 

3. การจัดการ SSL Certificate:
 

หากคุณต้องการใช้ HTTPS คุณจะต้องจัดการเรื่อง SSL Certificate:

  • ใช้ Let’s Encrypt เพื่อออกใบรับรอง SSL ฟรีสำหรับโดเมนของคุณ
  • หรือนำใบรับรอง SSL จาก CA มาใช้

ตัวอย่างการเพิ่ม SSL ใน HAProxy:


 

bash

frontend https_front bind *:443 ssl crt /etc/ssl/certs/example.com.pem default_backend web_servers
 

ในกรณีนี้ คุณจะกำหนดให้ HAProxy ใช้ SSL เพื่อรองรับการเชื่อมต่อ HTTPS ที่ปลอดภัย

4. การจัดการ IP สำหรับ VM ใน Cluster:

VM แต่ละเครื่องใน Cluster จะต้องมี IP ที่สามารถติดต่อได้ คุณต้องทำให้ IP ของแต่ละ VM เป็นแบบ Static IP หรือใช้ DHCP ที่กำหนด IP ไว้คงที่

5. การใช้ Cloudflare สำหรับการจัดการ DNS Failover:

Cloudflare มีฟีเจอร์ DNS Failover ซึ่งสามารถตั้งค่าให้ตรวจสอบว่าถ้า VM ตัวใดตัวหนึ่งล่ม มันจะเปลี่ยนการชี้ DNS ไปยัง VM ตัวอื่น หรือในกรณีที่ HAProxy ไม่สามารถทำงานได้ คุณสามารถให้ Cloudflare ทำ Failover ไปยังสำรองได้

6. ตรวจสอบสถานะ DNS:

หลังจากตั้งค่าทั้งหมดแล้ว คุณสามารถใช้คำสั่ง nslookup หรือ dig เพื่อตรวจสอบการทำงานของ DNS:

bash

nslookup example.com
 

หรือใช้เครื่องมือเช่น pingdom หรือ DNSchecker เพื่อตรวจสอบว่า DNS กระจายตัวถูกต้องหรือไม่

การตั้งค่าเหล่านี้จะทำให้ Cluster ของคุณพร้อมรองรับการใช้งานผ่านโดเมนที่ตั้งค่าอย่างถูกต้อง



กรณ๊ใช้ Nginx 
 

หากคุณต้องการใช้ Nginx แทน HAProxy สำหรับการทำ Load Balancing ใน Cluster ของเว็บไซต์ที่มี 3 VM คุณสามารถตั้งค่าได้ตามขั้นตอนด้านล่าง:
 

โครงสร้างของ Cluster:

  • VM1: Web server 1
  • VM2: Web server 2
  • VM3: Web server 3
  • Nginx (Load Balancer): ทำหน้าที่เป็น Load Balancer เพื่อกระจายโหลดไปยัง Web servers
     

ขั้นตอนการตั้งค่า Nginx สำหรับ Load Balancing:
 

  1. ติดตั้ง Nginx บน Load Balancer: หากยังไม่ได้ติดตั้ง Nginx บน Load Balancer ให้รันคำสั่งติดตั้ง:

    bash

    sudo apt update sudo apt install nginx
     

  2. แก้ไขไฟล์คอนฟิกของ Nginx: เปิดไฟล์คอนฟิก /etc/nginx/nginx.conf หรือสร้างไฟล์ใหม่ภายใน /etc/nginx/sites-available/ และเพิ่มการตั้งค่าเพื่อทำ Load Balancing ไปยัง 3 VM

    bash

    http {
        upstream backend_servers {
            server 192.168.1.101;  # VM1
            server 192.168.1.102;  # VM2
            server 192.168.1.103;  # VM3
        }

        server {
            listen 80;
            server_name example.com;

            location / {
                proxy_pass http://backend_servers;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
            }
        }
    }

     

     

    • upstream: เป็นการกำหนดกลุ่มเซิร์ฟเวอร์ (ในที่นี้คือ 3 VM) ที่จะใช้ในการกระจายโหลด
    • proxy_pass: คำสั่งนี้จะให้ Nginx ทำหน้าที่ส่งต่อคำร้องไปยังกลุ่มเซิร์ฟเวอร์ที่กำหนดใน upstream
    • proxy_set_header: ใช้เพื่อส่งต่อ header บางตัว เช่น IP address ของผู้ใช้ หรือ protocol (HTTP/HTTPS)
       
  3. การกระจายโหลด (Load Balancing Methods): ค่าเริ่มต้นของ Nginx จะใช้ round-robin ในการกระจายโหลด แต่คุณสามารถเปลี่ยนวิธีการกระจายโหลดได้ เช่น:

    • Least Connections: ส่งคำร้องไปยังเซิร์ฟเวอร์ที่มีการใช้งานน้อยที่สุด

      bash

      upstream backend_servers { least_conn; server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; }

    • IP Hash: ให้คำร้องจาก IP เดียวกันไปยังเซิร์ฟเวอร์เดียวกัน

      
       

      bash

      upstream backend_servers { ip_hash; server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; }

  4. ตั้งค่า SSL Certificate (สำหรับ HTTPS): หากต้องการใช้ HTTPS คุณจะต้องตั้งค่า SSL Certificate เช่น Let’s Encrypt โดยสามารถใช้ certbot เพื่อตั้งค่า SSL สำหรับโดเมนของคุณ

    ตัวอย่างคอนฟิกการใช้ SSL ใน Nginx:

    
     

    bash

    server {
        listen 443 ssl;
        server_name example.com;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

     

     

  5. Restart Nginx: หลังจากทำการแก้ไขไฟล์คอนฟิกแล้ว ให้ทำการ restart Nginx เพื่อให้การตั้งค่ามีผล:

    bash

    sudo systemctl restart nginx

     

การจัดการ DNS:
 
  1. ตั้งค่า A Record ใน Cloudflare หรือบริการ DNS อื่น ๆ:

    • ชี้โดเมนของคุณไปที่ IP ของ Load Balancer (IP ของเครื่องที่รัน Nginx)
    • ถ้าต้องการใช้ www subdomain ให้สร้าง CNAME Record ชี้ไปที่โดเมนหลัก
  2. การตั้งค่า SSL ผ่าน Cloudflare: ถ้าคุณเปิดการใช้งาน Full (Strict) SSL ใน Cloudflare คุณจะต้องมีใบรับรอง SSL ทั้งใน Cloudflare และบนเซิร์ฟเวอร์ของคุณ
     

ข้อสรุป:
 

  • Nginx เป็นทางเลือกที่ดีสำหรับการทำ Load Balancing และยังรองรับการใช้ SSL/TLS ได้อย่างดี
  • วิธีการกระจายโหลดสามารถปรับเปลี่ยนได้ตามความต้องการ เช่น round-robin, least connections, หรือ IP hash
  • ต้องตั้งค่า DNS ให้ชี้ไปที่ Load Balancer และดูแลการจัดการ SSL ให้รองรับ HTTPS

 

ข้อดีและข้อเสียของ Nginx และ HAProxy:
 

1. Nginx
 

ข้อดี:

  • เว็บเซิร์ฟเวอร์และ Load Balancer: Nginx ทำหน้าที่ได้ทั้งเป็นเว็บเซิร์ฟเวอร์และ Load Balancer ซึ่งสะดวกสำหรับการตั้งค่าเว็บแอปพลิเคชัน
  • รองรับ SSL/TLS ง่าย: การจัดการ SSL/TLS ใน Nginx เป็นเรื่องที่ทำได้ง่าย และสามารถรวมเข้ากับระบบอย่างเช่น Let’s Encrypt ได้ง่ายดาย
  • Reverse Proxy และ Caching: Nginx มีความสามารถในการจัดการ reverse proxy และ caching ที่ดี ทำให้สามารถเพิ่มประสิทธิภาพเว็บไซต์ได้โดยลดการโหลดบนเซิร์ฟเวอร์ backend
  • รองรับ Static Content: Nginx มีประสิทธิภาพดีในการให้บริการเนื้อหาแบบ static เช่น CSS, JavaScript, รูปภาพ

ข้อเสีย:

  • Load Balancing Features จำกัด: แม้ว่า Nginx จะรองรับ Load Balancing หลายแบบ เช่น round-robin และ least connections แต่การตั้งค่าบางอย่างไม่ยืดหยุ่นเท่า HAProxy (เช่น การตรวจสอบสถานะของเซิร์ฟเวอร์)
  • การดูแลปรับแต่งขั้นสูง: สำหรับการตั้งค่า Load Balancing ขนาดใหญ่ที่ต้องการการปรับแต่งละเอียด Nginx อาจจะไม่ยืดหยุ่นเท่าที่ควรเมื่อเทียบกับ HAProxy
     

ต้นทุนการดูแลรักษา:

  • เนื่องจาก Nginx เป็นทั้งเว็บเซิร์ฟเวอร์และ Load Balancer ทำให้ไม่ต้องใช้ซอฟต์แวร์แยกกันสำหรับหน้าที่เหล่านี้ ลดต้นทุนในการดูแลและปรับแต่ง
  • การจัดการ SSL บน Nginx ทำได้ง่ายจึงลดเวลาในการบำรุงรักษา
     

2. HAProxy

ข้อดี:

  • Load Balancing เฉพาะทาง: HAProxy เป็นเครื่องมือที่เน้นการทำ Load Balancing โดยเฉพาะ รองรับการทำงานแบบ Layer 4 (TCP) และ Layer 7 (HTTP/HTTPS) อย่างมีประสิทธิภาพ
  • การตรวจสอบสุขภาพเซิร์ฟเวอร์ (Health Checks): HAProxy มีการตรวจสอบสถานะของเซิร์ฟเวอร์ backend อย่างละเอียด และสามารถตั้งค่า failover ได้อย่างง่ายดาย
  • ปรับแต่งขั้นสูง: HAProxy รองรับการปรับแต่งเชิงลึกสำหรับ Load Balancing เช่น การกำหนดกฎการจราจรที่ซับซ้อน การจัดการกับ session persistence และการกำหนด weight ให้กับเซิร์ฟเวอร์แต่ละตัว
  • ประสิทธิภาพสูง: HAProxy สามารถจัดการปริมาณการเชื่อมต่อได้มาก เหมาะสำหรับระบบที่ต้องการรองรับการใช้งานหนัก
     

ข้อเสีย:

  • ไม่ใช่เว็บเซิร์ฟเวอร์: HAProxy ไม่สามารถทำหน้าที่เป็นเว็บเซิร์ฟเวอร์ได้ ซึ่งหมายความว่าคุณจะต้องใช้ซอฟต์แวร์อื่นเช่น Nginx หรือ Apache สำหรับการจัดการเนื้อหา static หรือการให้บริการเว็บแอปพลิเคชัน
  • ตั้งค่า SSL ซับซ้อนกว่า: การจัดการ SSL ใน HAProxy อาจซับซ้อนกว่า Nginx เล็กน้อย โดยเฉพาะการจัดการหลายโดเมนหรือต้องการใช้งาน TLS termination
     

ต้นทุนการดูแลรักษา:

  • HAProxy ต้องการการตั้งค่าซับซ้อนมากกว่าเล็กน้อย โดยเฉพาะในเรื่องของการตรวจสอบเซิร์ฟเวอร์และการทำ failover
  • การจัดการ SSL ใน HAProxy ต้องการการปรับแต่งมากกว่า และอาจต้องใช้เวลามากขึ้นในการดูแลรักษา
     

การสรุปเปรียบเทียบ:
 

คุณลักษณะ Nginx HAProxy
Load Balancing ใช้งานง่าย แต่มีตัวเลือกจำกัด รองรับ Load Balancing เชิงลึกและการปรับแต่งขั้นสูง
รองรับ SSL/TLS ตั้งค่าง่าย เหมาะสำหรับเว็บไซต์ทั่วไป การตั้งค่า SSL ซับซ้อนกว่า
การจัดการสุขภาพของเซิร์ฟเวอร์ มี แต่ไม่ละเอียดเท่า HAProxy ตรวจสอบสุขภาพเซิร์ฟเวอร์ได้อย่างมีประสิทธิภาพ
การปรับแต่ง ใช้งานง่ายสำหรับผู้ที่ไม่ต้องการความซับซ้อน ปรับแต่งได้ละเอียด เหมาะสำหรับการใช้งานขนาดใหญ่
ต้นทุนการดูแล ต่ำกว่า เพราะรวมเว็บเซิร์ฟเวอร์และ Load Balancer ในตัวเดียว สูงกว่า เพราะต้องใช้ซอฟต์แวร์หลายตัวสำหรับฟังก์ชันที่ต่างกัน
 

ข้อสรุป:
 

  • Nginx เหมาะกับการใช้งานทั่วไปที่ต้องการความสะดวกและง่ายในการตั้งค่า รวมถึงสามารถทำงานเป็นเว็บเซิร์ฟเวอร์และ Load Balancer ได้ในตัวเดียว
  • HAProxy เหมาะสำหรับระบบที่ต้องการการปรับแต่งขั้นสูงและความสามารถในการตรวจสอบสถานะเซิร์ฟเวอร์อย่างละเอียด