Nginx 可通过 Cookie 实现灰度发布:先定义 stable/beta 两组 upstream,再用 map 指令根据 $cookie_version 值映射 $backend_group,最后在 location 中 proxy_pass 动态路由至 backend_$backend_group。

用 Nginx 实现基于 Cookie 的灰度发布,核心是让 Nginx 根据用户请求中特定 Cookie 的值(比如 version=beta)决定将流量转发到不同后端服务(如 stable 或 beta 集群),无需修改业务代码,轻量可控。
配置 upstream 区分灰度与正式集群
先定义两组后端服务,明确标识用途:
upstream backend_stable {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
upstream backend_beta {
server 192.168.1.20:8080;
server 192.168.1.21:8080;
}
确保各组服务已就绪且可独立访问,IP 和端口按实际环境调整。
通过 map 指令提取并判断 Cookie 值
利用 Nginx 内置的 map 模块,将 Cookie 中的版本标识映射为一个变量,便于后续条件路由:
map $cookie_version $backend_group {
default "stable";
"~*beta" "beta";
"~*v2" "beta";
}
$cookie_version自动获取请求头中名为version的 Cookie 值~*beta表示不区分大小写的正则匹配,支持version=beta、version=BETA等default是兜底策略,未命中时走 stable 流量
在 location 中按变量选择 upstream
在 server 块的 location 内,用 proxy_pass 动态指向对应 upstream:
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://backend_$backend_group;
}
注意:http://backend_$backend_group 中的变量拼接依赖于 Nginx 1.3.10+,旧版本需改用 if + rewrite 或 Lua 扩展。
可选:支持手动触发灰度(如带参 URL 或 Header)
增强灵活性,可叠加其他触发条件:
- 允许 URL 中带
?version=beta覆盖 Cookie - 识别特定请求头(如
X-Gray-Mode: beta)优先级高于 Cookie - 结合 IP 白名单,仅对内部测试人员开放灰度入口
这类扩展建议统一收口到 map 定义中,保持主逻辑简洁。