nginx权重灰度发布通过upstream的weight参数实现粗粒度流量分流,如v1 weight=20、v2 weight=1达成约95%:5%比例,需配合日志验证、渐进调权与容错配置,但不支持用户级精准路由。

用 Nginx 后端集群配置权重实现灰度发布,本质是通过 upstream 模块的 weight 参数控制流量比例,让新版本服务承接预设的小部分请求,其余仍走旧版。这种方式轻量、稳定、无需额外组件,适合快速验证新版本基础可用性。
明确权重配比与实际分流逻辑
权重不是百分比,而是相对值。比如要将 5% 流量导给新版本,可设旧版 weight=19、新版 weight=1(19:1 ≈ 95%:5%);若设为 weight=95 和 weight=5,反而因连接复用或四舍五入导致实际偏差增大。
- 建议从较小基数起步,例如 v1 weight=20、v2 weight=1,后续可平滑调高
- 确保新旧服务部署在不同 IP/端口或通过独立域名区分,否则无法独立路由
- 默认采用加权轮询(weighted round-robin),无需额外声明负载策略
配置多版本 upstream 并绑定到 location
在 http 块中定义带权重的 upstream,再在 server 的 location 中通过 proxy_pass 引用:
upstream backend {
server 192.168.1.10:8080 weight=20; # v1 旧版本
server 192.168.1.11:8080 weight=1; # v2 新版本
}
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}}
- 配置完成后执行
nginx -t && nginx -s reload生效 - 单台 Nginx 节点生效即可,但生产环境建议集群所有节点同步配置
- 若某后端宕机,Nginx 会自动剔除,建议配合
max_fails=1 fail_timeout=10s提升容错能力
验证与渐进式调整策略
权重灰度不提供用户级精准控制,验证重点在于整体流量分布是否符合预期,以及新版本服务的稳定性表现:
- 用 ab 或 wrk 发起大量请求,统计后端 access log 中各节点命中次数,确认比例接近设定值
- 监控新版本服务的错误率、响应时间、CPU 和内存使用情况,异常时立即降权或置零
- 无问题后按阶段提升权重:1→3→10→20→…→100,每次调整间隔建议不少于 30 分钟
- 保留一键回滚能力,例如提前备份旧配置,或用 Ansible/脚本快速恢复 weight 值
局限性与适用边界
权重方案简单有效,但只适用于 HTTP 层粗粒度分流,无法满足以下需求:
- 按用户 ID、设备类型、地域或特定 Header/Cookie 精准路由
- 同一用户多次请求始终打到同一版本(会话一致性)
- 动态规则变更(如临时放行某 IP 段),需重启或依赖外部配置中心
- 复杂组合策略(例如“内部 IP + 特定 Cookie”才进灰度)
如需上述能力,应转向 map + upstream 分组 + 动态 proxy_pass 的方式,或接入 Consul/Nacos 实现热更新。











