weight是Nginx upstream中设置后端服务器相对权重的参数,默认为1,用于加权轮询分发请求;若不显式配置,新旧服务器将被同等对待,导致旧机过载、新机闲置,需按性能比例(如新机10、旧机4)合理设置,并配合health_check、max_conns等指令提升稳定性。

在新旧服务器混合部署的场景中,Nginx 的 weight 指令是实现流量按能力分配最直接有效的方式——它不依赖外部组件,配置简单,且能快速响应性能差异。
weight 是什么,为什么不能只靠默认轮询
weight 是 Nginx upstream 模块中用于设置后端服务器权重的参数,默认值为 1。当所有 server 的 weight 相同,Nginx 使用加权轮询(weighted round-robin)算法分发请求;但若不显式设置,老旧服务器和新服务器会被同等对待,导致旧机过载、新机闲置。
比如一台 4 核 8G 的新服务器和一台 2 核 4G 的旧服务器,理论上处理能力约差 2 倍。若都设为 weight=1,旧机可能提前打满 CPU,而新机负载不足 50%。
如何合理设置 weight 值
weight 不是百分比,也不是绝对性能值,而是相对比例。设定时建议参考以下几点:
- 以性能最强的服务器为基准(如设为 weight=10),其余按估算能力折算,例如旧机约为新机的 40%,就设为 weight=4
- 避免使用过小的整数(如 1 和 2),容易放大微小配置误差;推荐统一乘以 10 或 100,提升调节精度
- 上线前用
ab或wrk对单台后端压测,记录相同并发下的吞吐量(QPS),按 QPS 比例设 weight 更可靠 - weight 只影响新连接分配,已建立的长连接(如 WebSocket、Keep-Alive)不受影响,需结合
max_conns或健康检查做兜底
配合其他指令提升稳定性
仅靠 weight 不足以应对真实生产环境。建议组合使用:
- health_check:启用主动健康检查,自动摘除响应超时或返回错误码的节点,防止旧机故障拖累整体
- max_conns:限制每台后端最大并发连接数(尤其对内存/线程敏感的旧服务),避免突发流量压垮旧机
-
slow_start:对刚恢复或新加入的服务器启用缓慢加量(如
slow_start=30s),防止冷启动冲击 - ip_hash 或 hash $request_uri consistent:如需会话保持,优先选一致性哈希而非 ip_hash,减少因 weight 调整引发的缓存失效风暴
验证与动态调整技巧
配置生效后,不能只看日志,要结合指标确认效果:
- 用
nginx -T | grep -A 5 "upstream"确认 weight 已加载 - 通过
stub_status或 Prometheus + nginx-exporter 查看各 upstream server 的requests和responses计数,计算实际请求占比是否接近 weight 比例 - 观察各后端的 CPU、内存、响应延迟(如通过 Grafana 看 P95),若旧机延迟明显上升,适当下调其 weight(如从 4→3),新机可同步微调
- 支持热重载,修改 weight 后执行
nginx -s reload即可生效,无需重启进程
不复杂但容易忽略:weight 是静态比例,无法自动感知实时负载。高可用场景下,建议后续引入动态上游(如基于 Consul 或 Nginx Plus 的动态解析),但对大多数中小规模迁移项目,手工配 weight 已足够稳健高效。



















