加权轮询通过upstream中server指令的weight正整数参数实现,必须紧接server地址后、仅在upstream块内生效;默认weight=1,设0则临时下线但仍接受健康检查,需nginx -t校验后reload生效。

加权轮询(Weighted Round Robin)是 Nginx 最常用也最实用的负载均衡策略之一,它在默认轮询基础上引入权重控制,让性能更强或资源更充足的后端服务器承担更多请求。但配置不当容易失效或产生意外行为——关键不在“怎么写”,而在于“写在哪、怎么生效、怎么验证”。
权重必须写在 upstream 的 server 行里
weight 参数只在 upstream 块内、紧贴 server 地址之后才有效,其他位置全是无效语法:
- ✅ 正确写法:
server 192.168.1.10:8080 weight=3; - ❌ 错误写法:
server 192.168.1.10:8080; weight=3;(weight 不是独立指令) - ❌ 错误写法:
location / { proxy_pass http://backend; weight=2; }(Nginx 启动直接报 unknown directive)
权重值规则与实际效果
weight 必须是正整数,默认为 1;设为 0 表示该节点不参与轮询,但仍接受健康检查探测。
- 权重影响的是请求分发的概率分布,不是精确计数。比如 weight=3 和 weight=1 的两台服务器,在少量请求下可能连续打到高权重点,属正常现象
- 真实流量比例需在数百次以上请求中统计才趋近理论值(如 3:1)
- 若启用 ip_hash,weight 仅用于故障剔除后的备用选择,不影响 IP 绑定逻辑
组合状态标记提升运维弹性
单靠 weight 解决不了临时维护、扩容降级等真实场景,必须配合 backup、down 等状态标记:
-
server 192.168.1.11:8080 weight=2 backup;:仅当所有非 backup 节点不可用时启用 -
server 192.168.1.12:8080 down;:强制摘除,不参与任何调度(含健康检查) - 注意:backup 节点不参与 ip_hash 计算,但会纳入 round_robin 权重分配逻辑
配置生效前务必验证与观察
改完 weight 后最容易出问题的就是 reload 失败导致服务中断:
- 永远先执行
nginx -t,确认 test is successful 再nginx -s reload - weight 写成负数、小数或字符串会导致
invalid number of the "weight" parameter报错 - 修改后建议用
curl -I http://your-domain/快速验证是否仍返回 200,再查后端 access_log 确认流量是否按预期分发











