HAProxy Là Gì? Cân Bằng Tải Và Reverse Proxy Website
HAProxy là phần mềm mã nguồn mở chuyên cân bằng tải và làm reverse proxy cho website, API và các dịch vụ TCP. Nó đứng trước nhóm máy chủ, nhận toàn bộ kết nối rồi chia đều cho các máy phía sau. Trong bài này, ProxyVN giải thích cơ chế hoạt động, các thuật toán chia tải, file cấu hình mẫu và khi nào nên dùng HAProxy cho hệ thống.
HAProxy là gì và vai trò trong hệ thống web
HAProxy là viết tắt của High Availability Proxy, ra đời từ năm 2000 và hiện được duy trì tại trang chủ dự án HAProxy. Phần mềm viết bằng C, chạy chủ yếu trên Linux, nổi tiếng nhờ xử lý được rất nhiều kết nối đồng thời với mức tiêu thụ tài nguyên thấp.
Vị trí của HAProxy trong kiến trúc
Trong một website có nhiều máy chủ, HAProxy đứng ở lớp ngoài cùng. Người dùng chỉ biết một địa chỉ duy nhất là địa chỉ của HAProxy. Phía sau, HAProxy quyết định chuyển từng yêu cầu tới máy chủ nào, kiểm tra máy nào còn sống và loại máy lỗi ra khỏi vòng phục vụ.
Hai chế độ làm việc
- Chế độ HTTP (tầng 7): HAProxy đọc được nội dung yêu cầu như đường dẫn, header, cookie, nên có thể định tuyến theo URL, theo tên miền, hoặc giữ người dùng ở cùng một máy chủ.
- Chế độ TCP (tầng 4): HAProxy chỉ chuyển tiếp luồng byte, không đọc nội dung. Dùng cho cơ sở dữ liệu, máy chủ mail hoặc bất kỳ dịch vụ TCP nào.
Ai đang dùng HAProxy
HAProxy là một trong những bộ cân bằng tải phổ biến nhất, xuất hiện trong hạ tầng của nhiều website lớn và là thành phần mặc định ở một số nền tảng như bộ định tuyến của OpenShift. Với website vừa và nhỏ, nó cũng là lựa chọn quen thuộc khi bắt đầu tách ứng dụng ra nhiều máy chủ.
Nếu anh em chưa rõ khái niệm proxy đứng phía máy chủ, bài reverse proxy là gì là phần nền nên đọc trước.
Khác biệt giữa reverse proxy, load balancer và HAProxy
Ba khái niệm này hay bị dùng lẫn. Hiểu đúng giúp anh em biết HAProxy giải quyết được gì và không giải quyết được gì.

