加权轮询配置出错时Nginx静默退化为普通轮询,需从配置解析(weight须为1–1000整数)、版本支持(≥1.3.1且模块启用)、运行时验证(stub_status或日志观测流量分布)三方面排查,并排除keepalive、健康检查及其它hash策略干扰。

加权轮询(Weighted Round Robin)配置出错时,Nginx 往往不会报语法错误,而是静默退化为普通轮询(即均分流量),导致权重失效。排查这类问题需从配置解析、运行时行为和日志验证三方面入手。
检查 upstream 块中 weight 参数是否合法
Nginx 要求 weight 必须是 1–1000 的整数,不支持小数、负数、0 或变量。常见错误包括:
- weight=0.5 → 会被忽略,等效于 weight=1
- weight=${BACKEND_WEIGHT} → 变量不被 upstream 解析,直接忽略
- weight=1.0 或 weight="2" → 字符串或浮点写法无效,只认纯整数
- weight=1001 → 超出上限,按 1000 处理(但通常不是预期行为)
确认 Nginx 版本是否支持 weight(尤其旧版本)
weight 参数自 Nginx 1.3.1 起正式支持,但部分早期稳定版(如 1.2.x)或定制编译版可能未启用 http_upstream_hash_module 相关逻辑。验证方式:
- 执行
nginx -V 2>&1 | grep -o 'with-http-upstream-hash-module',有输出说明模块存在 - 运行
nginx -t不报错 ≠ weight 生效;它只校验语法结构,不校验 weight 值有效性 - 若使用 OpenResty,需注意其默认启用更多模块,但 weight 行为与官方 Nginx 一致
通过 stub_status 或日志观察真实调度行为
仅看配置无法确认是否加权生效,必须观测实际请求分发结果:
- 开启
stub_status(需编译时含 http_stub_status_module),访问/nginx_status查看各 server 的Active和累计Requests,持续压测 1000+ 请求后对比比例 - 在
log_format中加入$upstream_addr和$upstream_bytes_received,分析 access.log 中各后端 IP 出现频次 - 简单验证:临时将某台 server weight 设为 10,其余为 1,理论应占约 77% 流量(10/13);若接近 33%,说明权重未生效
排除 keepalive 和健康检查的干扰
以下配置会覆盖或削弱 weight 效果:
-
keepalive 32;在 upstream 中启用后,连接复用可能导致短时间请求集中到同一后端,掩盖权重分布——需长周期统计(>1 分钟) -
max_fails/fail_timeout导致某节点被标记为 down,剩余节点自动均分,此时 weight 不参与计算 -
ip_hash或hash $request_uri等负载策略与 weight 冲突,优先级更高,会完全禁用 weight


















