Nginx 的 map 指令可实现基于 Cookie 的灰度路由,通过将 $cookie_gray 映射为 $backend_group 变量,再在 proxy_pass 中动态指向 backend_$backend_group 对应 upstream,无需 Lua,高效且配置集中。

用 Nginx 的 map 指令实现基于 Cookie 的灰度路由,本质是把用户请求里的特定 Cookie 值,映射成一个后端分组变量,再让 proxy_pass 动态指向对应 upstream。整个过程不依赖 Lua 或外部模块,配置集中、执行高效、逻辑清晰。
定义明确的后端服务分组
先在 http 块中声明两组(或更多)upstream,命名需体现用途,比如:
upstream backend_stable { server 10.0.1.10:8080; server 10.0.1.11:8080; }upstream backend_canary { server 10.0.1.20:8080; server 10.0.1.21:8080; }
确保每组后端已就绪、可独立访问,IP 和端口按实际环境填写。建议开启健康检查,避免单点故障影响灰度判断。
用 map 提取并分类 Cookie 值
map 必须放在 http 块顶层,它会根据请求中的 $cookie_XXX 变量做匹配,并输出一个新变量(如 $backend_group):
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
map $cookie_gray $backend_group { default "stable"; "1" "canary"; "~*beta" "canary"; "~*v2" "canary"; }
说明:
– $cookie_gray 自动提取名为 gray 的 Cookie 值(注意大小写敏感,Gray 不匹配)
– "1" 是精确匹配,适合开关型灰度(如 gray=1)
– ~*beta 是忽略大小写的正则,能匹配 beta、BETA、beta-test 等
– 匹配顺序从上到下,首个命中即停止,default 是兜底值
在 location 中动态代理到对应后端
在 server 的 location 块里,直接使用映射后的变量拼接 proxy_pass:
location / { proxy_pass http://backend_$backend_group; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
关键点:
– http://backend_$backend_group 依赖 Nginx ≥ 1.3.10,旧版本不支持变量拼接,需改用 if + rewrite 或 Lua
– 不要加斜杠结尾(如 http://backend_canary/),否则可能引发路径重写异常
– proxy_set_header 保留原始信息,便于后端日志追踪和调试
增强灵活性:支持多条件叠加
单一 Cookie 有时不够灵活,可通过组合变量实现更精细控制。例如,让内网 IP 用户强制走灰度,同时允许外网用户按 Cookie 白名单进入:
map "$cookie_gray:$remote_addr" $backend_group { default "stable"; "~*1:192\.168\." "canary"; "~*beta:10\.0\." "canary"; "~*1:.+" "canary"; }
说明:
– "$cookie_gray:$remote_addr" 将两个变量拼成字符串作为匹配源
– ~*1:192\.168\. 表示 Cookie 为 1 且来源 IP 属于内网段
– 正则中点号需转义,避免误匹配
– 这种方式避免了在 location 里嵌套多个 if,更稳定也更易维护










