Skip to content

Nginx ~ 灰度发布

一、什么是灰度发布?

定义:

灰度发布是指:

在不影响大多数用户的前提下,让少量用户访问新版本服务,用真实流量验证新版本的稳定性。

对比:

发布方式风险
全量发布一挂全挂
灰度发布小流量试水
蓝绿发布双环境切换
回滚秒级恢复

二、灰度发布的核心目标

  1. 防止版本事故
  2. 支持快速回滚
  3. 精准控制流量
  4. 不影响正常用户
  5. 可监控、可扩展

三、灰度发布的基本架构

用户

Nginx (流量控制层)

新版本服务(10%流量)
旧版本服务(90%流量)

Nginx 是流量裁判。

四、灰度发布的常见策略(5 种)

✅ 1. 按比例灰度(最常用)

upstream 配置:

nginx
upstream backend {
    server 10.0.0.1 weight=9;   # 旧版本
    server 10.0.0.2 weight=1;   # 新版本
}

含义:

10% 流量进入新版本

适合:

  • 普通接口
  • 初级灰度

✅ 2. 按 IP 灰度(内部测试)

nginx
map $remote_addr $backend {
    default old_backend;
    192.168.1.100 new_backend;
}

upstream old_backend {
    server 10.0.0.1;
}

upstream new_backend {
    server 10.0.0.2;
}

location /api/ {
    proxy_pass http://$backend;
}

适合:

  • 运维/测试人员
  • 内部验证
nginx
map $cookie_version $backend {
    default old_backend;
    v2 new_backend;
}

upstream old_backend {
    server 10.0.0.1;
}

upstream new_backend {
    server 10.0.0.2;
}

location /api/ {
    proxy_pass http://$backend;
}

访问时:

Cookie: version=v2

优点:

  • 精准控制用户
  • 不影响普通用户

✅ 4. 按 Header 灰度(API 测试)

nginx
map $http_x_version $backend {
    default old_backend;
    v2 new_backend;
}

location /api/ {
    proxy_pass http://$backend;
}

Header:

X-Version: v2

适合:

  • APP
  • 内测版本

✅ 5. 按 URL 路径灰度

nginx
location /v2/ {
    proxy_pass http://new_backend;
}

location / {
    proxy_pass http://old_backend;
}

五、企业推荐组合方案(标准灰度模型)

🎯 推荐策略:

Cookie + 权重 + 白名单

示例:

nginx
map $cookie_user_group $group {
    default old_backend;
    gray new_backend;
}

upstream old_backend {
    server 10.0.0.1 weight=9;
}

upstream new_backend {
    server 10.0.0.2 weight=1;
}

location /api/ {
    proxy_pass http://$group;
}

用户打 Cookie:

user_group=gray

六、灰度发布流程 SOP(运维标准流程)

🟢 Step 1:部署新版本(不切流量)

  • 新服务上线
  • 不暴露给用户
  • 健康检查

🟡 Step 2:内部灰度(1%)

  • IP / Cookie
  • 运维验证

🟠 Step 3:小流量灰度(10%)

  • 权重调整
  • 监控指标

🟢 Step 4:扩大流量(30% → 50% → 100%)

🔴 Step 5:异常回滚(1 行配置)

nginx
server 10.0.0.2 down;

七、灰度发布必须配套的监控指标

必须监控:

  • QPS
  • 错误率(5xx)
  • 接口延迟
  • 新旧版本对比
  • 用户投诉

建议:

  • Grafana
  • Prometheus
  • ELK

八、灰度发布 + 限流 + 熔断(组合拳)

nginx
location /api/ {
    limit_req zone=api_limit burst=20;
    proxy_next_upstream error timeout http_500;
    proxy_pass http://$backend;
}

防止:

新版本拖垮系统

九、数据一致性问题(必须注意)

灰度发布时要考虑:

  1. 数据库兼容性
  2. 接口兼容性
  3. Session 共享
  4. 缓存兼容
  5. 消息队列兼容

原则:

新旧版本必须同时可用。

十、灰度发布常见失败原因

问题原因
新版本崩溃没监控
全量事故没灰度
用户数据错乱数据结构不兼容
回滚慢没预案

十一、进阶方案(OpenResty / Lua 灰度)

Lua 动态规则:

lua
local user = ngx.var.cookie_user
if user == "test" then
   ngx.var.backend = "new_backend"
else
   ngx.var.backend = "old_backend"
end

实现:

动态规则无需 reload。

十二、完整企业级灰度配置模板(推荐)

nginx
http {
    map $cookie_release $backend {
        default old_backend;
        gray new_backend;
    }

    upstream old_backend {
        server 10.0.0.1 weight=9;
    }

    upstream new_backend {
        server 10.0.0.2 weight=1;
    }

    server {
        listen 80;

        location /api/ {
            proxy_pass http://$backend;
            proxy_connect_timeout 3s;
            proxy_read_timeout 10s;
        }
    }
}

十三、灰度发布设计原则(运维总监级)

  1. 可控
  2. 可监控
  3. 可回滚
  4. 可扩展
  5. 不影响主业务
  6. 有文档
  7. 有演练