可通过Nginx的$cookie_变量结合map指令和upstream实现基于Cookie值的动态路由:先用map将$cookie_cluster_id映射为$backend_cluster变量,再在proxy_pass中直接引用该变量指向对应upstream集群,支持正则匹配、降级默认分支及灰度调试。

可以通过Nginx的$cookie_变量结合map指令和upstream动态选择,实现基于Cookie值路由到不同后端集群。核心在于将Cookie解析为可判断的变量,再用该变量控制proxy_pass目标。
提取并映射Cookie值
Nginx本身不支持直接在proxy_pass中写条件逻辑,需先用map把Cookie内容转为命名变量。例如,识别名为cluster_id的Cookie:
map $cookie_cluster_id $backend_cluster {
default "default_cluster";
"blue" "blue_cluster";
"green" "green_cluster";
"~^dev-.*" "dev_cluster"; # 支持正则匹配开发环境
}注意:map必须定义在http块内,且变量名不能含短横线(如$backend-cluster非法)。
定义多个后端集群
使用upstream分别声明各业务集群,支持健康检查与负载均衡:
upstream default_cluster {
server 10.0.1.10:8080 max_fails=2 fail_timeout=30s;
server 10.0.1.11:8080 max_fails=2 fail_timeout=30s;
}
<p>upstream blue_cluster {
server 10.0.2.10:8080 weight=3;
server 10.0.2.11:8080;
}</p><p>upstream green_cluster {
server 10.0.3.10:8080;
server 10.0.3.11:8080;
}</p><p>upstream dev_cluster {
server 127.0.0.1:9000;
}</p>在location中动态代理
利用上一步生成的$backend_cluster变量,直接用于proxy_pass:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://$backend_cluster;
proxy_redirect off;
}
}
该方式无需if判断,避免Nginx中if + proxy_pass的已知限制问题。请求进来时,Nginx自动根据Cookie值查表选择对应upstream。
补充:支持降级与灰度调试
可添加Header透传和日志标记,便于追踪路由路径:
- 在
location中加入proxy_set_header X-Cluster-Used $backend_cluster;,后端可记录或校验 - 用
log_format扩展日志,输出$cookie_cluster_id和$backend_cluster,方便排查误匹配 - 若Cookie为空或无效,
default分支确保流量落入主集群,避免502











