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 frontendbackend, 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: