HAProxy
là một máy chủ proxy cân bằng tải mã nguồn mở phổ biến được sử dụng để phân phối các yêu cầu vào một nhóm máy chủ đằng sau nó. Nó đóng vai trò là một reverse-proxy
hoặc balance proxy
cung cấp các cơ chế cân bằng tải linh hoạt, phân phối các công việc hiệu quả cho các máy chủ đích, giảm tải và tăng năng suất xử lý của hệ thống. Với các tính năng mạnh mẽ mà HAProxy mang lại, nó đã trở thành một giải pháp phổ biến trong việc xây dựng ứng dụng phân tán, cân bằng tải, đảm bảo khả năng chịu tải va sẵn sàng cao.
1. Cài đặt HAProxy
Chúng ta có thể cài đặt HaProxy
bằng package manager của các hệ điều hành linux, ở đây chúng ta sẽ tìm hiểu cách cài đặt HAProxy
trên hệ điều hành Centos 7
# yum -y update
# yum -y install haproxy
# systemctl start haproxy
# systemctl enable haproxy
Các cấu hình của HAProxy sẽ được đặt tại file /etc/haproxy/haproxy.cfg
. Sau mỗi lần chỉnh sửa cấu hình bạn cần khởi động lại để có hiệu lực
# systemctl restart haproxy
2. Cấu hình cân bằng tải với HAProxy
HAProxy luôn làm việc qua việc biên tập file cấu hình của nó. Ở đây chúng ta cần quan tâm tới hai khái niệm:
Frontend
: là các khối nhận phân tích yêu cầu(request)Backend
: là các khối bao gồm địa chỉ các máy chủ sẽ thực hiện request, các thuật toán cân bằng tải cho các Server thực sự đứng sau HAProxy
2.1. Cấu hình khối backend
Chúng ta hoàn toàn có thể định nghĩa ra nhiều khối backend. Trong một khối, chúng ta cần cấu hình các thông số như sau:
Cú pháp cấu hình được haproxy đưa ra:
- backend backend_name: bắt đầu định nghĩa backend với tên của nó
- balance
: thuật toán cân bằng tải sử dụng - mode
: chế độ cân bằng tải gồm có http, tcp - server
...: định nghĩa server thực sự sẽ xử lý yêu cầu
Một số thuật toán cân bằng tải mà ta có thể sử dụng:
- roundrobin: chọn server xoay vòng
- leastconn: chuyển yêu cầu cho server có ít kết nối nhất
- source server: được chọn dựa vào IP của user
Một ví dụ về cấu hình khối backend cho HAProxy
backend backend1
balance roundrobin
mode http
server server1 domain1:80 check # server1 (chỉ ra bằng domain và cổng)
server server2 10.0.0.1:80 check # server2 (chỉ ra bằng IP và cổng), check là yêu cầu HAProxy phải kiểm tra lại tính khả dụng của server
2.2. Cấu hình khối frontend
Các khối frontend
sẽ có nhiệm vụ phân tích request
và chuyển nó cho khối backend
thích hợp. Ta hoàn toàn có thể định nghĩa và đặt tên cho khối đó.
Trong một khối frontend, ta cần chỉ ra cho HAProxy biết sẽ lắng nghe trên port nào bằng từ khóa bind
kèm với port
cần thực hiện lắng nghe. Tiếp đó, ta sẽ định nghĩa ra các điều kiện cụ thể của request với từ khóa acl
: Access control list. Căn cứ vào các acl mà chúng ta có thể gửi request này đến cho một backend cụ thể xử lý yêu cầu bằng cách kết hợp với từ khóa use_backend
.
Dưới đây là một ví dụ:
frontend frontend1
bind: *:80
acl is_domain1 hdr_dom(host) -i domain1.com
acl is_api path_beg /v1
acl is_my_domain hdr_end(Host) -i my_domain.com
use_backend backend1 if is_domain1
use_backend backend_api if is_api is_my_domain
default_backend backend_default
2.3. Cấu hình trực tiếp với khối listen
Ngoài cách định nghĩa khối frontend
và backend
, chúng ta cũng có thể cấu hình trực tiếp bằng khối listen
. Tuy nhiên, việc truy cập vào khối này sẽ phải sử dụng trực tiếp domain hoặc ip với port, nên chúng ta chỉ nên sử dụng với các dịch vụ nội bộ
listen rabbitmq-cluster
bind *:5672
mode tcp
option tcplog
balance roundrobin
server rabbit1 10.0.0.1:5672 check inter 5000 rise 3 fall 5
server rabbit2 10.0.0.2:5672 check inter 5000 rise 3 fall 5
server rabbit3 10.0.0.3.19:5672 check inter 5000 rise 3 fall 5
Như ví dụ trên, chúng ta sẽ cần cấu hình các thành phần như sau:
- listen
- mode
- balance
- server
3. Cấu hình haproxy với docker
Docker image HAProxy được cung cấp với tên haproxy
. Để có thể khởi tạo một container haproxy chúng ta cần có file haproxy.cfg đặt tại /usr/local/etc/haproxy/haproxy.cfg
. Khi chạy haproxy, chúng ta có thể sử dụng tham số -v
khi chạy docker run
để ánh xạ file vào trong container hoặc sử dụng docker-compose
. Trong bài viết này, chúng ta sẽ sử dụng docker-compose để chạy haproxy với docker.
Chúng ta sẽ tạo một file haproxy.cfg với nội dung như sau:
global
maxconn 4096 # giới hạn kết nối đến Proxy
daemon
defaults
timeout connect 10s
timeout client 30s
timeout server 30s
log global
mode http # mode tcp
option httplog # option tcplog
maxconn 3000
frontend stats # cấu hình trang quản trị haproxy
bind *:8181
stats enable
stats uri /stats
stats refresh 30s
stats auth admin:admi
stats show-node
stats admin if TRUE
frontend frontend1
bind: *:80
acl is_domain1 hdr_dom(host) -i domain1.com
acl is_api path_beg /v1
acl is_my_domain hdr_end(Host) -i my_domain.com
use_backend backend1 if is_domain1
use_backend backend_api if is_api is_my_domain
backend backend1
balance roundrobin
mode http
server server1 domain1:80 check
server server2 10.0.0.1:80 check
backend backend_api
balance roundrobin
mode http
server server1 10.0.0.1:5678 check
File docker-compose sẽ có dạng như sau:
version: '3.8'
services:
haproxy:
image: haproxy:2.4 # LTS version, until 2026
container_name: haproxy
# Add setting permission for open port 80 & 443 Require version kenel linux >= 4.4, if else reading paragraph 7
sysctls:
- net.ipv4.ip_unprivileged_port_start=0
ulimits:
nofile:
soft: 1000000
hard: 1000000
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
- /etc/localtime:/etc/localtime:ro
ports:
- 8181:8181
- 80:80
Và tiếp đó, chúng ta chỉ cần chạy lệnh docker-compose up
để khởi chạy haproxy với docker.
Kết bài
Qua bài viết này, Stringee và các bạn đã cùng nhau tìm hiểu về HAProxy là gì, cách cấu hình ra sao và cách cấu hình cân bằng tải haproxy với Docker. Dựa vào các ví dụ trên, bạn hoàn toàn có thể cấu hình phân tích và chuyển request tới các máy chủ thích hợp trong máy chủ của bạn. Một ví dụ kinh điển cho việc sử dụng HaProxy đó là sử dụng mọt domain cho nhiều dịch vụ của một hệ thống với HaProxy làm một reverse proxy trung gian lắng nghe.
Stringee API là bộ giải pháp cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng (CSKH) có thể được nhúng trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Điều này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp, trong khi nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.
Mời quý bạn đọc đăng ký dùng thử và nhận tư vấn tại đây: