Nginx默认轮询可实现流量均分,关键在于精简upstream配置:删weight、禁ip_hash等指令、统一健康检查参数,并用日志验证循环序列;worker独立计数导致短期波动属正常,长期分布偏差应≤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 数量来“修正”轮询,那是误解;轮询的均匀性体现在整体分布,而非单次请求顺序











