Nginx upstream 的 weight 仅支持静态流量分配,无法直接用于动态压力测试;可通过临时注释、map 路由或 backup 配合高 weight 实现定向压测,但需注意 ip_hash 等指令会覆盖 weight。

在 Nginx 中,upstream 模块本身不支持直接对单个 server 设置 weight 用于“压力测试”目的的动态流量倾斜——weight 是静态负载均衡权重,用于长期流量分配,不是压测开关。但你可以通过组合配置+临时调整,让某台后端节点承接远高于平均的请求量,从而实现近似“定向压力测试”的效果。
理解 weight 的实际作用
weight 影响的是 round-robin 算法中每个 server 被选中的概率比例。例如:
server 192.168.1.10:8080 weight=1;server 192.168.1.11:8080 weight=9;
理论上约 90% 请求会打到 1.11,10% 到 1.10。这可用于模拟“给某节点施加高负载”,但需注意:
– weight 不保证绝对精确比例(尤其请求数少时);
– 它不隔离其他节点,所有节点仍在线,只是分流量不均;
– 无法自动恢复,需手动改回原值。
更稳妥的压力测试替代方案
若目标是仅向特定节点发压、完全绕过其他节点,推荐以下方式:
- 临时注释其他 server 行:在 upstream 块中只保留待压测节点,reload Nginx,压测完再还原;
-
使用 map + proxy_pass 动态路由:配合自定义 header 或参数(如
?target=stress),将匹配请求强制转发到指定地址; -
结合健康检查与 backup 标记:把非压测节点设为
backup,主节点设高 weight,确保流量几乎全走主节点(需关闭健康检查或确保主节点始终 healthy)。
实操建议:安全可控的压测流程
不要直接在生产环境改 weight 做压测。推荐步骤:
- 在预发布或测试环境复现相同 upstream 配置;
- 用
curl -H "Host: test.example.com" http://nginx-ip/验证路由是否符合预期; - 用 ab / wrk / hey 工具发起并发请求,观察目标节点 CPU、内存、响应延迟变化;
- 记录 Nginx access log 中 $upstream_addr 字段,确认 95%+ 请求确实命中目标 IP;
- 压测结束立即 reload 回原始配置,避免影响后续发布。
补充:weight 不起作用的常见原因
如果发现 weight 设了但流量依然均匀,检查:
- 是否启用了
ip_hash或hash $request_uri等会覆盖 weight 的指令; - 是否配置了
max_fails/fail_timeout导致某节点被标记为不可用; - Nginx 版本是否低于 1.9.1(旧版 weight 在某些调度策略下表现异常);
- 是否误写成
weigth等拼写错误,导致配置被忽略。

















