
HAProxy là gì: Cân bằng tải và reverse proxy cho hệ thống
HAProxy là phần mềm cân bằng tải và reverse proxy mã nguồn mở chạy ở tầng TCP và HTTP. Nó đứng trước nhiều máy chủ ứng dụng để chia tải, kiểm tra sức khỏe, kết thúc TLS và ghi log chi tiết, giúp hệ thống chịu tải lớn mà không cần sửa mã ứng dụng.
HAProxy hoạt động ở đâu trong kiến trúc
Trong kiến trúc nhiều server, client không kết nối thẳng vào ứng dụng mà đi qua một địa chỉ duy nhất. HAProxy nhận kết nối, quyết định server phù hợp theo thuật toán đã cấu hình, rồi chuyển tiếp. Nhờ đó bạn có thể thêm hoặc gỡ server mà không đổi cấu hình phía client.

Các thuật toán cân bằng tải phổ biến
| Thuật toán | Cách chọn server | Khi nào dùng |
|---|---|---|
| roundrobin | Luân phiên theo thứ tự | Các server có năng lực giống nhau |
| leastconn | Server ít kết nối nhất | Phiên dài, request thời gian không đồng đều |
| source | Băm địa chỉ IP client | Cần dán dữ liệu theo phiên |
| hdr | Băm theo header, ví dụ cookie | Sticky session mềm cho ứng dụng web |
| random | Ngẫu nhiên theo trọng số | Hạ tầng đồng nhất, tránh thiên lệch lịch |
Biểu thức băm nâng cao chỉ cần một chỉnh sửa: balance hdr(X-API-Key) giúp định tuyến theo khoá API mà không cần cấu hình thêm phía ứng dụng.
Kiểm tra sức khỏe: cổng HTTP và bản ghi log
HAProxy loại server hỏng khỏi vòng xoay bằng cách kiểm tra định kỳ. Bạn có thể dùng kiểm tra kiểu TCP đơn giản hoặc kiểm tra HTTP kiểu httpchk GET /healthz để chắc chắn ứng dụng thực sự sẵn sàng nhận việc, không chỉ còn mở cổng.
Ngoài check cơ bản, có thể dùng check expect status 200 để bắt đúng mã HTTP mong muốn, và rise / fall để điều chỉnh số lần thành công hoặc thất bại liên tiếp trước khi đánh dấu server. Mặc định rise 2 và fall 3, tức phải có 2 lần thành công liên tiếp để đưa server trở lại, và 3 lần thất bại để loại ra.
Ví dụ cấu hình tối thiểu
global
daemon
maxconn 20000
stats socket /var/run/haproxy.sock mode 660 level admin
defaults
log global
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend public_http
bind *:80
bind *:443 ssl crt /etc/letsencrypt/live/domain.pem alpn h2,http/1.1
default_backend app_servers
backend app_servers
balance leastconn
option httpchk GET /healthz
http-check expect status 200
server node1 10.0.1.11:8080 check rise 2 fall 3
server node2 10.0.1.12:8080 check
server node3 10.0.1.13:8080 check backup
Kiểm tra cấu hình trước khi nạp lại bằng haproxy -c -f /etc/haproxy/haproxy.cfg. Nếu có lỗi cú pháp, lệnh sẽ in ra dòng lỗi mà không đụng tới dịch vụ đang chạy.
Giám sát với trang thống kê tích hợp
Bật stats enable và stats uri /stats để có giao diện web xem tức thời số kết nối, tỷ lệ lỗi 5xx, dung lượng hàng đợi và trạng thái của từng server. Nên giới hạn truy cập trang này bằng ACL theo IP nội bộ.

Để lấy số liệu theo thời gian, chỉ cần gọi socket quản trị bằng echo "show stat" | socat stdio /var/run/haproxy.sock rồi đưa vào Prometheus hay file CSV để vẽ đồ thị. Dữ liệu gồm số phiên hiện tại, tổng số phiên, byte nhận và gửi, thời gian chờ trong hàng đợi, tỷ lệ lỗi trên từng backend.
Bảo mật và vận hành
- Kết thúc TLS ngay tại HAProxy bằng chứng thư Let’s Encrypt rồi chuyển tiếp HTTP nội bộ, tránh mã hóa hai lần không cần thiết.
- Bật
http-server-closehoặctcp-modeđể không giữ kết nối đến server đã chết. - Giới hạn tốc độ bằng
limit_reqtrong frontend để chặn flood và tấn công brute force. - Theo dõi chỉ số
be_sess_during_backend_dnvàcheck_failsđể phát hiện server chết mà không ai hay biết.
Khi nào chọn HAProxy và khi nào không
HAProxy hợp với hệ thống cần cân bằng tải ở tầng TCP hoặc HTTP thuần, nhiều backend không đồng nhất, và yêu cầu giám sát chi tiết. Nó không phải lựa chọn tốt nếu ứng dụng của bạn cần định tuyến theo nội dung request, chẩn đoán phân tán phức tạp hay cấu hình dựa trên YAML sinh tự động. Trong những trường hợp đó, Nginx hoặc Envoy thường hợp lý hơn.
| Tiêu chí | HAProxy | Nginx |
|---|---|---|
| Hiệu năng tối đa trên tầng L4 | Rất tốt | Khá tốt |
| Phục vụ file tĩnh | Không chuyên | Rất tốt |
| Thống kê chi tiết theo phiên | Rất tốt | Ổn |
| Protocol mới như HTTP/3, gRPC | Hỗ trợ ở mức cơ bản | Hỗ trợ tốt |
| Độ khó cấu hình | Trung bình | Dễ hơn |

Trên thực tế nhiều hệ thống dùng cả hai cùng lúc: HAProxy ở tầng TCP để phân tán kết nối, Nginx phía trên để phục vụ tài nguyên tĩnh và xử lý định tuyến theo tên miền.
Mẹo vận hành hằng ngày
- Luôn dùng chế độ daemon và socket quản trị để nạp lại cấu hình không cần khởi động lại toàn bộ tiến trình.
- Đặt
timeout clientvàtimeout serverngắn hơn giá trị của frontend CDN để HAProxy kịp đóng kết nối treo. - Ghi log ở mức
noticecho backend down vàwarningcho lỗi, tránh ghi log mức debug trong production vì nghẽn I/O rất nhanh. - Ghi lại chỉ số vào hệ thống giám sát theo chu kỳ 10-15 giây để bắt được sự cố trước khi người dùng báo lỗi.
HAProxy nhẹ, ổn định và xử lý được hàng chục nghìn kết nối đồng thời trên một máy nhỏ. Nhiều đội vận hành dùng nó làm lớp cân bằng tải, lớp kết thúc TLS và lớp quan sát cùng lúc. Tài liệu chính thức nằm tại cấu hình HAProxy, phần hướng dẫn chính thức của dự án là HAProxy documentation. Với HAProxy kết hợp Nginx, hãy xem lại quy tắc chuyển tiếp và header ở bài hướng dẫn module proxy của Nginx để tránh cấu hình trùng vai trò.
