Nginx权重调度是实现灰度发布的最轻量稳定方式,通过upstream中weight参数按相对比例(如20:1)分发流量,适合小规模验证;但仅支持整体流量切分,不支持基于Cookie、Header等用户级精细化路由。

权重调度是 Nginx 实现灰度发布的最轻量、最稳定的方式,它不依赖额外组件,直接在 upstream 模块中通过 weight 参数控制流量比例,适合快速落地小规模验证。
权重不是百分比,而是相对比例
weight 值本身没有单位,只表达后端节点之间的相对服务能力。比如:
- v1(老版本)设为 weight=95,v2(新版本)设为 weight=5 → 理论分流约 5% 到 v2
- 但更推荐用 weight=19 和 weight=1,因为小基数能减少连接复用或四舍五入带来的实际偏差
- 只要比例一致(95:5 ≡ 19:1 ≡ 380:20),Nginx 的平滑加权轮询算法就会按该比例分发请求
配置关键点:upstream + proxy_pass + 健康检查
必须把后端服务定义在 upstream 块中,并确保每个 server 地址可区分(不同 IP、端口或域名):
- upstream 中写明各版本地址与 weight,例如:server 10.0.1.10:8000 weight=20; 和 server 10.0.1.11:8000 weight=1;
- server 块里用 proxy_pass http://backend; 指向该 upstream 名称
- 建议加上 max_fails=1 fail_timeout=10s,让 Nginx 在单次失败后暂停转发,避免瞬时故障放大影响灰度效果
动态调权要平滑,别跳变
灰度不是“开/关”,而是渐进过程。每次调整后都应观察监控指标(错误率、延迟、成功率):
- 初期从 weight=20 : 1(≈4.8% 新版本)起步,确认稳定后再改为 weight=9 : 1(≈10%)
- 避免从 1 直接跳到 50——权重突变会导致流量抖动,可能触发下游限流或数据库压力尖峰
- 每次 reload 配置前执行 nginx -t 校验语法,再用 nginx -s reload 生效
它能做什么,不能做什么
权重调度适合场景明确、无需用户粒度控制的灰度阶段:
- ✅ 快速验证新版本基础可用性、接口兼容性、资源消耗
- ✅ 在无 Lua 或网关组件的环境中低成本上线
- ❌ 不支持按 Cookie、Header、IP 或用户 ID 路由(这类需 map + if 或 Lua)
- ❌ 无法实现“某类用户固定走新版本”,只能做整体流量切分


















