权重参数不提升单台服务器性能,但能按后端真实能力分配流量,避免强机空转、弱机过载,提升集群资源利用均衡度;必须写在upstream的server行中且紧跟IP和端口,数值为正整数,默认1,设0则不参与轮询但接受健康检查;应基于实测吞吐或CPU核数设定相对比值,避免极端比例;必须搭配max_fails和fail_timeout健康检查机制;响应时间波动大时可改用least_conn或ip_hash等策略,OpenResty支持Lua动态调整权重。

权重参数本身不提升单台服务器性能,但它能让流量按后端真实能力分配,避免强机空转、弱机过载,从而提升集群整体资源利用均衡度。
权重必须写在 upstream 的 server 行里
weight 只在 upstream 块内生效,且必须紧跟 IP 和端口之后:
- ✅ 正确写法:
server 10.0.0.1:8080 weight=4; - ❌ 错误写法:写在 location 或 proxy_pass 后;或单独成行如
server 10.0.0.1:8080;再另起一行写weight=4; - ❌ 数值无效:小数(
weight=2.5)、负数、字符串都会导致nginx -t报错 - weight 默认为 1;设为 0 表示不参与轮询,但仍接受健康检查探测
按可测指标设权重,不是凭感觉
权重是相对比值,应基于实测吞吐或硬件能力设定:
- 用
wrk或ab对每台后端压测相同接口,记录稳定吞吐量(req/s)——A 能扛 1200,B 能扛 300 → 吞吐比 4:1 → weight 设为 4 和 1 - CPU 核数差异明显(如 16C vs 4C),可先按核数比粗设为 4:1,再结合压测微调
- weight=5:3:2 和 weight=10:6:4 效果完全一致,Nginx 自动归一化计算比例
- 避免极端比例(如 100:1),否则小权重节点长期闲置,失去冗余价值
必须搭配健康检查,否则权重失效
weight 不感知响应时间或 CPU 使用率,没健康检查就等于把请求持续发给已卡死的机器:
- 每个 server 行都加上:
max_fails=3 fail_timeout=30s -
max_fails=3:连续 3 次超时或返回 5xx 就标记为不可用 -
fail_timeout=30s:30 秒内不再转发,之后自动试探恢复 - 节点被踢出后,剩余健康节点会按各自权重重新归一化分担流量
单一权重不够时,换更贴近业务的策略
当后端响应时间波动大、或存在长耗时任务时,纯 weight + round_robin 容易倾斜:
-
least_conn:优先发给当前活跃连接最少的节点,适合长连接或处理时长差异大的场景 -
ip_hash:同一客户端固定打到同一后端,适用于需会话保持但又不想强依赖 session 共享的业务 - 若用 OpenResty,可用 Lua 每 2–5 秒探测延迟,按
weight = base × (ref_rt / actual_rt)²动态重算并内存更新,毫秒级生效


















