可在Nginx中用http块内map指令基于请求头(如$http_x_env)映射变量$upstream_name,配合预定义upstream块实现动态路由;proxy_pass须写为http://$upstream_name,不加路径;支持正则/精确匹配及嵌套map联合判断,并需设default值防502。

可以在 Nginx 中用 map 指令从请求头提取值,映射为变量,再让 proxy_pass 引用该变量实现动态路由。核心是把判断逻辑提前到配置层,而不是在运行时拼接地址。
在 http 块中定义 map 映射
只能在 http 块里定义 map,不能放在 server 或 location 内。常用请求头如 $http_x_env、$http_user_agent、$http_authorization 都可作为输入源:
- 支持正则匹配(
~区分大小写,~*不区分)和精确匹配(=) - 必须设
default值,避免变量未命中时为空导致 502 - 输出变量名要带
$,比如$upstream_name
示例:根据自定义头 X-Env 切集群
map $http_x_env $upstream_name {
default "backend_default";
"prod" "backend_prod";
"staging" "backend_staging";
"dev" "backend_dev";
}
}
配合 upstream 块使用更稳妥
推荐将 map 输出映射为已声明的 upstream 名称,而非直接拼 URL。这样能复用连接池、健康检查等能力,也规避了协议/端口硬编码风险:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
upstream块需提前定义,名称必须与map输出完全一致 -
proxy_pass写法必须是http://$upstream_name或https://$upstream_name,结尾不能带路径 - 如果加了路径(如
http://$upstream_name/api),变量会失效,Nginx 直接报错
示例:
upstream backend_prod {server 10.0.1.10:8080;
}
upstream backend_staging {
server 10.0.2.20:8080;
}
server {
location /api/ {
proxy_pass http://$upstream_name;
proxy_set_header Host $host;
}
}
支持多维度联合判断
单一请求头不够时,可用嵌套 map 实现组合逻辑。比如先按 X-Tenant-ID 分租户,再按 X-Env 分环境:
- 外层
map提取租户,内层用$tenant_env等变量做二次映射 - 所有中间变量仍需在
http块定义,不可在location中临时生成 - 注意变量命名唯一性,避免覆盖
调试与兜底建议
上线前建议加响应头验证路由是否生效:
- 在
location中加add_header X-Upstream $upstream_name;,用 curl 查看返回头 - 若变量为空或解析失败,Nginx 默认返回 502;可加
proxy_next_upstream error timeout http_502;尝试切换 - 避免用
if+set替代map,性能差且易出错

















