轮询是nginx默认负载均衡策略,按顺序循环分发请求;确保生效需删除weight、ip_hash等干扰指令,统一配置max_fails/fail_timeout实现稳定健康检查,并通过$upstream_addr日志与ab压测验证实际分配均匀性。

轮询本身不需“优化”逻辑,它天然按顺序循环分发请求。所谓优化,其实是排除干扰、保障其稳定发挥——让默认的轮流点名不被意外打断,也不被其他策略覆盖。
确保配置干净,回归纯轮询
轮询是 Nginx 的默认行为,但一加额外参数,它就不再是轮询了:
- 删掉所有 weight= 参数:哪怕只有一台写了
weight=1,整个 upstream 就会进入加权轮询模式 - 移除 ip_hash、least_conn、hash $arg_xxx 等指令:这些会完全覆盖轮询逻辑,必须整行删除,不能仅注释
- 检查 upstream 块顶部是否空着:不能有空行或隐藏字符干扰解析,Nginx 会把首行非 server 的语句当作算法声明
统一健康检查,避免队列动态缩水
轮询均匀的前提是服务器列表稳定。若某台因失败次数超限被临时剔除,剩余节点自然承接更多请求,短期就会看起来“不均”:
- 为每台 server 显式配置相同的容错参数,例如:
max_fails=2 fail_timeout=15s - 避免混用参数:一台写
max_fails=3,另一台没写,默认值可能不同,导致摘除节奏不一致 - 上线前用
nginx -t验证语法,再用curl -I多次请求,观察$upstream_addr响应头变化,确认实际分发路径
配合基础增强项提升实效性
轮询不感知后端状态,但可以靠几个轻量配置让它更贴近真实可用场景:
- 启用 keepalive:在 upstream 块中加
keepalive 32;,复用连接,降低后端建连压力 - 标记维护中节点:用
down标记,如server 192.168.1.11:80 down;,Nginx 会跳过它,不计入轮询序列 - 日志中记录分发目标:在 log_format 中加入
$upstream_addr,便于后续统计各节点请求数,验证是否长期均衡
验证是否真在轮询,别只看配置
配置写对了不等于生效了。真实流量是否按预期走,得靠数据说话:
- 分别查看三台后端的 access.log,用
awk '{print $1}' | sort | uniq -c | sort -nr统计 IP 分布,比对请求数量级是否接近 - 停掉其中一台服务,观察 Nginx error.log 是否出现连续 connect refused,并确认其余节点请求数是否平滑上升
- 用
ab -n 300 -c 10 http://your-domain/压测后查日志,300 次请求在三台间理想分布应为 100±几台,偏差过大说明有配置残留或网络异常











