1. Biên dịch và thiết lập Nginx từ mã nguồn
Việc cài đặt Nginx từ source code cho phép tùy chỉnh module và tối ưu hiệu năng theo môi trường thực tế. Trước khi biên dịch, cần chuẩn bị các thư viện nền tảng trên hệ điều hành Linux (RHEL/CentOS/Rocky).
1.1. Cài đặt gói phụ thuộc
# Bộ công cụ biên dịch C/C++
sudo yum install -y gcc-c++ make automake
# Thư viện xử lý biểu thức chính quy (rewrite module)
sudo yum install -y pcre pcre-devel
# Thư viện nén dữ liệu (gzip module)
sudo yum install -y zlib zlib-devel
# Thư viện mã hóa cho HTTPS
sudo yum install -y openssl openssl-devel
1.2. Giải nén và cấu hình biên dịch
Tải bản stable từ trang chủ, giải nén và tạo thư mục đệm để tránh lỗi ghi log khi vận hành.
tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0
mkdir -p /var/cache/nginx/tmp
Chạy script configure để sinh Makefile. Các đường dẫn được điều chỉnh để phù hợp với tiêu chuẩn FHS:
./configure \
--prefix=/opt/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/run/nginx.pid \
--lock-path=/run/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/tmp/client \
--http-proxy-temp-path=/var/cache/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/cache/nginx/tmp/fastcgi \
--with-http_gzip_static_module \
--with-http_stub_status_module
1.3. Biên dịch và kích hoạt dịch vụ
make -j$(nproc)
sudo make install
# Khởi động và kiểm tra trạng thái
sudo /opt/nginx/sbin/nginx
sudo /opt/nginx/sbin/nginx -t
sudo /opt/nginx/sbin/nginx -s reload
2. Cấu hình Reverse Proxy và Load Balancing
Nginx hoạt động như một cửa ngõ trung gian, phân phối lưu lượng truy cập đến nhóm máy chủ backend. Dưới đây là các chiến lược phân tải phổ biến.
2.1. Định nghĩa nhóm backend (Upstream)
upstream app_cluster {
# Phân phối theo trọng số (Weighted Round-Robin)
server 10.10.50.11:8080 weight=3 max_fails=2 fail_timeout=10s;
server 10.10.50.12:8080 weight=1 max_fails=2 fail_timeout=10s;
# Máy chủ dự phòng, chỉ nhận traffic khi các node chính lỗi
server 10.10.50.13:8080 backup;
}
server {
listen 80;
server_name api.mydomain.vn;
location / {
proxy_pass http://app_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2.2. Các thuật toán cân bằng tải
- IP Hash: Đảm bảo client luôn truy cập vào cùng một backend dựa trên địa chỉ IP nguồn. Hữu ích cho phiên làm việc không dùng shared session.
- URL Hash: Phân phối dựa trên hash của URI, thích hợp cho caching tầng proxy.
- Least Connections: Chuyển request đến server đang xử lý ít kết nối nhất, phù hợp với tác vụ tốn thời gian.
upstream dynamic_pool {
least_conn;
# hoặc: hash $request_uri consistent;
# hoặc: ip_hash;
server 10.10.50.21:8080;
server 10.10.50.22:8080;
server 10.10.50.23:8080;
}
3. Tối ưu hóa kết nối và bộ nhớ đệm
3.1. Keepalive kết nối ngược
Duy trì kết nối TCP tái sử dụng giữa Nginx và backend giúp giảm đáng kể chi phí bắt tay ba bước (TCP handshake).
upstream app_cluster {
server 10.10.50.11:8080;
server 10.10.50.12:8080;
keepalive 64; # Số kết nối nhàn rỗi được giữ lại
}
server {
location / {
proxy_pass http://app_cluster;
proxy_http_version 1.1;
proxy_set_header Connection ""; # Xóa header Connection để kích hoạt keepalive
}
}
3.2. Kiểm soát cache trình duyệt và proxy
# Cache phía client
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Cache phía Nginx (Proxy Cache)
# Định nghĩa vùng lưu trữ cache
proxy_cache_path /var/cache/nginx/proxy_data levels=1:2 keys_zone=static_cache:10m max_size=2g inactive=60m use_temp_path=off;
server {
proxy_cache static_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
location / {
proxy_pass http://app_cluster;
}
}
4. Kích hoạt HTTPS với chứng chỉ SSL/TLS
Để hỗ trợ giao thức bảo mật, cần biên dịch lại Nginx với module http_ssl_module (thêm --with-http_ssl_module vào lệnh ./configure).
Sau khi biên dịch, cấu hình server block lắng nghe cổng 443:
server {
listen 443 ssl http2;
server_name api.mydomain.vn;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# Tối ưu bảo mật và hiệu năng SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://app_cluster;
}
}
5. Xây dựng High Availability với Keepalived
Keepalived sử dụng giao thức VRRP để quản lý Virtual IP (VIP), tự động chuyển đổi dự phòng khi node chính gặp sự cố.
5.1. Cài đặt và cấu hình node MASTER
# Tải và biên dịch
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar -xf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && sudo make install
Tệp cấu hình /etc/keepalived/keepalived.conf cho node chính:
global_defs {
router_id NGINX_MASTER_01
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_instance VI_GATEWAY {
state MASTER
interface eth0
virtual_router_id 88
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass SecureVrrpPass2024
}
virtual_ipaddress {
10.10.50.100/24 dev eth0 label eth0:vip
}
}
5.2. Giám sát tự động tiến trình Nginx
Keepalived cần biết khi nào Nginx bị treo để tự kích hoạt chuyển đổi VIP. Tạo script kiểm tra:
#!/bin/bash
# /etc/keepalived/scripts/check_nginx.sh
NGINX_PROC=$(pgrep -c nginx)
if [ "$NGINX_PROC" -eq 0 ]; then
systemctl start nginx || /opt/nginx/sbin/nginx
sleep 2
# Nếu khởi động lại thất bại, dừng keepalived để node BACKUP nhận VIP
if [ $(pgrep -c nginx) -eq 0 ]; then
systemctl stop keepalived
fi
fi
Cấp quyền thực thi và tích hợp vào cấu hình Keepalived:
vrrp_script chk_nginx_service {
script "/etc/keepalived/scripts/check_nginx.sh"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_GATEWAY {
# ... các tham số cũ ...
track_script {
chk_nginx_service
}
}
Node BACKUP được cấu hình tương tự với state BACKUP và priority thấp hơn (ví dụ: 100). Đối với mô hình Active-Active (Dual Master), cấu hình hai vrrp_instance chéo nhau trên cả hai máy và trỏ DNS round-robin về hai VIP.
6. Tích hợp LVS (Linux Virtual Server) tầng 4
LVS hoạt động ở tầng mạng (Layer 4), xử lý chuyển mạch gói tin với hiệu suất vượt trội so với Nginx (Layer 7). Kết hợp LVS làm cửa ngõ phân phối và Nginx xử lý logic nghiệp vụ là kiến trúc tiêu chuẩn cho hệ thống lớn.
6.1. Thiết lập chế độ Direct Routing (DR)
Trong mô hình DR, LVS chỉ điều hướng request đầu vào. Response từ backend đi trực tiếp đến client, giảm tải cực lớn cho scheduler.
Bước 1: Tắt trình quản lý mạng mặc định để tránh xung đột interface
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
Bước 2: Cấu hình VIP trên LVS Scheduler
# Tạo file /etc/sysconfig/network-scripts/ifcfg-eth0:vip
DEVICE="eth0:vip"
BOOTPROTO="static"
IPADDR="10.10.50.100"
NETMASK="255.255.255.0"
ONBOOT="yes"
sudo systemctl restart network
Bước 3: Cấu hình ARP suppression trên Real Server (Backend Nginx)
Để backend không tranh chấp VIP với LVS, cần điều chỉnh tham số kernel:
# Thêm vào /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sudo sysctl -p
Gắn VIP vào loopback của backend và định tuyến local:
sudo ifconfig lo:0 10.10.50.100 netmask 255.255.255.255 broadcast 10.10.50.100 up
sudo route add -host 10.10.50.100 dev lo:0
6.2. Quản lý cluster bằng ipvsadm
# Cài đặt công cụ quản lý
sudo yum install -y ipvsadm
# Tạo dịch vụ ảo với thuật toán Weighted Least-Connection
sudo ipvsadm -A -t 10.10.50.100:80 -s wlc -p 300
# Thêm các Real Server vào cluster (chế độ DR dùng flag -g)
sudo ipvsadm -a -t 10.10.50.100:80 -r 10.10.50.11:80 -g -w 3
sudo ipvsadm -a -t 10.10.50.100:80 -r 10.10.50.12:80 -g -w 1
# Lưu cấu hình
sudo ipvsadm-save > /etc/sysconfig/ipvsadm
sudo ipvsadm -Ln --stats
7. Kiến trúc hoàn chỉnh: Keepalived + LVS + Nginx
Thay vì dùng ipvsadm thủ công, Keepalived có thể tự động quản lý luật LVS và thực hiện health check tích hợp. Xóa cấu hình ipvsadm cũ (ipvsadm -C) và thay thế bằng khối virtual_server trong keepalived.conf:
virtual_server 10.10.50.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 300
protocol TCP
real_server 10.10.50.11 80 {
weight 3
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
real_server 10.10.50.12 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
Khi cấu hình này được áp dụng trên cả node MASTER và BACKUP của Keepalived, hệ thống sẽ tự động đồng bộ luật phân tải LVS, kiểm tra sức khỏe backend theo chu kỳ, và chuyển đổi VIP liền mạch nếu scheduler chính gặp sự cố. Khởi động lại dịch vụ để áp dụng:
sudo systemctl restart keepalived
sudo ipvsadm -Ln