Nginx ~ 灰度发布
一、什么是灰度发布?
定义:
灰度发布是指:
在不影响大多数用户的前提下,让少量用户访问新版本服务,用真实流量验证新版本的稳定性。
对比:
| 发布方式 | 风险 |
|---|---|
| 全量发布 | 一挂全挂 |
| 灰度发布 | 小流量试水 |
| 蓝绿发布 | 双环境切换 |
| 回滚 | 秒级恢复 |
二、灰度发布的核心目标
- 防止版本事故
- 支持快速回滚
- 精准控制流量
- 不影响正常用户
- 可监控、可扩展
三、灰度发布的基本架构
用户
↓
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;
}适合:
- 运维/测试人员
- 内部验证
✅ 3. 按 Cookie 灰度(推荐)
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;
}防止:
新版本拖垮系统
九、数据一致性问题(必须注意)
灰度发布时要考虑:
- 数据库兼容性
- 接口兼容性
- Session 共享
- 缓存兼容
- 消息队列兼容
原则:
新旧版本必须同时可用。
十、灰度发布常见失败原因
| 问题 | 原因 |
|---|---|
| 新版本崩溃 | 没监控 |
| 全量事故 | 没灰度 |
| 用户数据错乱 | 数据结构不兼容 |
| 回滚慢 | 没预案 |
十一、进阶方案(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;
}
}
}十三、灰度发布设计原则(运维总监级)
- 可控
- 可监控
- 可回滚
- 可扩展
- 不影响主业务
- 有文档
- 有演练