Reverse proxy và load balancer
Reverse proxy
Reverse proxy đứng trước máy chủ, nhận yêu cầu thay cho máy chủ và trả kết quả về cho người dùng. Nó có thể chỉ có một máy chủ phía sau. Mục đích là ẩn máy chủ thật, xử lý SSL, nén, cache hoặc lọc yêu cầu.
Load balancer
Load balancer cũng đứng trước máy chủ nhưng mục đích chính là chia tải cho nhiều máy chủ. Nó luôn cần ít nhất hai máy phía sau mới có ý nghĩa. Load balancer có thể ở tầng 4 hoặc tầng 7.
HAProxy làm được cả hai
HAProxy vừa là reverse proxy vừa là load balancer. Đây là lý do nó được chọn nhiều: một phần mềm thay cho hai lớp. Còn proxy mà người dùng thuê để đổi IP đi ra Internet là forward proxy, đứng phía người dùng, khác hẳn vai trò của HAProxy.
Khái niệm |
Đứng ở đâu |
Mục đích chính |
Ví dụ phần mềm |
|---|---|---|---|
Forward proxy |
Phía người dùng |
Đổi IP ra ngoài, kiểm soát truy cập |
Squid, proxy dân cư thuê |
Reverse proxy |
Phía máy chủ |
Ẩn máy chủ, SSL, cache |
Nginx, HAProxy, Cloudflare |
Load balancer |
Phía máy chủ |
Chia tải nhiều máy |
HAProxy, Nginx, ELB |
Squid là ví dụ tiêu biểu của forward proxy, được hướng dẫn chi tiết trong bài Squid Proxy là gì.
Cơ chế hoạt động của HAProxy
HAProxy tổ chức cấu hình quanh hai khái niệm: frontend và backend. Hiểu hai khái niệm này là hiểu được 80% file cấu hình.
Frontend nhận kết nối
Frontend khai báo HAProxy lắng nghe ở địa chỉ và cổng nào, ví dụ cổng 80 và 443. Tại đây có thể đặt luật: yêu cầu nào đi tới backend nào, chặn yêu cầu nào, thêm header gì.
Backend chứa nhóm máy chủ
Backend là danh sách máy chủ thật phía sau, kèm thuật toán chia tải và cách kiểm tra sức khỏe. Một frontend có thể chuyển yêu cầu tới nhiều backend theo luật, ví dụ /api đi backend API, phần còn lại đi backend web.
Health check loại máy lỗi
HAProxy định kỳ gửi yêu cầu kiểm tra tới từng máy chủ. Máy không trả lời đúng sau vài lần liên tiếp bị đánh dấu DOWN và không nhận yêu cầu mới. Khi máy hồi phục, HAProxy tự đưa nó trở lại. Người dùng gần như không nhận ra có máy chủ vừa gặp sự cố.
Luồng một yêu cầu
- Người dùng gửi yêu cầu tới địa chỉ của HAProxy.
- Frontend nhận yêu cầu, áp các luật ACL.
- HAProxy chọn backend phù hợp, rồi chọn một máy chủ còn sống theo thuật toán.
- Máy chủ xử lý và trả kết quả qua HAProxy về người dùng.
Các thuật toán chia tải trong HAProxy
Thuật toán quyết định yêu cầu tiếp theo đi tới máy chủ nào. Chọn sai thuật toán có thể khiến một máy quá tải trong khi máy khác rảnh.

