Triển Khai Nginx Từ Mã Nguồn Đến Kiến Trúc High Availability Kết Hợp LVS

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 BACKUPpriority 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

Thẻ: nginx keepalived LVS load-balancing high-availability

Đăng vào ngày 10 tháng 9 lúc 11:21