nginx 通过 upstream 块中 server 指令的 weight 参数实现按能力加权分发,权重为正整数、表示相对服务能力,需置于 http{} 内独立 upstream 定义中,配合健康检查使用才有效。

直接在 upstream 块里为每台后端服务器写 weight=正整数,Nginx 就会按相对比例分发请求——强机器多扛,弱机器少分,不是平均切,而是按能力切。
权重必须写对位置才生效
只能放在 http{} 块内、所有 server{} 外的 upstream 定义中。写错地方,配置要么报错,要么完全不生效。
- ✅ 正确:在
http下单独定义upstream my_backend { server 10.0.1.10:8080 weight=5; } - ❌ 错误:把
upstream塞进server或location里;或proxy_pass直接写 IP(如http://10.0.1.10:8080),绕过 upstream 名称
权重不是百分比,是比例关系
数值本身无单位,只表达节点之间的相对服务能力。Nginx 自动按总和算占比,不需要归一化,也不支持小数或百分比。
- 比如
weight=4和weight=1,实际流量比就是 4:1(约 80% : 20%) - 未写
weight的节点默认为 1;设为 0 表示临时下线,仍接受健康检查 - 推荐统一用 1–100 范围内的整数,避免 2 和 1 这类易放大误差的组合,改用 20 和 10 更稳
怎么定出合理的 weight 数值
不能靠猜测,要结合硬件指标和实测结果来设定。
- 粗估法:以最强节点为基准(如 CPU 核心数 × 内存带宽 × I/O 吞吐),其余按比例折算
- 实测法更准:用
wrk对各后端压测相同并发下的 QPS,直接按 QPS 比例设 weight(例如 QPS 为 1200、480、240 → weight=5:2:1) - 优先参考 P95 响应时间:RT 稳定在 120ms 的节点,比 RT 波动在 800ms 的 weight=5 节点更可靠
必须搭配健康检查,否则权重形同虚设
weight 只管“正常时怎么分”,不管“出问题了怎么办”。没健康检查,一台机器响应变慢甚至假死,请求照打不误。
- 每个
server行建议加上max_fails=2 fail_timeout=30s:连续失败 2 次即标记不可用,30 秒内不再转发 - 可差异化设置:主力机容忍度稍高(
max_fails=3 fail_timeout=45s),备用机更敏感 - 避免与
ip_hash、hash $request_uri等 hash 类算法共用——二者逻辑冲突,weight 将被忽略











