Trong bài viết này, chúng tôi sẽ hướng dẫn cách cấu hình HAProxy đóng vai trò load balancer cho hai máy chủ web Nginx (bạn có thể thay thế bằng Apache). Hệ điều hành CentOS được sử dụng trong tất cả các trường hợp.
HAProxy là phần mềm máy chủ cung cấp tính sẵn sàng cao (high availability) và cân bằng tải cho các ứng dụng TCP và HTTP bằng cách phân phối các yêu cầu đến giữa nhiều máy chủ backend. HAProxy được sử dụng trên nhiều trang web nổi tiếng như Twitter, Instagram, GitHub, Amazon, v.v.
HAProxy được cài đặt trên một máy chủ riêng biệt, nhận yêu cầu từ client và chuyển hướng chúng đến các máy chủ web Nginx. Bạn có thể xem kiến trúc hệ thống tổng quát dưới đây:

Cấu hình Nginx trên các máy chủ Backend
Chúng ta bắt đầu bằng việc cài đặt và cấu hình Nginx trên các máy chủ web nơi tải trọng sẽ được cân bằng. Cài đặt kho EPEL và nginx bằng yum (hoặc dnf trên RHEL/CentOS 8):
# yum install epel-release -y
# yum install nginx -y
Sau đó, trong file nginx.conf, chỉ định rằng các máy chủ chỉ xử lý yêu cầu từ máy chủ HAProxy và các máy chủ backend:
Máy chủ Backend 1:
server {
listen current_server_IP_address:80 default_server;
allow second_backend_server_IP_address;
allow IP_haproxy;
deny all;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / { }
}
Máy chủ Backend 2:
server {
listen current_server_IP_address:80 default_server;
allow first_backend_server_IP_address;
allow IP_haproxy;
deny all;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / { }
}
File cấu hình nginx về cơ bản là mặc định, chúng ta chỉ thêm chỉ thị listen IP và từ chối truy cập từ mọi người trừ các máy chủ của chúng ta bằng các chỉ thị allow và deny.
Để máy chủ web có thể hoạt động, hãy mở cổng HTTP trên tường lửa bằng firewalld hoặc iptables:
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
Thực hiện kiểm tra thử trên bất kỳ máy chủ backend nào:
# curl IP_of_the_second_server
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> here you will get an html file
Máy chủ trả về file index nginx chuẩn. Để kiểm tra thuận tiện hơn, tôi đã thay đổi nội dung file index trên mỗi máy chủ backend để thấy trong trình duyệt máy chủ nào đã xử lý yêu cầu hiện tại.
File index của nginx nằm ở /usr/share/nginx/html/.
Cấu hình Load Balancer HAProxy
Hãy cài đặt và cấu hình HAProxy trên máy chủ sẽ đóng vai trò load balancer.
Cài đặt HAProxy:
# yum install epel-release -y
# yum install haproxy -y
Running transaction Installing : haproxy-1.5.18-9.el7.x86_64 1/1 Verifying : haproxy-1.5.18-9.el7.x86_64 1/1 Installed: haproxy.x86_64 0:1.5.18-9.el7 Complete!
Để kích hoạt HAProxy, bạn cần thêm Enabled=1 vào file /etc/default/haproxy:
# nano /etc/default/haproxy

Bây giờ chuyển sang cấu hình HAProxy. Trong cấu hình đơn giản nhất, máy chủ load balancer sẽ xử lý tất cả yêu cầu HTTP và gửi lần lượt đến các máy chủ backend:
# nano /etc/haproxy/haproxy.cfg
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend www
bind balancer_IP_address:80
default_backend nginx_pool
backend nginx_pool
balance roundrobin
mode http
server web1 IP_of_the_first_backend_server:80 check
server web2 IP_of_the_second_backend_server:80 check
Sau khi lưu cấu hình, hãy kiểm tra cú pháp haproxy.cfg:
# haproxy -f /etc/haproxy/haproxy.cfg -c
Nếu OK, bạn sẽ nhận được thông báo:
Configuration file is valid
Sau đó khởi động lại HAProxy và thêm vào khởi động cùng hệ thống. Và mở cổng HTTP trên tường lửa:
# systemctl restart haproxy
# systemctl enable haproxy
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
Vậy là load balancer đã được cấu hình. Hãy kiểm tra bằng cách mở địa chỉ IP máy chủ HAProxy trong trình duyệt:

Như bạn thấy, cả hai máy chủ đều trả về nội dung lần lượt, chứng tỏ balancer đang hoạt động.
Các tham số trong file cấu hình Haproxy.cfg
Hãy xem xét các thuật toán cân bằng tải chính của HAProxy:
roundrobin— thuật toán mặc định, gửi yêu cầu đến các máy chủ lần lượt. Chúng ta đã sử dụng phương pháp này trong ví dụ.leastconn— chọn máy chủ có số lượng kết nối hoạt động ít nhất. Khuyên dùng cho các dự án sử dụng session kéo dài.source— chọn máy chủ dựa trên hash của địa chỉ IP người dùng. Ở chế độ này, client sẽ kết nối cùng một web server nếu địa chỉ IP không thay đổi.
Mô tả một số tham số trong file cấu hình.
Khối global:
log— ghi log vào /dev/log với giá trị đối tượng local0chroot— cài đặt bảo mật, khóa HAProxy vào thư mục chỉ địnhmaxconn— số lượng kết nối đồng thời tối đa cho mỗi tiến trìnhdaemon— chạy tiến trình dưới dạng daemon
Khối defaults. Khối này đặt các tham số mặc định cho tất cả các phần theo sau:
log— thiết lập log nào được ghi (ở đây global nghĩa là dùng tham số từ phần global)mode— thiết lập giao thức giao tiếp: tcp, http hoặc healthretries— số lần thử kết nối lại server khi thất bạioption httplog— định dạng log khi HAProxy proxy cho HTTPoption redispatch— cho phép chấm dứt và chuyển hướng lại session khi server lỗicontimeout— thời gian chờ tối đa cho đến khi kết nối với server thành công
Còn nhiều tham số khác liên quan đến các loại timeout.
Thu thập thống kê HAProxy
Thêm khối stats vào file cấu hình:
listen stats
bind :10001
stats enable
stats uri /haproxy_stats
stats auth admin:admin
Mô tả:
bind– cổng để xem thống kêstats enable– bật báo cáo thống kêstats uri– đặt địa chỉ trang thống kêstats auth– đăng nhập và mật khẩu truy cập
Bạn có thể chỉ định bất kỳ cổng TCP nào bạn thích. Nếu cổng trên bận hoặc không phù hợp.
Chấp nhận kết nối đến trên cổng đã chỉ định trong tường lửa:
firewall-cmd --permanent --add-port=10001/tcp
firewall-cmd --reload
Để xem báo cáo HAProxy, truy cập đường dẫn:
https://hostname_haproxy:10001/haproxy_stats

Mở địa chỉ IP balancer trong trình duyệt và nhấn liên tục F5. Thống kê HAProxy sẽ thay đổi.
Trong bài viết này chúng ta đã xem xét cấu hình HAProxy cơ bản. Có nhiều trường hợp sử dụng module HAProxy khác.
Trong sơ đồ của chúng ta, máy chủ load balancing HAProxy trở thành điểm lỗi đơn lẻ (single point of failure). Để tăng khả năng chịu lỗi cho dịch vụ web, bạn có thể thêm một máy chủ HAProxy khác và triển khai cấu hình load balancer sẵn sàng cao (high-availability) bằng Keepalived. Bạn sẽ nhận được sơ đồ như sau:
