Load balancing là một kỹ thuật được sử dụng để phân phối tải trên nhiều máy chủ (server) để tăng tính khả dụng, độ tin cậy và hiệu suất của hệ thống. Trong môi trường web, load balancing có thể được sử dụng để phân phối tải truy cập trên nhiều server web nhằm đảm bảo rằng mọi yêu cầu của khách hàng sẽ được xử lý nhanh chóng và không gây ra quá tải cho bất kỳ server nào.
Nginx là một web server mã nguồn mở được thiết kế để xử lý các yêu cầu HTTP và TCP. Nó có khả năng xử lý hàng nghìn kết nối đồng thời và có tính năng bảo mật và phân phối tải tích hợp sẵn. Nginx được sử dụng rộng rãi trong môi trường web để xử lý các yêu cầu HTTP và TCP đồng thời.
Keepalived là một phần mềm mã nguồn mở được sử dụng để triển khai một cơ chế hoạt động tương tự như VRRP (Virtual Router Redundancy Protocol) để giữ cho các máy chủ (server) đang chạy và hoạt động một cách liên tục và ổn định. Nó cung cấp khả năng chuyển hướng các yêu cầu tới các máy chủ khác trong trường hợp một server bị lỗi hoặc bị quá tải. Keepalived được sử dụng để đảm bảo tính khả dụng và độ tin cậy cho các ứng dụng chạy trên các máy chủ. Khi kết hợp với Nginx, Keepalived cung cấp khả năng phân phối tải trên nhiều server web để đảm bảo tính khả dụng và độ tin cậy của hệ thống.
Để tạo một web server có load balancer bằng nginx và sử dụng IP ảo keepalive trên Ubuntu, bạn có thể làm theo các bước sau:
Bước 1: Cài đặt Nginx và Keepalived trên máy chủ
Chạy các lệnh sau để cài đặt Nginx và Keepalived trên máy chủ Ubuntu của bạn:
sudo apt-get update
sudo apt-get install nginx keepalived
Bước 2: Cấu hình file nginx.conf
Tiếp theo, bạn cần phải cấu hình Nginx để sử dụng load balancing. Bạn hãy sao lưu file nginx.conf trước khi cấu hình tránh trường hợp cấu hình lỗi thì chúng ta rollback lại.
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
Mở file cấu hình của Nginx bằng lệnh sau:
cat > /etc/nginx/nginx.conf << 'OEF'
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
upstream hoanghd {
server 192.168.13.231:8099;
server 192.168.13.232:8099;
server 192.168.13.233:8099;
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
OEF
Lưu lại các thay đổi và đóng file cấu hình.
Dưới đây là giải thích chức năng từng dòng trong file cấu hình của nginx:
user www-data;
: Người dùng và nhóm mà quá trình Nginx sẽ chạy dưới đó. Thông thường, tài khoản “www-data” là được sử dụng để chạy Nginx và có quyền truy cập vào các file liên quan đến web server.worker_processes auto;
: Số lượng worker process được sử dụng để xử lý các yêu cầu. Tùy thuộc vào số lượng CPU và bộ nhớ của máy chủ, bạn có thể cấu hìnhworker_processes
để tối ưu hóa hiệu suất của Nginx.pid /run/nginx.pid;
: Đường dẫn tới file PID (Process Identifier) của quá trình Nginx. File này sẽ được sử dụng để kiểm soát các quá trình Nginx.include /etc/nginx/modules-enabled/*.conf;
: Các modules được kích hoạt trong Nginx.events {...}
: Cấu hình cho các sự kiện được xử lý bởi Nginx. Trong đó,worker_connections
là số lượng kết nối mà mỗi worker process có thể xử lý đồng thời.http {...}
: Cấu hình cho phần giao thức HTTP của Nginx. Trong đó,upstream
là cấu hình cho việc tạo các nhóm các máy chủ đích để phân phối tải.sendfile on;
: Cho phép sử dụng hệ thống sendfile để truyền file trực tiếp từ ổ đĩa đến kết nối mạng mà không cần đọc và ghi vào bộ đệm trung gian.tcp_nopush on;
: Cho phép Nginx sử dụng TCP_NOPUSH để đẩy gói tin TCP nhanh hơn.tcp_nodelay on;
: Tắt Nagle’s algorithm trên kết nối TCP để giảm thiểu độ trễ của mạng.keepalive_timeout 65;
: Thời gian giữ kết nối sống khi không có yêu cầu từ phía khách hàng. Khi thời gian này hết, kết nối sẽ bị đóng.types_hash_max_size 2048;
: Cấu hình kích thước bộ đệm để tối ưu hóa hiệu suất khi xác định loại file.include /etc/nginx/mime.types;
: Cấu hình loại file và phân loại chúng để Nginx có thể phục vụ chúng một cách đúng đắn.default_type application/octet-stream;
: Loại file mặc định sẽ được sử dụng nếu Nginx không thể tìm thấy bất kỳ kiểu file nào tương ứng với yêu cầu. Dòng cấu hình sau đây chỉ định kiểu file mặc định làapplication/octet-stream
, có nghĩa là Nginx sẽ trả về file này nếu không thể xác định kiểu file yêu cầu.ssl_protocols
: chỉ định các giao thức SSL/TLS được hỗ trợ bởi Nginxssl_prefer_server_ciphers
: chỉ định Nginx sử dụng thuật toán mã hóa được ưa chuộng của máy chủ để mã hóa các thông tin truyền tảiaccess_log
: chỉ định vị trí file nhật ký truy cập của Nginxerror_log
: chỉ định vị trí file nhật ký lỗi của Nginxgzip
: chỉ định Nginx sử dụng nén gzip cho các file tĩnh trước khi trả về cho trình duyệtinclude
: cho phép chèn các file cấu hình khác vào file cấu hình hiện tại, giúp tách biệt và quản lý cấu hình dễ dàng hơn.
Bước 3: Tạo và cấu hình webserver.
Hãy tạo file /etc/nginx/conf.d/lb-webserver.con với nội dung như dưới.
cat > /etc/nginx/conf.d/lb-webserver.conf << 'OEF'
server {
listen 8099;
root /home/www/;
index index.html index.htm index.nginx-debian.html;
charset utf-8;
}
server {
listen 80;
server_name hoanghd.com;
proxy_redirect off;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
client_max_body_size 10m;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Content-Security-Policy upgrade-insecure-requests;
proxy_pass http://hoanghd;
}
}
OEF
Đây là file cấu hình nginx để cấu hình một máy chủ web (web server) hoạt động với tên miền hoanghd.com và sử dụng port 80 để lắng nghe các yêu cầu HTTP đến. Nếu các yêu cầu đến là các tài nguyên tĩnh (như file HTML, CSS, JS, ảnh…) thì Nginx sẽ phục vụ chúng trực tiếp từ thư mục /home/www/.
Nếu các yêu cầu đến là các tài nguyên động (như các yêu cầu đến PHP, NodeJS, Python, Ruby…), Nginx sẽ chuyển tiếp chúng đến upstream hoanghd thông qua cấu hình proxy_pass. Upstream này sử dụng các địa chỉ IP và port của 3 server 192.168.13.231, 192.168.13.232 và 192.168.13.233 để cân bằng tải (load balancing) giữa các máy chủ này.
Các lệnh trong location / được cấu hình để Nginx chuyển tiếp các yêu cầu đến upstream hoanghd, kết nối đến các máy chủ của nó để xử lý các yêu cầu đến. Các lệnh proxy_set_header cấu hình để chuyển tiếp các thông tin về yêu cầu đến (như Host, X-Real-IP, X-Forwarded-For…) cho upstream hoanghd, giúp đảm bảo các máy chủ có thể biết được đâu là người dùng gửi yêu cầu đến. Các lệnh proxy_connect_timeout, proxy_read_timeout, proxy_send_timeout, send_timeout, client_max_body_size được cấu hình để giới hạn thời gian xử lý yêu cầu, kích thước yêu cầu, giúp đảm bảo rằng các yêu cầu không bị quá tải hoặc gây ra lỗi.
Cuối cùng, add_header Content-Security-Policy upgrade-insecure-requests được sử dụng để bảo mật website, cụ thể là chuyển đổi các yêu cầu HTTP thành HTTPS (giao thức bảo mật), giúp ngăn chặn các cuộc tấn công qua mạng.
Bước 3: Tạo nội dung website.
Trên server 1.
mkdir -p /home/www/
echo 'Chào mừng bạn đến với website của tôi - server 1' > /home/www/index.html
Tên server 2.
mkdir -p /home/www/
echo 'Chào mừng bạn đến với website của tôi - server 2' > /home/www/index.html
Trên server 3.
mkdir -p /home/www/
echo 'Chào mừng bạn đến với website của tôi - server 3' > /home/www/index.html
Bước 4: Cấu hình Keepalived
Sau khi cấu hình Nginx, bạn cần phải cấu hình Keepalived để sử dụng IP ảo. Mở file cấu hình Keepalived và thêm các cấu hình sau vào file cấu hình:
cat > /etc/keepalived/keepalived.conf << 'OEF'
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
}
vrrp_instance VI_1 {
interface enp1s0
state MASTER
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.13.100
}
track_script {
chk_nginx
}
}
OEF
Đoạn cấu hình này định nghĩa một script để kiểm tra trạng thái của Nginx và sử dụng Keepalived để quản lý một địa chỉ IP ảo cho các server Nginx. Cụ thể:
vrrp_script chk_nginx
: định nghĩa một script để kiểm tra trạng thái của Nginx. Script này được đặt tại đường dẫn “/etc/keepalived/check_nginx.sh”. Thời gian kiểm tra là 2 giây (interval 2).vrrp_instance VI_1
: định nghĩa một instance của VRRP (Virtual Router Redundancy Protocol) với tên là VI_1. Các thông số của instance này bao gồm:interface enp1s0
: giao diện mạng sẽ được sử dụng để giao tiếp VRRP.state MASTER
: xác định trạng thái của instance, trong trường hợp này là MASTER.virtual_router_id 51
: xác định một ID duy nhất cho instance.priority 101
: xác định độ ưu tiên của instance, giá trị này cao hơn 100 nên khi Keepalived bắt đầu, nó sẽ trở thành MASTER.virtual_ipaddress { 192.168.13.100 }
: địa chỉ IP ảo mà các server Nginx sẽ sử dụng.track_script { chk_nginx }
: theo dõi trạng thái của script “chk_nginx”. Nếu script này trả về kết quả khác 0 (tức là Nginx đang không hoạt động), Keepalived sẽ chuyển trạng thái sang BACKUP và chuyển quyền điều khiển đến instance có độ ưu tiên cao hơn.
Bước 5: Tạo script kiểm tra trạng thái Nginx
Bây giờ, chúng ta cần tạo một script để kiểm tra trạng thái của Nginx. Mở file check_nginx.sh
bằng lệnh sau:
cat > /etc/keepalived/check_nginx.sh << 'OEF'
#!/bin/bash
if ! pgrep nginx > /dev/null
then
systemctl start nginx
fi
OEF
Trong đó:
pgrep nginx
: Kiểm tra xem Nginx có đang chạy hay không.systemctl start nginx
: Khởi động Nginx nếu Nginx không đang chạy.
Lưu lại các thay đổi và đóng file.
Bước 6: Khởi động Nginx và Keepalived
Khởi động Nginx và Keepalived bằng các lệnh sau:
sudo systemctl start nginx
sudo systemctl start keepalived
Nếu muốn đảm bảo rằng Nginx và Keepalived sẽ khởi động cùng với hệ thống, bạn có thể sử dụng các lệnh sau:
sudo systemctl enable nginx
sudo systemctl enable keepalived
Lưu ý rằng, khi chạy lệnh sudo systemctl enable
, bạn đang yêu cầu cho systemd (một hệ thống khởi động và quản lý dịch vụ trong Linux) khởi động các dịch vụ này cùng với hệ thống mỗi khi hệ thống được khởi động lại.
Bước 7: Kiểm tra hoạt động của Load Balancer
Sau khi hoàn tất các bước cấu hình và khởi động dịch vụ, bạn có thể kiểm tra hoạt động của load balancer bằng cách truy cập vào địa chỉ IP ảo của Keepalived từ một trình duyệt web.
Để biết địa chỉ IP ảo đã được cấu hình, bạn có thể chạy lệnh sau trên bất kỳ máy chủ nào trong mạng của bạn:
ip addr show
Kết quả sẽ bao gồm các thông tin về địa chỉ IP ảo đã được cấu hình.
Sau đó, truy cập vào địa chỉ IP ảo này từ một trình duyệt web, và bạn sẽ thấy các request được phân phối đến các server ở phía sau load balancer.
Lưu ý rằng, để kiểm tra được hoạt động của load balancer, bạn cần đảm bảo rằng cả ba server đều đang chạy Nginx và đang phục vụ trang web tương tự nhau.