轮询模式本身不会导致不均,真正引发流量倾斜的是配置干扰或运行时状态变化;需清理weight、ip_hash等干扰项,统一健康检查参数,识别keepalive复用假象,并用日志验证严格循环分发。

轮询模式本身不会导致不均,真正引发流量倾斜的,是配置干扰或运行时状态变化。只要后端能力接近、配置干净、健康状态稳定,轮询天然就能做到长期均匀分发。
清理配置干扰项
轮询最怕“画蛇添足”,任何额外指令都会覆盖默认行为:
- 删掉所有 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,单个 TCP 连接可能承载几十次请求,而日志只记录请求落点,容易误判:
- 查 $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'; - 启用记录:
access_log /var/log/nginx/upstream.log upstream_log; - 发起 20+ 次请求(如 curl 循环),检查日志是否呈现严格循环,例如:
192.168.1.10→192.168.1.11→192.168.1.12→192.168.1.10…











