Nginx默认轮询实现流量均分的关键是保持upstream配置纯净:删除weight、ip_hash等所有修饰,统一健康检查参数,并通过日志验证循环序列;worker进程独立计数导致短期波动属正常现象。

直接用 Nginx 默认轮询就能在多台 Web 服务器间平均分发流量,关键不是加配置,而是清干扰——让轮询回归最简、确定、可验证的状态。
确保 upstream 配置真正干净
轮询只认 server 行的排列顺序,任何修饰都会改变行为:
- 删掉所有 weight= 参数:哪怕只有一台写了
weight=1,整个组就退化为加权轮询,不再均等 - 彻底移除 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 数量来“修正”轮询,那是误解;均匀性体现在整体分布,而非单次请求顺序


















