nginx通过upstream块中server指令的weight=正整数参数实现按相对比例分发请求,权重必须定义在http{}内、server{}外,仅对round_robin和ip_hash生效;未配置默认weight=1,设0则临时下线但仍接受健康检查。

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