Thuật toán phân phối tải
Round robin
Chia lần lượt cho từng máy theo vòng, có thể đặt trọng số để máy mạnh nhận nhiều hơn. Đây là thuật toán mặc định, hợp với yêu cầu ngắn và các máy cấu hình tương đương.
Leastconn
Gửi yêu cầu tới máy đang có ít kết nối nhất. Hợp với kết nối dài như WebSocket, cơ sở dữ liệu, hoặc yêu cầu có thời gian xử lý chênh lệch nhiều.
Source
Băm IP của người dùng để luôn đưa cùng một người tới cùng một máy chủ. Hữu ích khi ứng dụng lưu phiên trên máy chủ mà không dùng cookie. Nhược điểm là nhiều người dùng sau cùng một NAT sẽ dồn vào một máy.
URI và header
Băm theo đường dẫn hoặc theo header, hợp với hệ thống cache để cùng một tài nguyên luôn được phục vụ bởi cùng một máy, tăng tỷ lệ trúng cache.
Thuật toán |
Cách chọn máy |
Hợp với |
|---|---|---|
roundrobin |
Lần lượt, có trọng số |
Yêu cầu ngắn, máy đồng đều |
leastconn |
Ít kết nối nhất |
Kết nối dài, WebSocket, DB |
source |
Băm IP nguồn |
Giữ phiên không dùng cookie |
uri |
Băm đường dẫn |
Cụm máy chủ cache |
Danh sách đầy đủ và tham số của từng thuật toán có trong tài liệu cấu hình HAProxy.
Cài đặt và cấu hình HAProxy cơ bản
Phần này dựng HAProxy chia tải cho hai máy chủ web trên Ubuntu. Đây là ví dụ triển khai chung, anh em thay IP máy chủ theo hệ thống của mình.
Bước 1: cài đặt
sudo apt update
sudo apt install -y haproxy
haproxy -v
Gói trong kho của Ubuntu thường là bản ổn định dài hạn, đủ cho phần lớn nhu cầu và được cập nhật bản vá bảo mật cùng hệ điều hành. Nếu cần bản mới hơn, có thể dùng kho PPA do cộng đồng HAProxy duy trì.
Bước 2: viết file haproxy.cfg
File cấu hình nằm ở /etc/haproxy/haproxy.cfg. Đoạn dưới khai báo frontend lắng nghe cổng 80, backend gồm hai máy chủ, thuật toán roundrobin và health check qua đường dẫn /health.
global
log /dev/log local0
maxconn 20000
user haproxy
group haproxy
defaults
mode http
log global
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend web_vao
bind *:80
default_backend web_may_chu
backend web_may_chu
balance roundrobin
option httpchk GET /health
server web1 10.0.0.11:8080 check
server web2 10.0.0.12:8080 check
Bước 3: kiểm tra và khởi động lại
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
sudo systemctl enable haproxy
Lệnh haproxy -c kiểm tra cú pháp trước khi áp dụng. Nếu có lỗi, HAProxy chỉ rõ dòng sai. Khi đổi cấu hình trên hệ thống đang chạy, dùng systemctl reload haproxy để nạp lại mà không cắt kết nối hiện có.
Bước 4: bật trang thống kê
Trang thống kê cho thấy trạng thái từng máy chủ, số kết nối và lỗi theo thời gian thực. Thêm khối dưới vào cấu hình, nhớ đổi mật khẩu và giới hạn IP được xem.
listen thong_ke
bind *:8404
stats enable
stats uri /stats
stats auth admin:doi_mat_khau_nay
Cấu hình HAProxy nâng cao thường dùng
Sau bản cơ bản, phần lớn hệ thống cần thêm SSL, định tuyến theo đường dẫn và giữ phiên. Các khối dưới đây bổ sung vào file ở trên.
Kết thúc SSL tại HAProxy
HAProxy có thể nhận HTTPS, giải mã rồi chuyển HTTP thường tới máy chủ phía sau. Máy chủ ứng dụng không phải lo chứng chỉ. File .pem gồm chứng chỉ và khóa riêng ghép lại.
frontend web_vao
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/site.pem
http-request redirect scheme https unless { ssl_fc }
default_backend web_may_chu
Định tuyến theo đường dẫn bằng ACL
ACL cho phép tách yêu cầu theo điều kiện. Ví dụ dưới đưa mọi yêu cầu bắt đầu bằng /api tới backend riêng.
frontend web_vao
acl la_api path_beg /api
use_backend api_may_chu if la_api
default_backend web_may_chu
backend api_may_chu
balance leastconn
server api1 10.0.0.21:9000 check
server api2 10.0.0.22:9000 check
Giữ người dùng ở cùng máy chủ bằng cookie
Với ứng dụng lưu phiên trên máy chủ, HAProxy có thể chèn cookie để nhớ người dùng thuộc máy nào.
backend web_may_chu
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 10.0.0.11:8080 check cookie w1
server web2 10.0.0.12:8080 check cookie w2
Giữ IP thật của người dùng
Khi đi qua HAProxy, máy chủ phía sau chỉ thấy IP của HAProxy. Ở chế độ HTTP, thêm option forwardfor để HAProxy gửi kèm header X-Forwarded-For chứa IP thật. Ở chế độ TCP, dùng PROXY protocol, cơ chế được giải thích trong bài Proxy Protocol là gì.
Giới hạn tốc độ theo IP
HAProxy có bảng theo dõi stick-table, dùng để đếm số yêu cầu của mỗi IP và chặn IP gửi quá nhiều. Đây là lớp chống tấn công làm ngập yêu cầu đơn giản mà hiệu quả.
frontend web_vao
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
Đoạn trên trả mã 429 cho IP gửi quá 100 yêu cầu trong 10 giây. Ngưỡng cần chỉnh theo lưu lượng thật của website.
Lợi ích khi triển khai HAProxy
Gom lại, HAProxy mang tới năm lợi ích chính cho hệ thống có từ hai máy chủ trở lên.

