Cấu hình Nginx làm HTTP Load Balancer cho Apache (CentOS 7)

Nginx Load Balancer là gì?

Cân bằng tải (Load balancing) là một kỹ thuật thường dùng để tối ưu hóa việc sử dụng tài nguyên, tối đa hóa thông lượng, giảm độ trễ về đảm bảo tính chịu lỗi.

Trong bài trước, Zhost đã hướng dẫn các bạn cấu hình Nginx sử dụng như là một Web Server hay một Reverse Rroxy đứng trước bảo về và tăng khả năng chịu tải cho Apache.

Tuy nhiên, Chúng ta cũng có thể sử dụng nginx như là một bộ cân bằng tải (Load balancer) để phân phối lưu lượng truy cập đến các máy chủ web nhằm mục đích cải thiện hiệu năng, khả năng mở rộng và độ tin cậy của các ứng dụng web.

Có rất nhiều thuật toán được xây dựng cho việc cân bằng tải, mỗi thuật toán đều có những ưu nhược điểm khác nhau, trong mỗi trường hợp sẽ có được tác dụng riêng, chúng ta cũng có thể kết hợp các thuật toán với nhau để giúp cho hệ thống hoạt động được tốt hơn. Tùy vào cơ sở hạ tầng và mục đích sử dụng mà sẽ lựa chọn thuật toán phù hợp với hệ thống.

Các thuật toán sử dụng trong Nginx Load Balancer

Weighted load balancing

  • Đây là một thuật toán quan trọng trong load balancing, khi sử dụng thuật toán này sẽ giúp chúng ta giải quyết đươc bài toán phân chia các server xử lý. Với mặc định của nginx sử dụng thuật toán round-robin thì các request sẽ được chuyển luân phiên đến các server để xử lý, tuy nhiên đối với Weighted load balancing thì chúng ta sẽ phân ra được khối lượng xử lý giữa các server.
  • Ví dụ chúng ta có 2 server dùng để load balancing muốn cứ 5 request đến thì 4 dành cho server 1, 1 dành cho server 2 hay các trường hợp tương tự thì weighted load balancing là sự lựa chọn hợp lý.

Round Robin.

  • Round Robin là thuật toán mặc định của nginx.
  • Đặc điểm của thuật toán này là các request sẽ được luân chuyển liên tục giữa các server 1:1 , điều này sẽ làm giải tải cho các hệ thống có lượng request lớn và mức chịu tải của các Server là như nhau.

Least connection.

  • Đây là thuật toán nâng cấp của round robin và weighted load balancing, thuật toán này sẽ giúp tối ưu hóa cân bằng tải cho hệ thống.
  • Đặc điểm của thuật toán này là sẽ chuyển request đến cho server đang xử lý ít hơn làm việc, thích hợp đối với các hệ thống mà có các session duy trì trong thời gian dài, tránh được trường hợp các session duy trì quá lâu mà các request được chuyển luân phiên theo quy tắc định sẵn, dễ bị down 1 server nào đó do xử lý qúa khả năng của nó.

IP-hash (chỉ dùng cho HTTP)

Thuật toán hash sẽ dựa trên 3 octer đầu tiên trên IP của client để quyết định xem client này sẽ được map cố định với server nào. Thích hợp với những ứng dụng cần giữ lại session của người dùng. Khi ta thêm hoặc bớt một server trong pool thì các giá trị hash này sẽ được phân bố lại (mất session). Ta có thể dùng thêm một tham số bổ trợ là consistent để giảm thiểu ảnh hưởng của khi phân phối lại các giá trị hash.

Cấu hình Nginx Load Balancer

Mô hình Lab

cau hinh nginx load balancer centos 7 1

Trong bài viết này, Zhost sẽ sử dụng 03 server cài đặt CentOS 7, bao gồm:

    • Nginx Load Balancer:  10.10.10.11 – kết nối với End User bên ngoài và 172.16.0.11 – Kết nối tới các Apache Web Server bên trong để điều phối Request.
    • Apache Web Server 01: 172.16.0.21
    • Apache Web Server 02: 172.16.0.22

Vô hiệu hoá SELinux trên cả 03 Server theo bài viết: Cách vô hiệu hóa SELinux trên CentOS

Cài đặt Apache

Thực hiện trên Apache Web Server 01 02.

yum -y update && yum -y install httpd

Sau khi cài đặt xong các bạn chạy lệnh sau để khởi động Apache Service:

systemctl start httpd.service && systemctl enable httpd.service

Tiếp theo cấu hình firewall mở port http/https, mặc định trong centos 7 sử dụng FirewallD.

firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Tạo file html đơn giản trên cả hai Web Server:

Web Server 01:

touch /var/www/html/index.html 
echo "<center><h1>This is website on Web Server 01</h1></center>" > /var/www/html/index.html

cau hinh nginx load balancer centos 7 2

Web Server 02:

touch /var/www/html/index.html 
echo "<center><h1>This is website on Web Server 02</h1></center>" > /var/www/html/index.html

cau hinh nginx load balancer centos 7 3

Cài đặt Nginx Load Balancer

Thực hiện trên Server Nginx Load Balancer – 10.10.10.11/172.16.0.11

Cài đặt các Repo cần thiết:

yum install epel-release -y 
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Chạy lệnh sau để cài đặt Nginx:

yum install -y nginx

Khởi động Service nginx:

systemctl start nginx.service && systemctl enable nginx.service

Tiếp theo cấu hình firewall mở port http/https, mặc định trong centos 7 sử dụng FirewallD.

firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Cấu hình Load Balancing theo thuật toán Round Robin

Mở file /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:

upstream backends {
              server 172.16.0.21:80;
              server 172.16.0.22:80;
}

cau hinh nginx load balancer centos 7 4

Lưu lại và thoát.

Cấu hình trên sẽ Forward đều số lượng Request nhận được vào 2 Web server (trọng số 1:1).

Mở file Virtual host của nginx (trong bài viết này sử dụng Virtual host default):

nano /etc/nginx/conf.d/default.conf

Tại block server {} thêm các cấu hình thành như sau :

proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;

Tại block location / {} sửa thành như sau để Forward request vào Web Server bên trong:

location / {
       proxy_pass http://backends;
}

cau hinh nginx load balancer centos 7 5

Lưu lại và thoát.

Khởi động lại Nginx:

systemctl restart nginx.service 

Từ trình duyệt web của User, truy cập vào địa chỉ của Nginx Load Balancer (10.10.10.11) sẽ thấy hiển thị ra website nằm trên Web server 1.

cau hinh nginx load balancer centos 7 6

Bấm F5 lại sẽ thấy Nginx trả về nội dung của Website nằm trên Web server 2.

cau hinh nginx load balancer centos 7 7

Như vậy là Request đã được Forward đều vào 2 web server.

Tương tự như vậy, để cấu hình Load balancing theo các thuật toán khác nhau, ta chỉ cần chỉnh sửa lại block upstream trong file: /etc/nginx/nginx.conf.

Cấu hình Load Balancing theo thuật toán Round Robin kết hợp Weighted

Mở file /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Tại block http {} thêm đoạn cấu hình Load Balancing như sau:

upstream backends {
              server 172.16.0.21:80 weight=3;
              server 172.16.0.22:80 weight=2;
}

Lưu lại và thoát.

cau hinh nginx load balancer centos 7 8

Cấu hình trên có nghĩa là cứ 5 request gửi tới server sẽ có 3 request vào web server 1 và 2 request vào web server 2.

Khởi động lại Nginx:

systemctl restart nginx.service 

 

Cấu hình Load Balancing theo thuật toán Least connection

Mở file /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:

upstream backends { 
              least_conn;
              server 172.16.0.21:80;
              server 172.16.0.22:80;
}

cau hinh nginx load balancer centos 7 9

