Nginx加权轮询配置错误主要因weight位置不当、混用冲突指令或值非法:必须写在upstream中server同一行末尾,仅支持正整数,且只对默认轮询和ip_hash生效;需用nginx -t验证语法并结合日志统计分流比例确认实效。

加权轮询配置出错,Nginx 通常直接启动失败或权重不生效,问题多集中在语法细节上。排查要从配置写法、上下文位置、验证方式三方面入手,而不是猜逻辑。
检查 weight 是否写在正确位置
weight 必须和 server 地址在同一行末尾,中间不能换行、不能有额外空格或符号:
- ✅ 正确:
server 192.168.1.10:8080 weight=3; - ❌ 错误:
server 192.168.1.10:8080;<br>weight=3;
(Nginx 报 unknown directive "weight") - ❌ 错误:
server 192.168.1.10:8080 weight = 3;(等号两侧有空格,报 invalid number of arguments) - ❌ 错误:
proxy_pass http://backend; weight=2;(weight 不允许出现在 location 或 proxy_pass 后)
确认 upstream 块内没混入冲突指令
weight 只在轮询(默认)或 ip_hash 模式下有效,和其他算法共存会失效或报错:
- 删掉 upstream 块开头的
round_robin;、least_conn;等——Nginx 不识别,直接启动失败 - 避免同时用
ip_hash和weight:虽然语法通过,但 weight 在节点失效时才起备用作用,日常请求仍按 IP 哈希绑定,权重形同虚设 - backup 节点不能设 weight:
server 192.168.1.13 backup weight=1;会报错
验证语法与运行态是否一致
改完配置别急着 reload,分两步确认:
- 先执行
nginx -t:能过说明语法无硬错误;不过则看报错行号,90% 是 weight 写错行或拼写错误(如wieght) - 再查日志是否真按权重分流:开启
$upstream_addr日志字段,发 50+ 请求,统计各后端出现次数。比如 weight=3:2:1 的三台,理想比例是 50% : 33% : 17%,偏差超 ±5% 就要回头查 - 临时停掉一台高权重节点,观察流量是否自动切到其余节点且无超时——这能反向验证 max_fails/fail_timeout 是否与 weight 配套生效
注意 weight 值本身的合法性
weight 不是任意数字都能用:
- 只接受正整数,
weight=0合法(节点不参与调度但接受健康检查),weight=2.5、weight=-1、weight=abc全部导致nginx -t失败 - 设为 0 后,该节点不会出现在轮询序列里,但如果你依赖它做监控探测,得确保 fail_timeout 设置合理,否则可能误判为宕机
- 所有未写 weight 的 server 默认为 1,所以
server a; server b weight=2;实际是 1:2,不是“只有 b 有权重”


















