Tại sao mình chọn HAProxy trên Fedora?
Sau hơn 2 năm dùng Fedora làm môi trường chính, mình thấy đây là OS cân bằng cực tốt giữa tính ổn định và sự mới mẻ. Khác với CentOS hay Ubuntu LTS thường bị kẹt ở các bản cũ, Fedora Server luôn sẵn hàng HAProxy 2.8+ hoặc 3.0 trong repo chính thức. Bạn chỉ cần dnf install là có ngay các tính năng mới nhất mà không cần lọ mọ thêm repo bên thứ ba.
Điểm ăn tiền của HAProxy ở Layer 7 (Application Layer) là khả năng “soi” sâu vào HTTP Header, Cookie và URL. Nó giúp bạn điều hướng traffic cực kỳ linh hoạt thay vì chỉ chia tải mù quáng ở lớp TCP. Trong bài này, mình sẽ đi thẳng vào cấu hình thực tế và cách xử lý những lỗi SELinux “đặc sản” của dòng RedHat.
Quick Start: Chạy HAProxy trong 5 phút
Nếu bạn đang cần dựng nhanh một cụm cân bằng tải để test, hãy thực hiện 3 bước thần tốc này.
1. Cài đặt HAProxy
sudo dnf install haproxy -y
2. Cấu hình tối giản
Mở file /etc/haproxy/haproxy.cfg. Xóa hết nội dung cũ và dán đoạn này vào (thay IP backend tương ứng):
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 enable --now haproxy
Về lý thuyết là xong. Tuy nhiên, nếu bạn truy cập mà thấy lỗi 503 hoặc timeout, đừng cuống. 90% là do Firewall và SELinux đang chặn đường. Chúng ta sẽ xử lý nó ngay bên dưới.
Điều hướng thông minh với ACL
Giả sử hệ thống của bạn có cả API và Frontend chạy riêng biệt. Bạn muốn các request vào /api đi tới cụm server xử lý logic, còn lại thì trả về trang tĩnh. ACL (Access Control Lists) sinh ra để làm việc này.
frontend http_in
bind *:80
# Nhận diện request API
acl is_api path_beg /api
# Điều hướng thông minh
use_backend api_cluster if is_api
default_backend static_web
backend api_cluster
balance leastconn
server api01 10.0.0.5:8080 check maxconn 500
server api02 10.0.0.6:8080 check maxconn 500
backend static_web
balance roundrobin
server web01 10.0.0.10:80 check
server web02 10.0.0.11:80 check
Mình ưu tiên dùng leastconn cho cụm API. Thuật toán này đẩy request vào server đang ít kết nối nhất. Nó hiệu quả hơn hẳn roundrobin khi các tác vụ xử lý dữ liệu có thời gian phản hồi không đồng đều.
Xử lý SELinux và Firewalld: Đừng tắt, hãy cấu hình đúng!
Nhiều anh em thường chọn cách tắt setenforce 0 cho nhanh. Đây là sai lầm chết người về bảo mật. Fedora mặc định chặn HAProxy tạo kết nối ra ngoài (outbound), nên bạn phải cấp quyền cho nó.
1. Thông mạch SELinux
Chạy lệnh sau để cho phép HAProxy kết nối tới các backend server qua mạng:
sudo setsebool -P httpd_can_network_connect 1
Cờ -P giúp rule này không bị mất khi bạn reboot lại server.
2. Mở cửa Firewalld
Đừng quên mở các port dịch vụ. Nếu không, client sẽ không thể chạm tới Load Balancer:
sudo firewall-cmd --permanent --add-service={http,https}
sudo firewall-cmd --reload
Health Check: Đảm bảo hệ thống luôn sẵn sàng
Một Load Balancer tốt phải biết loại bỏ server lỗi ngay lập tức. Thay vì chỉ check port TCP khô khan, mình thường dùng HTTP check để đảm bảo ứng dụng thực sự phản hồi.
backend app_backend
option httpchk GET /health
http-check expect status 200
server app01 192.168.1.20:8080 check inter 2s rise 3 fall 2
server app02 192.168.1.21:8080 check inter 2s rise 3 fall 2
Với cấu hình trên, HAProxy sẽ kiểm tra endpoint /health mỗi 2 giây. Nếu server trả về lỗi 500 hoặc timeout 2 lần liên tiếp (fall 2), nó sẽ bị gạch tên khỏi danh sách phục vụ. Chỉ khi nào trả về 200 đủ 3 lần (rise 3), nó mới được quay lại làm việc.
Trang quản trị (HAProxy Stats)
Để theo dõi trực quan, bạn nên bật dashboard tích hợp sẵn. Nó hiển thị rõ server nào đang “sống”, lượng traffic và lỗi Real-time:
listen stats
bind *:9000
stats enable
stats uri /monitor
stats auth admin:MatKhauSieuKho2024
stats refresh 5s
Truy cập vào http://IP-Cua-Ban:9000/monitor để xem thành quả. Nhớ mở port 9000 trên Firewalld nhé.
Kinh nghiệm thực chiến cho anh em
Sau nhiều lần “ăn hành” trên môi trường Production, mình rút ra mấy lưu ý quan trọng:
- Kiểm tra cú pháp: Luôn chạy
haproxy -c -f /etc/haproxy/haproxy.cfgtrước khi restart. Một dấu phẩy thừa cũng có thể khiến hệ thống downtime. - Tách Log: Mặc định log HAProxy trộn chung vào
journalctlrất khó nhìn. Bạn nên cấu hình Rsyslog để đẩy log ra file riêng tại/var/log/haproxy.log. - Tối ưu Kernel: Với hệ thống chịu tải trên 10.000 kết nối đồng thời, hãy nâng giới hạn file descriptor bằng cách thêm
fs.file-max = 65535vào/etc/sysctl.conf. - SSL Termination: Nếu dùng HAProxy giải mã HTTPS, hãy ưu tiên các bản Fedora mới để tận dụng OpenSSL 3.0, giúp tốc độ handshake nhanh hơn đáng kể.
Triển khai HAProxy trên Fedora không khó, cái khó là hiểu cách nó tương tác với hệ thống bảo mật của OS. Nếu gặp lỗi lạ, bạn hãy dùng lệnh ausearch -m avc -ts recent để xem SELinux đang chặn cái gì. Chúc anh em build được hệ thống ổn định!

