Nginx通过upstream的weight参数实现异构服务器按能力分摊流量,权重为相对值(如4:1即80%:20%),必须置于http块内、server外,proxy_pass需用http://upstream_name格式,并建议搭配健康检查与监控验证实际配比。

用 upstream 的 weight 参数实现异构服务器请求配比,关键是让不同性能的后端按能力分摊流量——不是平均分,而是按比例分。权重值本身不归一化,Nginx 内部按相对大小自动算出请求占比,比如 weight=4 和 weight=1 的两台机器,实际请求比例就是 4:1,即前者承担约 80% 的请求。
weight 必须写在 http 块内,且独立于 server
upstream 块不能嵌套在 server 或 location 里,必须放在 http{} 范围下、所有 server 块之外。否则配置会加载失败或权重不生效。常见错误是把它误放在某个 server 块内部,导致 Nginx 启动报错或退化为普通轮询。
- 正确位置:http { upstream my_backend { ... } server { ... } }
- 错误位置:server { upstream my_backend { ... } }
- 每个 server 行后直接跟 weight=正整数,例如:server 192.168.1.10:8080 weight=4;
proxy_pass 必须引用 upstream 名称,且带 http:// 前缀
location 中使用 proxy_pass 时,地址必须是 http://upstream_name 格式。写成具体 IP+端口(如 http://192.168.1.10:8080)或漏掉协议头(如 my_backend),都会使 weight 完全失效,变成无权重代理。
- ✅ 正确:proxy_pass http://my_backend;
- ❌ 错误:proxy_pass http://192.168.1.10:8080; 或 proxy_pass my_backend;
- 建议同时设置:proxy_set_header Host $host; 和 proxy_set_header X-Real-IP $remote_addr;,保留原始请求上下文
结合健康检查与动态调优更可靠
weight 是静态概率权重,不代表实时负载。单靠 weight 无法应对节点临时卡顿或响应变慢。应搭配 max_fails 和 fail_timeout 实现基础健康检查,避免请求持续打到异常节点上。
- 例如:server 192.168.1.10:8080 weight=4 max_fails=2 fail_timeout=30s;
- weight=0 可临时下线某节点,无需注释或删除配置
- 未声明 weight 的 server 默认为 1;数值建议控制在 1–100 之间,便于团队协作和后续调整
验证实际配比是否符合预期
上线后不能只看配置,要验证真实流量分布。可通过以下方式确认:
- 运行 nginx -T | grep -A 5 "upstream" 检查配置是否被正确加载
- 启用 stub_status 模块或接入 nginx-exporter + Prometheus,查看各 upstream server 的 requests 计数,计算实际占比
- 观察后端 CPU、P95 延迟等指标,若某台旧机延迟明显上升,可微调其 weight(如从 3 降到 2),新机同步微调保持总比例合理











