nginx 可通过 map 指令提取 cookie 值并映射为上游服务变量,再在 location 中用 proxy_pass 引用该变量实现灰度路由;推荐将 map 放在 http 块中,配合 upstream 定义和 cookie 设置(如 gray=1)完成轻量级灰度发布。

Nginx 的 location 块本身不直接支持基于 Cookie 的路由决策,但可以通过配合 map 指令、if 判断和 proxy_pass(或 return)实现轻量级灰度发布逻辑。核心思路是:提取特定 Cookie 值 → 映射为上游服务标识 → 控制请求流向不同后端。
提取并映射 Cookie 值
使用 map 指令将 Cookie 中的灰度标识(如 gray=1)映射为变量,避免在 location 中重复解析。该方式高效且支持正则匹配,推荐放在 http 块中:
map $cookie_gray $upstream_backend {
default backend-prod;
~^1$ backend-gray;
~^true|yes|on$ backend-gray;
}
$cookie_gray 是 Nginx 内置变量,自动提取名为 gray 的 Cookie 值;~^1$ 表示精确匹配字符串 "1";default 保证未命中时有兜底值。
在 location 中按变量路由
在目标 location 块中,用 proxy_pass 直接引用映射后的变量,无需 if 嵌套,既简洁又避免常见陷阱:
location /api/ {
proxy_pass http://$upstream_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
注意:proxy_pass 后必须带协议(如 http://),且 $upstream_backend 应为 upstream 名称(需提前定义)或具体地址(如 http://10.0.1.10:8080)。
补充:灰度 Cookie 的设置与验证
灰度用户需携带合法 Cookie 才能生效,可通过以下方式确保:
- 前端主动写入
document.cookie = "gray=1; path=/; max-age=3600" - 后端登录接口根据灰度名单返回
Set-Cookie: gray=1; Path=/; Max-Age=3600 - 用浏览器开发者工具或
curl -v -b "gray=1" https://example.com/api/验证路由是否命中灰度后端
进阶控制:结合 IP 或 Header 做多维灰度
若需叠加其他条件(如仅对内网 IP + 灰度 Cookie 用户放行),可在 location 内用 if 做组合判断(注意:仅限简单条件,避免复杂逻辑):
location /api/ {
if ($cookie_gray = "1") {
set $route_to_gray "1";
}
if ($remote_addr ~ "^10\.0\.") {
set $route_to_gray "${route_to_gray}1";
}
if ($route_to_gray = "11") {
proxy_pass http://backend-gray;
break;
}
proxy_pass http://backend-prod;
}
更健壮的做法是用 map 多层嵌套或 Lua(通过 OpenResty),但纯 Nginx 场景下,优先用第一种变量映射方案,保持配置清晰可维护。











