Nginx负载均衡实战:多台香港VPS构建高可用Web集群完整配置

单台服务器存在性能上限和单点故障风险。通过Nginx负载均衡将流量分发到多台后端服务器,可以同时提升并发处理能力和系统可用性。本文以两台香港VPS为例,搭建完整的负载均衡集群。

一、负载均衡架构设计

用户请求
    ↓
负载均衡节点(Nginx LB)  ← 香港VPS #1(公网IP)
    ↓           ↓
后端节点1       后端节点2    ← 香港VPS #2 #3(内网IP)
    ↓           ↓
共享数据库(MySQL主从)
    ↓
共享文件存储(NFS 或 对象存储)

二、Nginx负载均衡配置

基础轮询配置(Round Robin)

<code">http {
    upstream web_backend {
        server 内网IP1:8080;   # 后端节点1
        server 内网IP2:8080;   # 后端节点2
    }

    server {
        listen 443 ssl http2;
        server_name yourdomain.com;

        ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

        location / {
            proxy_pass http://web_backend;
            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_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 10s;
            proxy_read_timeout 60s;
            proxy_send_timeout 60s;
        }
    }
}

加权轮询(根据服务器性能分配流量)

<code">upstream web_backend {
    server 内网IP1:8080 weight=3;   # 高配服务器接70%流量
    server 内网IP2:8080 weight=1;   # 低配服务器接约30%流量
}

IP哈希(同一用户始终访问同一节点)

<code">upstream web_backend {
    ip_hash;  # 根据客户端IP哈希,解决Session不一致问题
    server 内网IP1:8080;
    server 内网IP2:8080;
}

最少连接数(推荐生产环境)

<code">upstream web_backend {
    least_conn;  # 将新请求分发到当前连接数最少的节点
    server 内网IP1:8080;
    server 内网IP2:8080;
    keepalive 64;  # 维持长连接,减少建连开销
}

三、健康检查配置

<code">upstream web_backend {
    server 内网IP1:8080 max_fails=3 fail_timeout=30s;
    server 内网IP2:8080 max_fails=3 fail_timeout=30s;
    # max_fails=3:30秒内失败3次则标记为不可用
    # fail_timeout=30s:不可用状态持续30秒,之后尝试恢复

    # 备用节点(只有主节点全部不可用时才启用)
    server 内网IP3:8080 backup;
}

四、Session共享方案

多节点部署时,Session必须集中存储,否则用户请求到不同节点时会丢失登录状态。

方案A:Redis集中存储Session(推荐)

<code"># PHP配置(所有后端节点的php.ini)
session.save_handler = redis
session.save_path = "tcp://Redis服务器内网IP:6379?auth=密码"
<code"># WordPress的wp-config.php
define('WP_REDIS_HOST', 'Redis服务器内网IP');
define('WP_REDIS_PASSWORD', 'Redis密码');
define('WP_REDIS_DATABASE', 0);

方案B:Sticky Session(Nginx IP哈希)

<code">upstream web_backend {
    ip_hash;  # 简单方案,但节点故障时影响对应IP用户
    server 内网IP1:8080;
    server 内网IP2:8080;
}

五、共享文件存储配置(NFS)

多节点部署时,WordPress的uploads目录需要共享,否则节点间文件不同步。

<code"># NFS服务器(存储节点)安装配置
apt install nfs-kernel-server -y

# 创建共享目录
mkdir -p /shared/uploads
chown -R www-data:www-data /shared/uploads

# 配置导出
echo "/shared/uploads 内网IP1(rw,sync,no_subtree_check) 内网IP2(rw,sync,no_subtree_check)" >> /etc/exports
exportfs -ra
systemctl restart nfs-kernel-server
<code"># 所有后端节点挂载NFS
apt install nfs-common -y
mount NFS服务器内网IP:/shared/uploads /var/www/html/wp-content/uploads

# 开机自动挂载
echo "NFS服务器内网IP:/shared/uploads /var/www/html/wp-content/uploads nfs defaults 0 0" >> /etc/fstab

六、动静分离配置

负载均衡节点直接处理静态资源请求,动态请求才转发到后端,减轻后端压力:

<code">server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    root /var/www/html;  # 静态文件直接从LB节点本地提供

    # 静态资源由LB节点直接返回(不转发到后端)
    location ~* \.(jpg|jpeg|png|gif|webp|ico|css|js|woff2|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
    }

    # 动态请求转发到后端节点
    location / {
        try_files $uri @backend;
    }

    location @backend {
        proxy_pass http://web_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

七、监控后端节点状态

<code">server {
    listen 127.0.0.1:8081;

    location /nginx-status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }

    location /upstream-status {
        # 需要nginx-module-upstream-fair或商业版Nginx Plus
        # 开源替代:lua-upstream-nginx-module
    }
}
<code"># 实时查看连接状态
curl http://127.0.0.1:8081/nginx-status

# 输出:
# Active connections: 45
# server accepts handled requests
#  12345 12345 67890
# Reading: 2 Writing: 8 Waiting: 35

八、总结

Nginx负载均衡集群的核心配置项:选择合适的分配策略(推荐 least_conn)、配置健康检查避免流量打到故障节点、用Redis解决Session共享、用NFS或对象存储解决文件共享。IDC.Net的香港VPS同账号多台服务器支持内网互通,构建负载均衡集群时内部通信无需走公网,延迟低且免出站流量费用。

THE END