nginx默认轮询天然支持多后端协同,关键在于清除所有干扰项:删weight、禁ip_hash等指令、统一健康检查参数,并通过日志验证循环序列,长期统计下各节点流量偏差应控制在1%~3%。

直接用 Nginx 默认轮询就能让多个后端服务协同处理请求,不需要额外开启算法或写 round_robin。关键不是“怎么加”,而是“怎么清”——去掉所有干扰项,让轮询回归最简、确定、可验证的状态。
确保 upstream 配置真正干净
轮询只认 server 行的排列顺序,其他修饰词都会改写行为:
- 删掉所有 weight= 参数:哪怕只有一台写了 weight=2,整个组就变成加权轮询,不再均等
- 彻底移除 ip_hash、hash $arg_id、least_conn 等指令:注释掉也不行,必须整行删除
- 每台 server 保持最简格式,例如:server 192.168.1.10:8080;,不带 backup、down、max_fails 等修饰
统一健康检查参数避免“隐形偏斜”
轮询本身不感知状态,但健康检查配置不一致会让某台服务器频繁被剔除,导致流量实际集中在剩余节点上:
- 为每台 server 显式加上相同探测参数:max_fails=2 fail_timeout=15s
- 避免 A 服务器用 max_fails=1、B 用 max_fails=5 这类不对齐配置
- 这样所有节点在异常时被摘除的门槛一致,轮询队列才稳定
用日志验证是否真正在轮询
别靠猜测或平均响应时间判断,直接看请求到底落到哪台机器:
- 在 http 块中定义日志格式:log_format upstream_log '$remote_addr - $upstream_addr [$time_local] "$request" $status';
- 在 location 中启用:access_log /var/log/nginx/upstream.log upstream_log;
- 发起 10+ 次请求(如 curl 或浏览器反复刷新),再查日志文件,应看到类似 192.168.1.10:8080 → 192.168.1.11:8080 → 192.168.1.12:8080 → 192.168.1.10:8080 的循环序列
理解 worker 进程独立计数带来的短期波动
Nginx 每个 worker 进程维护自己的轮询指针,高并发瞬间可能看到某台接收连续几条请求,但这只是局部现象:
- 长期统计(几百次以上请求)下,各后端 access.log 行数差异通常控制在 1%~3%
- 若差异持续超过 10%,优先检查是否有节点因超时被临时摘除,或配置里混入了 weight/ip_hash
- 不需要调优 worker 数量来“修正”轮询,那是误解;轮询的均匀性体现在整体分布,而非单次请求顺序











