一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中负载均衡如何在灰度发布中按比例分流到新旧版本集群

时间:2026-08-22 12:19:48 编辑:袖梨 来源:一聚教程网

Nginx通过upstream的weight参数实现按比例灰度分流,需定义独立v1/v2服务地址、启用加权轮询、避免路由干扰,并支持动态调权与实测验证。

在 Nginx 中用负载均衡实现灰度发布的按比例分流,本质是让新旧版本后端服务以预设权重承接流量,不依赖用户身份或请求内容,适合稳定性初验阶段。关键不是“平均分”,而是通过 upstream 的 weight 参数控制相对流量配比,所有节点行为一致且可动态调整。

用 upstream + weight 实现基础比例分流

这是最轻量、最稳定的灰度方式,适用于 HTTP 层快速验证新版本基础可用性:

  1. 定义两个独立 upstream 块,分别指向旧版和新版服务集群(必须是不同 IP:Port 或域名,不能复用同一地址)
  2. 为每个 server 行设置正整数 weight,数值只看相对大小:比如 v1 weight=19v2 weight=1 就对应 95% : 5%;v1 weight=8v2 weight=2 等效于 80% : 20%
  3. 避免使用过大权重(如 95 和 5),连接复用或调度抖动易导致实际比例偏差
  4. location 中直接 proxy_pass 到该 upstream 名,Nginx 自动按加权轮询分发

确保分流真正生效的三个前提

光写 weight 不等于流量就按比例走了,必须满足:

  1. 实例可区分:v1 和 v2 服务不能共用同一个注册名或 endpoint。例如在 Nacos 中,需给 v1 实例打标 version=1.0,v2 打标 version=2.0;Nginx 配置里则必须写成两个独立 server 地址
  2. 策略已启用:Nginx 默认启用加权轮询,但前提是用了 upstream 块。如果直接 proxy_pass http://a.example.com; 就完全绕过了 weight 机制
  3. 无其他路由干扰:确认没有 if、map 或 rewrite 规则覆盖了该 location 的转发逻辑,否则 weight 分流会被跳过

支持动态调权与平滑过渡

生产环境不能靠手动改配置再 reload,推荐两种实用路径:

  1. nginx-upsync-module 对接 Consul/Nacos,把 weight 值存为 KV 配置项,监听变更后自动更新 upstream 列表
  2. 或采用 Lua 脚本(OpenResty)在运行时读取外部配置,根据当前灰度阶段动态计算 $upstream_group 变量,再 proxy_pass 到对应组
  3. 每次调整前先执行 nginx -t 校验语法,再 nginx -s reload,全程秒级完成,不中断连接

验证分流是否符合预期

别只看配置写了没,要实测结果:

  1. 并发发起大量请求(如用 ab 或 wrk),统计响应头中 X-Served-By 或后端日志里的版本标识,计算 v1/v2 实际占比
  2. 检查 Prometheus 指标 nginx_upstream_requests_total{upstream=~"backend_v1|backend_v2"},观察 1 分钟内计数比是否稳定接近设定值
  3. 准备一键回滚脚本:比如把 v2 的 weight 改为 0,或直接切换 upstream 名称,确保 30 秒内流量全切回 v1

热门栏目