Lưu lại và thoát.

Cấu hình trên sẽ chuyển request đến cho server đang xử lý ít hơn làm việc.

Khởi động lại Nginx:

systemctl restart nginx.service 

 

Cấu hình Load Balancing theo thuật toán Least connection kết hợp Health Check

Để mang lại hiệu quả cân bằng tải tốt nhất ta có thể cấu hình thêm nhiều Option cho từng Server.

Mở file /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:

upstream backends { 
              least_conn;
              server 172.16.0.21:80 max_fails=1 fail_timeout=10s;
              server 172.16.0.22:80 max_fails=1 fail_timeout=10s;
}

cau hinh nginx load balancer centos 7 10

Lưu lại và thoát.

Cấu hình trên sẽ chuyển request đến cho server đang xử lý ít hơn làm việc. Trong đó:

    • max_fails=1 Số lần tối đã thử kết nối đến Server Backend.
    • fail_timeout=10s khoảng thời gian mà load balancer sẽ chờ Server Backend trả lời. Sau khoảng thời gian này, Server sẽ bị coi là Down và request sẽ được chuyển đến server tiếp theo.

Khởi động lại Nginx:

systemctl restart nginx.service 

Khi này, nếu 2 web server vẫn hoạt động bình thường thì Nginx vẫn Forward vào server có ít request hơn.

Nhưng khi một trong 2 server bị Shutdown, Stop Service Apache hoặc mất kết nối thì Nginx sẽ nhận ra và chuyển toàn bộ request vào server còn lại.

Cấu hình Load Balancing theo thuật toán ip hash kết hợp Health Check

Để mang lại hiệu quả cân bằng tải tốt nhất ta có thể cấu hình thêm nhiều Option cho từng Server.

Mở file /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Tại block http {} thêm hoặc sửa đoạn cấu hình Load Balancing như sau:

upstream backends { 
              ip_hash;
              server 172.16.0.21:80 max_fails=1 fail_timeout=10s;
              server 172.16.0.22:80 max_fails=1 fail_timeout=10s;
}

cau hinh nginx load balancer centos 7 11

Lưu lại và thoát.

Cấu hình trên sẽ yêu cầu Nginx sử dụng thuật toán ip_hash. Forward request đến các các Backend server cụ thể bằng cách hash 3 octet đầu tiên của IP User. Và User sẽ được giữ Session trên server.

Cấu hình trên cũng có thêm Option health check để kiểm tra tính sẵn sàng của Backend Server.

Khởi động lại Nginx:

systemctl restart nginx.service 

 

Một số chỉ thị về load balance trong file config của nginx

ModuleCông dụng
ip_hashChỉ thị này khai báo với Nginx sử dụng thuật toán ip_hash. Forward request đến các các upstream (backend) server bằng cách hash 3 octet đầu tiên của IP client.
least_connChỉ thị này khai báo với Nginx sử dụng thuật toán Least connection. Ưu tiên Forward request đến upstream (backend) server nào có ít kết nối đang hoạt động nhất.
serverMỗi chỉ thị server tương ứng với 1 upstream server/socket. Một số Option có thể cấu hình đi kèm gồm:

  • weight: trọng số ưu tiên của server.
  • max_fails: Số lần tối đa mà load balancer không liên lạc được với server này (trong khoảng fail_timeout) trước khi server này bị coi là down.
  • fail_timeout: khoảng thời gian mà một server phải trả lời load balancer, nếu không trả lời thì server này sẽ bị coi là down. Đây cũng là thời gian downtime của server này.
  • backup: những server nào có thông số này sẽ chỉ nhận request từ load balancer một khi tất cả các server khác đều bị down.
  • down: chỉ thị này cho biết server này hiện không thể xử lý các request được gởi tới. Load balancer vẫn lưu server này trong danh sách nhưng sẽ không phân tải cho server này cho đến khi chỉ thị này được gỡ bỏ.

 

Zhost chúc các bạn thành công!