权重设置不生效的根源在于配置错误或策略冲突:需检查upstream是否混用ip_hash等会话绑定指令导致权重失效;确保所有server显式声明整数weight(≥1);验证nginx版本、配置路径及实际加载的upstream块;最后通过压测和日志统计确认流量分配比例。

权重设置不生效,不是配置写错了就是策略没对上。Nginx 的 weight 参数本身不“自动起效”,它依赖特定的上下文条件才能参与流量分配。
检查 upstream 是否混用了会话绑定指令
只要 upstream 块里出现了 ip_hash、hash $request_uri、hash $cookie_sessionid 这类指令,Nginx 就会强制把同一类请求固定转发到同一台后端——此时权重完全失效,因为调度逻辑已从“按比例分发”变成“按哈希绑定”。
- 删掉或注释掉所有
ip_hash及其他hash行 - 确认没有在 server 行之外写了
sticky或第三方模块的会话保持配置 - 改完后必须执行
nginx -t验证,再nginx -s reload
确认所有 server 都显式声明了 weight
weight 是相对值,未写 weight 的 server 默认为 1,但一旦部分 server 写了 weight,而另一些没写,就容易误判“权重没起作用”。比如:
- 错误写法:
server 192.168.1.10:8000 weight=3;+server 192.168.1.11:8000;→ 实际是 3:1,但你可能以为该是 3:2 - 正确做法:统一写全,如
weight=3、weight=2、weight=1,避免默认值干扰判断 - 注意 weight 必须是整数,且 ≥1;不能写成
weight=0.5或weight=0
验证 Nginx 版本与配置加载路径
weight 在较老版本(
- 运行
nginx -v查看版本,低于 1.9.1 建议升级 - 用
nginx -V 2>&1 | grep "configure arguments"或nginx -V确认实际加载的配置路径(如--conf-path=/etc/nginx/nginx.conf) - 别只改了
/tmp/test.conf或子配置文件却忘了 include,最终生效的可能是主配置里的另一个 upstream 块
观察日志与流量分布是否真实匹配
别只看配置,要验证行为。加权轮询是概率性分配,短时间小流量看不出比例,需持续观测。
- 在每台后端服务加简单日志,记录来源 IP 和时间戳
- 用
ab -n 3000 -c 100 http://your-domain/模拟足够请求数,再统计各后端接收请求数 - 若比例严重偏离(如 weight=3 和 weight=1 的两台,结果接近 1:1),说明权重确实未参与调度,回到前几项重点排查











