Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cấu hình HAProxy làm Load Balancer cho Nginx

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 HAProxy làm Load Balancer cho Nginx

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

Cấu hình HAProxy làm Load Balancer cho Nginx

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:

Cấu hình HAProxy làm Load Balancer cho Nginx

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 local0
  • chroot — cài đặt bảo mật, khóa HAProxy vào thư mục chỉ định
  • maxconn — số lượng kết nối đồng thời tối đa cho mỗi tiến trình
  • daemon — 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 health
  • retries — số lần thử kết nối lại server khi thất bại
  • option httplog — định dạng log khi HAProxy proxy cho HTTP
  • option redispatch — cho phép chấm dứt và chuyển hướng lại session khi server lỗi
  • contimeout — 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

Cấu hình HAProxy làm Load Balancer cho Nginx

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:

Cấu hình HAProxy làm Load Balancer cho Nginx