nginx默认轮询通过确定性顺序指针实现均匀分发,不依赖响应快慢或负载状态,仅按upstream配置顺序循环调度;需清除weight、ip_hash等干扰配置,统一健康参数,长期统计偏差通常在1%~3%。

Nginx 默认轮询(Round Robin)本身就能实现请求的均匀分发,关键不在“智能”,而在“确定性”——它靠一个轻量、无状态的顺序指针循环调度,只要后端能力接近、配置干净、健康状态稳定,长期统计偏差通常控制在 1%~3% 以内。
轮询是怎么“轮流点名”的
它不看响应快慢、连接数或 CPU 负载,只认 upstream 配置里的服务器顺序和当前指针位置:
- 收到第 1 个请求 → 发给列表第 1 台,指针移到第 2 位
- 收到第 2 个请求 → 发给第 2 台,指针移到第 3 位
- 收到第 3 个请求 → 发给第 3 台,指针到末尾后自动归零
- 故障节点会被跳过(需配合 max_fails 和 fail_timeout),轮询队列动态收缩但顺序不变
为什么有时看起来“不均匀”
短期波动正常,但若长期明显倾斜,大概率是以下配置干扰了原始逻辑:
- 某台 server 行写了 weight=2:立刻退化为加权轮询,不再是均等分配
- upstream 块里启用了 ip_hash 或 hash $request_uri:请求被固定路由,轮询失效
- 某台服务器频繁超时,触发 max_fails=3 fail_timeout=10s 被临时摘除:剩余节点自然承接更多请求
让轮询真正稳住均匀性的实操要点
重点不是加功能,而是做减法、保状态:
- 删掉所有 weight 参数:确保每行 server 都是裸写,如 server 192.168.1.10;,不带等号
- 确认 upstream 块顶部没其他算法指令:比如 ip_hash、least_conn、hash 等必须整行删除,不能仅注释留着
- 给每台 server 配一致的健康探测参数:例如统一写 max_fails=2 fail_timeout=15s,避免某台因阈值宽松而持续接收请求
- 用 access_log 或 $upstream_addr 验证实际分发:日志里能看到每次请求落到哪台 IP,比猜更准
轮询不是万能,但它是好起点
它不解决会话保持,也不适配性能差异大的集群;但它零配置、低延迟、易验证,特别适合新上线服务、同构容器集群或灰度发布初期。把轮询用对了,等于为后续引入 least_conn 或主动健康检查打好了基础。











