Nginx upstream 负载均衡配置:轮询、ip_hash、权重、least_conn 与 PHPStudy 位置问题

基本结构

upstream 定义后端服务器组,proxy_pass 引用该组名:

upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
    server 192.168.1.12:8000;
}

server {
    location / {
        proxy_pass http://backend;
        # ... 其他 proxy 配置
    }
}

四种均衡策略

轮询(默认):依次分配请求,适合无状态服务:

upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

ip_hash:同一客户端 IP 固定打到同一台服务器,适合有 Session 的服务:

upstream backend {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

weight(加权轮询):按权重比例分配流量:

upstream backend {
    server 192.168.1.10:8000 weight=4;
    server 192.168.1.11:8000 weight=2;
    server 192.168.1.12:8000 weight=1;
}

least_conn(最少连接):新请求优先分配给当前连接数最少的服务器,适合耗时不均匀的服务(如 AI 推理、文件处理):

upstream backend {
    least_conn;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

健康检查

max_fails 次失败后暂时摘除节点,fail_timeout 秒后重试:

upstream backend {
    server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
}

错误:upstream directive is not allowed here

[emerg] "upstream" directive is not allowed here in vhosts/xxx.conf:24

原因:upstream 只能放在 http {} 块内,不能放在 server {}location {} 内。

PHPStudy 等面板生成的 vhosts 文件是 server {} 块,不能在里面定义 upstream

解决方案:在主 nginx.confhttp {} 块中定义:

# nginx.conf
http {
    upstream backend {
        server 192.168.1.10:8000;
        server 192.168.1.11:8000;
    }

    include vhosts/*.conf;  # vhosts 文件只包含 server{} 块
}

配置验证与重载

nginx -t          # 检查配置语法
nginx -s reload   # 平滑重载(不中断现有连接)