Tính khả dụng cao khi máy chủ lỗi
- Tính sẵn sàng cao: máy chủ lỗi bị loại tự động, website vẫn chạy trên các máy còn lại.
- Mở rộng dễ dàng: thêm máy chủ chỉ cần thêm một dòng server vào backend.
- Hiệu năng cao: xử lý hàng chục nghìn kết nối đồng thời với tài nguyên khiêm tốn.
- Bảo mật lớp ngoài: ẩn máy chủ thật, giới hạn tốc độ, chặn yêu cầu xấu bằng ACL.
- Quan sát tốt: trang thống kê và log chi tiết cho từng yêu cầu.
Loại bỏ điểm lỗi đơn
Một HAProxy duy nhất lại trở thành điểm lỗi đơn mới. Hệ thống quan trọng thường chạy hai HAProxy cùng một địa chỉ IP ảo, dùng Keepalived để chuyển IP sang máy dự phòng khi máy chính gặp sự cố. Đây là mô hình sẵn sàng cao kinh điển.
Bảo trì không gián đoạn
Nhờ health check, anh em có thể tạm đưa một máy chủ ra khỏi vòng phục vụ để nâng cấp, rồi đưa lại mà người dùng không bị ảnh hưởng.
HAProxy không làm ứng dụng nhanh hơn, nhưng giúp ứng dụng tiếp tục chạy khi một máy chủ gặp sự cố.
Khi nào nên dùng HAProxy cho hệ thống
Không phải website nào cũng cần HAProxy. Với một máy chủ duy nhất và lượng truy cập vừa phải, thêm HAProxy chỉ tăng độ phức tạp.
Nên dùng khi
- Website hoặc API chạy trên từ hai máy chủ trở lên.
- Cần chuyển đổi dự phòng tự động khi một máy chủ chết.
- Cần cân bằng tải TCP cho cơ sở dữ liệu, Redis, máy chủ mail.
- Cần định tuyến phức tạp theo tên miền, đường dẫn, header.
Có thể chưa cần khi
- Chỉ có một máy chủ và lưu lượng ổn định.
- Đã dùng dịch vụ cân bằng tải của nhà cung cấp đám mây đáp ứng đủ.
- Chỉ cần SSL và cache cho một máy chủ, khi đó Nginx có thể gọn hơn.
HAProxy hay Nginx
Nginx là máy chủ web kiêm reverse proxy, mạnh ở phục vụ file tĩnh và cache. HAProxy chuyên về cân bằng tải, mạnh ở health check, thuật toán chia tải và giám sát. Nhiều hệ thống dùng cả hai: HAProxy ở ngoài cùng chia tải, Nginx trên từng máy phục vụ nội dung.
Khi phân vân, hãy nhìn vào việc chính cần làm. Nếu việc chính là phục vụ website trên một máy và thêm SSL, Nginx gọn hơn. Nếu việc chính là giữ cho nhiều máy chủ cùng chạy ổn định, theo dõi từng máy và chuyển tải khi có sự cố, HAProxy là công cụ chuyên dụng hơn.
Kết hợp HAProxy với các công cụ khác
HAProxy thường là một mắt xích trong kiến trúc nhiều lớp. Biết vị trí của nó giúp thiết kế hệ thống hợp lý hơn.

