轮询本身能实现长期请求量均衡,前提是后端能力接近、健康稳定且配置干净:需删除weight、ip_hash、least_conn等干扰指令,统一健康检查参数,并通过$upstream_addr日志和连接数验证真实分发均匀性。

轮询本身不导致不均,真正影响均匀性的往往是配置细节或运行时状态。只要后端能力接近、健康稳定、配置干净,轮询天然就能实现长期请求量均衡。
清理干扰配置项
轮询最怕“多此一举”,任何额外指令都会覆盖默认行为:
- 删掉所有 weight= 参数:哪怕只有一台写了
weight=2,整个 upstream 就变成加权轮询,不再均等 - 整行移除 ip_hash、least_conn、hash $request_uri 等指令:注释也不行,Nginx 会跳过注释直接解析有效行
- 每台 server 保持最简写法:
server 192.168.1.10:8080;,不带backup、down或隐式修饰
统一健康检查参数
轮询不感知健康状态,但健康检查会动态剔除节点——参数不一致,等于悄悄改变轮询队列长度:
- 为每台 server 显式加上相同探测设置:
max_fails=2 fail_timeout=15s - 避免 A 节点用
max_fails=1、B 节点用max_fails=5这类不对齐配置 - 这样异常时摘除节奏一致,轮询始终在完整列表上循环
识别 keepalive 复用造成的假性不均
后端启用 keepalive 后,单个 TCP 连接可能承载几十次请求,日志只记录请求落点,容易误判为分配不均:
- 查 Nginx 日志中的 $upstream_addr 字段,统计不同 IP:PORT 的独立连接数,而非请求数
- 在 backend 执行
ss -tnp | grep :8080,观察 ESTAB 连接的实际分布 - 若连接集中而请求数看似均匀,说明是 keepalive 复用问题,此时应改用 least_conn 算法
用日志验证真实分发序列
别靠感觉,直接看 Nginx 实际怎么转发:
- 定义日志格式:
log_format upstream_log '$remote_addr - $upstream_addr [$time_local] "$request" $status'; - 发起 20+ 次请求(如
curl循环),检查日志是否呈现严格循环,例如:192.168.1.100 - 192.168.1.10:8080 [...]<br>192.168.1.100 - 192.168.1.11:8080 [...]<br>192.168.1.100 - 192.168.1.12:8080 [...]<br>192.168.1.100 - 192.168.1.10:8080 [...]











