HAProxy: ‘Cân’ tải Web Production trên Ubuntu từ A-Z (Layer 7)

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Cài nhanh HAProxy trong 5 phút

Nếu bạn cần một bộ điều hướng traffic hoạt động ngay để chạy test, đây là lộ trình ngắn nhất. Mình thường dùng cách này để kiểm tra thông suốt đường truyền trước khi nhúng tay vào đống cấu hình phức tạp.

1. Cài đặt

sudo apt update
sudo apt install haproxy -y

2. Cấu hình Load Balancing cơ bản

Mở file cấu hình bằng lệnh:

sudo nano /etc/haproxy/haproxy.cfg

Dán đoạn code sau vào cuối file. Đừng quên thay IP 192.168.1.10192.168.1.11 bằng địa chỉ IP thực tế của các node backend:

frontend http_front
    bind *:80
    default_backend web_servers

backend web_servers
    balance roundrobin
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

3. Kích hoạt dịch vụ

sudo systemctl restart haproxy

Xong! Giờ hãy thử truy cập IP của server HAProxy. Bạn sẽ thấy lưu lượng được phân phối luân phiên sang hai máy chủ phía sau.

Tại sao lại chọn HAProxy cho Layer 7?

Ngày trước mình hay tự hỏi: Nginx cũng làm được Load Balancer, tại sao phải cài thêm HAProxy? Câu trả lời nằm ở sự chuyên hóa. HAProxy được thiết kế chỉ để làm một việc duy nhất: Điều phối. Nó có thể xử lý hàng chục nghìn kết nối đồng thời mà tốn cực ít tài nguyên CPU.

Sức mạnh của Layer 7 (Application Layer)

Hãy coi HAProxy như một người điều phối thông minh. Ở Layer 4, nó chỉ biết IP và Port. Nhưng ở Layer 7, nó có thể “soi” sâu vào gói tin HTTP để biết khách hàng đang yêu cầu gì.

Ví dụ thực tế: Bạn có thể đẩy toàn bộ request ảnh (.jpg, .png) sang một cụm server chuyên lưu trữ, còn các request API tính toán nặng thì đẩy sang một cụm server có CPU khủng hơn. Layer 4 hoàn toàn không làm được chuyện này.

Ba trụ cột trong cấu hình

  • Frontend: Cổng đón khách. Nơi bạn định nghĩa IP, Port và các chứng chỉ SSL.
  • Backend: Đội ngũ phục vụ. Đây là nhóm các server thực tế xử lý logic ứng dụng.
  • ACL (Access Control List): Bộ lọc điều kiện. Dựa vào đây để quyết định khách nào đi vào backend nào.

Cấu hình thực chiến cho môi trường Production

Khi đưa vào hệ thống thực tế chạy cho khách hàng, cấu hình “Quick start” phía trên là chưa đủ. Bạn cần các công cụ giám sát để không phải thức đêm trực hệ thống.

1. Dashboard giám sát (Stats)

HAProxy tích hợp sẵn một trang dashboard trực quan. Nó cho bạn biết server nào đang “sống khỏe”, server nào đang quá tải hoặc bị treo. Thêm đoạn này vào file cấu hình:

listen stats
    bind *:8080
    stats enable
    stats uri /stats
    stats refresh 30s
    stats auth admin:password_cuc_kho  # Hãy đổi mật khẩu ngay

Truy cập http://IP_CUA_BAN:8080/stats để theo dõi biểu đồ real-time.

2. Health Check: Đảm bảo backend luôn sạch

Đừng chỉ kiểm tra xem cổng 80 có mở không, vì đôi khi web server vẫn chạy nhưng ứng dụng bên trong đã treo (lỗi 500). Mình thường cấu hình HAProxy gửi một request HTTP thực thụ để kiểm tra:

backend web_servers
    balance leastconn # Server nào ít khách nhất thì đẩy vào
    option httpchk GET /health_check.php
    http-check expect status 200
    server web1 192.168.1.10:80 check inter 2s fall 3 rise 2
    server web2 192.168.1.11:80 check inter 2s fall 3 rise 2

Thông số inter 2s nghĩa là cứ 2 giây kiểm tra một lần. Nếu hỏng 3 lần (fall 3), HAProxy sẽ gạch tên server đó khỏi danh sách phục vụ để tránh khách gặp lỗi.

Vấn đề thường gặp và cách xử lý

Dưới đây là hai lỗi kinh điển mà hầu như ai mới cài HAProxy lần đầu cũng mắc phải.

Mất IP thật của khách hàng

Mặc định, web server backend chỉ nhìn thấy IP của con HAProxy. Điều này khiến việc thống kê lượt truy cập hoặc chặn spam trở nên vô nghĩa. Để sửa lỗi này, hãy thêm option forwardfor.

backend web_servers
    option forwardfor
    # Đừng quên cấu hình real_ip ở phía Nginx/Apache backend

Sticky Sessions: Giữ chân khách hàng

Nếu ứng dụng của bạn lưu session trên server (không dùng Redis), khách đang đăng nhập ở server 1 mà bị đẩy sang server 2 sẽ bị văng ra ngay. Cách giải quyết đơn giản nhất là dùng cookie định danh:

backend web_servers
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server web1 192.168.1.10:80 check cookie s1
    server web2 192.168.1.11:80 check cookie s2

HAProxy sẽ đính một mẩu cookie nhỏ vào trình duyệt để đảm bảo lần tới khách quay lại, họ vẫn gặp đúng server cũ.

Lời kết

Triển khai HAProxy không quá khó, cái khó là làm sao để cấu hình chịu được tải lớn và ổn định. Một mẹo nhỏ: Luôn chạy lệnh haproxy -c -f /etc/haproxy/haproxy.cfg để check lỗi cú pháp trước khi restart. Một dấu phẩy đặt sai chỗ cũng có thể làm sập toàn bộ hệ thống của bạn đấy!

Share: