HAProxy là một trong những giải pháp load balancing đáng tin cậy và có tốc độ rất xử lý rất nhanh – phù hợp cho các ứng dụng cần tính high availability cao dựa trên TCP và HTTP. Ngày nay, tối đa hóa thời gian xử lý ứng dụng website, cụ thể hơn là tăng tốc độ website cho những trang web có lưu lượng truy cập lớn là một vấn đề cực kỳ quan trọng. Khi đó, chúng ta sẽ cần phải thiết lập môi trường sử dụng nhiều server tăng cường tính khả dụng cao (high availability) cho website – có thể dễ dàng quản lý trong trường hợp một server bị lỗi.
Trong bài viết này, mình sẽ hướng dẫn bạn cách cài đặt bộ Load Balancing HAProxy chạy trên môi trường Ubuntu, Debian. HAProxy sẽ giúp cân bằng tải và chuyển các requests tới các server khác nhau dựa trên địa chỉ IP và port.
Hướng dẫn cài đặt HAProxy
Trong bài viết này, mình giả sử mình đã có tổng cộng 4 server, trong đó 1 server được sử dụng để cài đặt HAProxy và 3 server còn lại được sử dụng để chạy ứng dụng web.
Thông tin web server
Server 1: web1.example.com 192.168.1.1
Server 2: web2.example.com 192.168.1.2
Server 3: web3.example.com 192.168.1.3
HAProxy Server:
HAProxy: haproxy 192.168.1.10
Bước 1. Cài đặt HAProxy
Trước tiên, bạn cần đăng nhập vào server dự định cài HAProxy đã, có địa chỉ IP là 192.168.1.10, sau đó chạy những câu lệnh dưới đây:
Để cài đặt phiên bản HAProxy mới nhất, sử dụng câu lệnh sau:
sudo apt-get update
sudo apt-get install haproxy
Để cài đặt phiên bản HAProxy cố định nào đó, bạn cần phải add repository của phiên bản đó vào. Trong ví dụ này mình sẽ cài đặt HAProxy phiên bản 1.8
sudo add-apt-repository ppa:vbernat/haproxy-1.8
sudo apt-get update
sudo apt-get install haproxy
Bước 2. Cấu hình HAProxy Load Balancing
Bây giờ chỉnh sửa file cấu hình mặc định của HAProxy có đường dẫn /etc/haproxy/haproxy.cfg
sudo vi /etc/haproxy/haproxy.cfg
Thông tin cấu hình mặc định
Trong file cấu hình này, bạn sẽ thấy có các thông tin cấu hình mặc định của HAProxy tương tự như hình phần code bên dưới.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256::RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
Tạo HAProxy Listener
Bây giờ, bạn cần báo cho HAProxy biết nó nên lắng nghe kết nối đến ở đâu. Trong ví dụ này, mình sẽ khai báo HAProxy sẽ lắng nghe trên port 80 của con HAProxy server này luôn.
frontend Local_Server
bind 192.168.1.10:80
mode http
default_backend My_Web_Servers
Tạo Backend Web servers
Cấu hình HAProxy bên trên sẽ lắng nghe trên port 80. Bây giờ mình sẽ định nghĩa phần backend web server – nơi mà HAProxy sẽ gửi request tới.
backend nodes
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server web1.example.com 192.168.1.1:80
server web2.example.com 192.168.1.2:80
server web3.example.com 192.168.1.3:80
Kích hoạt Stats (tùy chọn)
Nếu bạn muốn cấu hình phần theo dõi thông tin thống kê, bạn có thể thêm thông tin cấu hình sau vào file cấu hình của HAProxy.
listen stats *:9200
stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth username:password
stats uri /stats
Bước 3. File cấu hình HAProxy hoàn thiện
File cấu hình HAProxy sau khi tạo lập thêm sửa sẽ có dạng như sau:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256::RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend Local_Server
bind 192.168.1.10:80
mode http
default_backend My_Web_Servers
backend My_Web_Servers
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server web1.example.com 192.168.1.1:80
server web2.example.com 192.168.1.2:80
server web3.example.com 192.168.1.3:80
listen stats *:9200
stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth username:password
stats uri /stats
Bước 4. Restart server
Bây giờ bạn đã cập nhật thay đổi thông tin cấu hình HAProxy cần thiết rồi. Lúc này, bạn cần kiểm tra xác nhận xem thông tin cấu hình đã đúng chưa trước khi restart server bằng câu lệnh sau:
haproxy -c -f /etc/haproxy/haproxy.cfg
Nếu như thông tin câu lệnh trên hiển thị thông tin báo valid, nghĩa là file cấu hình của bạn không có vấn đề gì cả. Bây giờ bạn chỉ cần restart lại server thôi.
sudo service haproxy restart
Bước 5. Xác nhận thông tin cấu hình HAProxy
Lúc này, bạn có thể truy cập vào trang thống kê có địa chỉ là 192.168.1.10:9200 mà mình đã khai báo Stats trong file config bên trên. Nếu như thông tin cả 3 server đều xanh lè nghĩa là cả 3 server ok, còn lại màu đỏ nghĩa là check server bị down.
Ví dụ trang thông tin thống kê sẽ có dạng như sau:
Kết luận
Qua bài viết này, bạn đã có thể cài đặt thành công bộ Load Balancing HAProxy trên server Ubuntu rồi đấy. Tuy nhiên, đây mới chỉ là demo thôi, ngoài ra, bạn còn cần phải biết thêm về các thông số cấu hình HAProxy như healthcheck, restart, downtime, thuật toán load balancing,… Đặc biệt hơn, trong trường hợp bạn hoạt động trong lĩnh vực thiết kế website, ngay từ bước ban đầu, bạn cần phải hiểu rõ về sản phẩm mà bạn sẽ thiết kế, nó có phù hợp để load balancing không hay chỉ chạy trên single server mà thôi. Như vậy, sử dụng HAProxy làm bộ cân bằng tải cho website sẽ trở nên hữu ích và đơn giản hơn nhiều đấy.