Kiến trúc nhiều lớp với HAProxy
Đi sau CDN
Website dùng Cloudflare thì luồng là người dùng, Cloudflare, rồi HAProxy, rồi máy chủ ứng dụng. Cloudflare lo chống DDoS và cache ở biên, HAProxy lo chia tải trong trung tâm dữ liệu. Vai trò của Cloudflare được giải thích trong bài Cloudflare reverse proxy và bài proxy Cloudflare là gì.
Trong kiến trúc microservice
Với hệ thống nhiều dịch vụ nhỏ, HAProxy có thể làm cổng vào chung, còn giao tiếp giữa các dịch vụ do service mesh đảm nhận. Mô hình này được mô tả trong bài service mesh proxy.
Với Kubernetes
HAProxy có bản Ingress Controller cho Kubernetes, nhận cấu hình từ tài nguyên Ingress thay vì file haproxy.cfg viết tay. Cách làm này hợp với đội đã quen HAProxy và muốn giữ cùng công cụ khi chuyển sang container.
Khác với proxy đổi IP
HAProxy cân bằng tải phía máy chủ; còn khi cần IP đi ra cho công cụ hay tài khoản, anh em có thể mua proxy tại ProxyVN.
Mô hình sẵn sàng cao với hai máy HAProxy
Như đã nhắc ở trên, một HAProxy đơn lẻ là điểm lỗi đơn. Phần này mô tả cách chạy hai máy HAProxy chung một IP ảo để khi máy chính chết, máy phụ nhận thay trong vài giây.
Nguyên lý IP ảo
Hai máy HAProxy cấu hình giống hệt nhau. Phần mềm Keepalived chạy trên cả hai, dùng giao thức VRRP để thống nhất máy nào đang giữ IP ảo. Người dùng và tên miền chỉ trỏ tới IP ảo. Khi máy chính mất tín hiệu, Keepalived trên máy phụ tự nhận IP ảo về mình.
Cấu hình Keepalived mẫu
Trên máy chính, file /etc/keepalived/keepalived.conf có dạng dưới. Máy phụ dùng state BACKUP và priority thấp hơn. Đây là ví dụ triển khai chung, tên card mạng và IP ảo thay theo hệ thống.
vrrp_script kiem_tra_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
virtual_ipaddress {
10.0.0.100
}
track_script {
kiem_tra_haproxy
}
}
Khối track_script giúp IP ảo chuyển sang máy phụ không chỉ khi máy chính tắt hẳn mà cả khi tiến trình HAProxy trên máy chính ngừng chạy.
Lưu ý khi vận hành hai máy
Hai máy phải luôn có cùng file haproxy.cfg. Nhiều đội dùng công cụ quản lý cấu hình hoặc script đồng bộ để không quên cập nhật máy phụ. Nên thử tắt máy chính định kỳ trong giờ thấp điểm để chắc cơ chế chuyển đổi vẫn hoạt động.
Giám sát và đọc log HAProxy
HAProxy ghi log rất chi tiết cho từng yêu cầu. Biết đọc log giúp anh em tìm ra máy chủ chậm, lỗi phía ứng dụng hay lỗi phía người dùng.
Các trường quan trọng trong log HTTP
Với option httplog, mỗi dòng log gồm IP người dùng, frontend, backend, máy chủ đã phục vụ, các mốc thời gian, mã trạng thái, dung lượng và đường dẫn. Phần thời gian thường có dạng năm số cách nhau bằng dấu gạch chéo, lần lượt là thời gian nhận yêu cầu, thời gian chờ trong hàng đợi, thời gian kết nối tới máy chủ, thời gian máy chủ phản hồi và tổng thời gian.
Đọc nhanh nguyên nhân chậm
- Thời gian chờ hàng đợi cao: backend quá tải, cần thêm máy chủ hoặc tăng maxconn.
- Thời gian kết nối cao: mạng giữa HAProxy và máy chủ có vấn đề.
- Thời gian phản hồi của máy chủ cao: ứng dụng xử lý chậm, cần kiểm tra mã nguồn hoặc cơ sở dữ liệu.
Kết nối với hệ thống giám sát
HAProxy bản mới có sẵn điểm xuất số liệu cho Prometheus, giúp vẽ biểu đồ số kết nối, tỷ lệ lỗi và thời gian phản hồi theo từng backend. Đặt cảnh báo khi một máy chủ chuyển sang DOWN hoặc khi tỷ lệ lỗi 5xx vượt ngưỡng là cách phát hiện sự cố sớm nhất.
Tình huống minh họa khi dùng HAProxy
Phần này mô phỏng một website bán hàng chuẩn bị cho đợt khuyến mãi lớn. Đây là ví dụ minh họa cách lập luận, không phải số liệu khách hàng.
Bối cảnh
Website chạy trên một máy chủ, ngày thường ổn định nhưng các đợt sale trước từng bị chậm và sập trong giờ cao điểm. Đội kỹ thuật quyết định tách ứng dụng ra ba máy chủ và đặt HAProxy phía trước.
Cách triển khai
Đội dựng hai HAProxy với Keepalived, backend web gồm ba máy chủ theo roundrobin, backend API dùng leastconn vì các yêu cầu thanh toán có thời gian xử lý dài hơn. Health check trỏ tới đường dẫn kiểm tra cả kết nối cơ sở dữ liệu, để máy chủ mất kết nối cơ sở dữ liệu cũng bị loại. Stick-table giới hạn số yêu cầu mỗi IP để chặn bot săn hàng làm ngập hệ thống.
Bài học
Trước đợt sale, đội chạy thử tải và tắt lần lượt từng máy chủ để chắc HAProxy chuyển tải đúng. Trong đợt sale, trang thống kê cho thấy một máy chủ bị loại do lỗi bộ nhớ, nhưng website vẫn chạy trên hai máy còn lại. Giá trị của HAProxy nằm ở chỗ sự cố xảy ra mà người dùng không nhận ra.
Về khái niệm cân bằng tải nói chung, anh em có thể đọc thêm bài giải thích cân bằng tải của Cloudflare.
Lỗi thường gặp khi vận hành HAProxy
Phần lớn sự cố HAProxy đến từ cấu hình chứ không phải từ phần mềm. Dưới đây là các lỗi hay gặp và cách xử lý.
Lỗi 503 Service Unavailable
HAProxy trả 503 khi không còn máy chủ nào trong backend ở trạng thái UP. Mở trang thống kê xem máy nào DOWN, rồi kiểm tra đường dẫn health check có trả mã 200 không. Lỗi này được giải thích kỹ trong bài lỗi 503 Service Unavailable.
Lỗi 504 Gateway Timeout
Máy chủ phía sau xử lý lâu hơn timeout server. Tăng timeout server cho đúng backend cần chạy lâu, không tăng chung cho mọi backend. Các hướng khắc phục khác có trong bài 504 gateway timeout.
Máy chủ phía sau chỉ thấy IP của HAProxy
Thiếu option forwardfor hoặc ứng dụng chưa đọc header X-Forwarded-For. Bật tùy chọn ở HAProxy và cấu hình ứng dụng tin tưởng header từ IP của HAProxy.
Cấu hình lỗi làm dịch vụ không khởi động
Luôn chạy haproxy -c trước khi reload. Giữ bản sao cấu hình cũ để quay lại nhanh khi cần.
Câu hỏi thường gặp về HAProxy
HAProxy có miễn phí không?
Có. HAProxy Community là mã nguồn mở, miễn phí. Bản Enterprise có thêm tính năng và hỗ trợ thương mại.
HAProxy có phục vụ file tĩnh như Nginx không?
Không. HAProxy chỉ chuyển tiếp yêu cầu, không phục vụ file từ ổ đĩa. Cần máy chủ web phía sau để trả nội dung.
HAProxy có dùng để đổi IP như proxy thuê được không?
Không phải mục đích chính. HAProxy là reverse proxy phía máy chủ. Muốn đổi IP đi ra Internet, cần forward proxy như proxy dân cư hoặc datacenter.
HAProxy có cân bằng tải cho cơ sở dữ liệu được không?
Được, ở chế độ TCP. Ví dụ phổ biến là chia kết nối đọc cho nhiều bản sao MySQL hoặc PostgreSQL, kèm health check kiểm tra máy nào đang là bản chính. Với cơ sở dữ liệu, thuật toán leastconn thường hợp hơn roundrobin vì kết nối kéo dài.
Có cần học lập trình để dùng HAProxy không?
Không. Cấu hình HAProxy là file văn bản với cú pháp riêng, đọc khá dễ sau khi nắm frontend, backend và ACL. Kiến thức cần có là Linux cơ bản, mạng và HTTP. Bắt đầu với file mẫu trong bài rồi thêm dần từng tính năng là cách học nhanh nhất.
Một HAProxy chịu được bao nhiêu kết nối?
Tùy phần cứng và cấu hình, nhưng một máy chủ phổ thông xử lý được hàng chục nghìn kết nối đồng thời. Giới hạn đặt bằng tham số maxconn.
Xem thêm:
Kết luận
HAProxy là lựa chọn mạnh khi website hoặc API cần chia tải cho nhiều máy chủ, tự loại máy lỗi và định tuyến linh hoạt. Hãy bắt đầu bằng cấu hình tối giản, bật health check và trang thống kê trước khi mở rộng. Cần tư vấn thêm về proxy, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam khi triển khai HAProxy.