轮询需叠加健康检查、连接限制和容错重试防过载;统一健康检查参数、禁用干扰指令、启用proxy_next_upstream、设置max_conns并用日志验证分发均匀性。

轮询本身不防过载,它只管按顺序发请求。真正防止节点过载,靠的是在轮询基础上叠加健康检查、连接限制和容错重试机制。
统一健康检查参数,避免节点被“隐形剔除”
轮询不感知后端状态,但若某台服务器因配置不同被频繁踢出,实际流量就会向剩下节点倾斜。关键不是去掉健康检查,而是让所有节点的判定标准一致:
- 每台 server 显式加上相同的探测参数:max_fails=2 fail_timeout=15s
- 删掉注释行——哪怕只是# max_fails=1,Nginx 也会读取并影响行为
- 禁用 ip_hash、least_conn、hash $arg_id 等指令,这些会覆盖轮询逻辑
- server 行保持最简:server 192.168.1.10:8080;,不带 weight、backup、down 或 max_conns(除非你明确需要)
启用失败重试与自动故障转移
单靠轮询,一次超时或 500 错误就可能卡住请求。必须配合 proxy_next_upstream 让 Nginx 主动换节点:
- 在 location 块中添加:proxy_next_upstream error timeout http_500 http_502;
- 搭配 upstream 中的 max_fails=2 fail_timeout=15s,实现“两次失败即隔离 + 自动跳过”闭环
- 避免只写 proxy_next_upstream off —— 这等于关闭容错,把压力全留给当前节点
限制单节点并发连接数
即使节点没宕机,也可能因连接堆积而响应变慢。用 max_conns 给它设一道硬闸:
- 示例:server 192.168.1.11:8080 max_conns=200;
- 当该节点活跃连接数 ≥200,Nginx 就跳过它,不再分发新请求
- 注意:需与后端 keepalive 设置匹配,否则连接释放不及时,max_conns 可能形同虚设
用日志验证真实分发效果
别凭感觉判断是否均匀。worker 进程各自维护轮询指针,短时间看到某台连续收请求是正常现象。要看长期分布:
- 定义日志格式:log_format upstream_log '$remote_addr - $upstream_addr [$time_local] "$request" $status';
- 在 location 中启用:access_log /var/log/nginx/upstream.log upstream_log;
- 发起 200+ 次请求后统计各后端 IP 出现次数,差异超过 10% 就说明有节点被反复剔除或响应异常











