Nginx可通过resolver配合变量实现后端域名动态解析,需在http块配置resolver、proxy_pass必须为“协议+变量+端口”格式且不带路径,变量应通过map等安全方式构造并确保合法可解析。

可以通过 Nginx 的 proxy_pass 指令配合变量实现后端域名的动态解析,但需注意:Nginx 默认在启动/重载时静态解析 upstream 域名,若想运行时按请求动态解析(比如根据 header、参数或路径拼出不同后端域名),必须启用 resolver 并使用变量形式的 proxy_pass,且不能写死在 upstream 块中。
必须配置 resolver 指令
Nginx 只有在显式声明 resolver 后,才支持对变量中的域名做运行时 DNS 解析。否则即使写了 $backend_host,也会报错 “invalid URL prefix” 或直接拒绝加载配置。
- resolver 需指定可用的 DNS 服务器,例如:
resolver 8.8.8.8 114.114.114.114 valid=30s; -
valid参数控制 DNS 缓存时间,避免频繁查询;太短会增加 DNS 压力,太长不利于后端 IP 变更的及时感知 - resolver 必须放在
server或location块外(通常置于http块顶层),不可嵌套在 location 内
proxy_pass 必须使用变量且不含 URI 路径
当 proxy_pass 值包含变量时,其格式必须是「协议 + 变量域名 + 可选端口」,不能带固定路径(如 http://$host/api 是非法的),否则 Nginx 无法正确拼接请求 URI。
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
- ✅ 正确写法:
proxy_pass http://$backend_host:$backend_port; - ❌ 错误写法:
proxy_pass http://$backend_host:8080/v1;(带路径会导致 404 或转发异常) - 若需重写路径,应配合
rewrite或proxy_redirect,或用proxy_pass不带路径 +proxy_set_header Host $backend_host;
变量值需确保可解析且合法
用于 proxy_pass 的变量(如 $backend_host)必须在运行时能稳定生成合法域名(不含空格、特殊字符、协议头),且该域名真实可被 resolver 解析。
- 可通过
set、map、if(慎用)或内置变量(如$arg_backend、$http_x_backend)构造 - 建议用
map提前定义安全映射,避免注入风险,例如只允许预设的几个后端别名转为真实域名 - 若变量为空或解析失败,Nginx 默认返回 502;可加
proxy_next_upstream error timeout invalid_header http_502;做基础兜底
完整最小可运行示例
以下配置实现:根据请求头 X-Backend-Host 动态代理到对应域名,带 DNS 实时解析和基本校验:
http {
resolver 8.8.8.8 valid=10s;
map $http_x_backend_host $backend_upstream {
default "default.example.com";
"api-v1" "svc-v1.internal.cluster";
"api-v2" "svc-v2.internal.cluster";
}
server {
listen 80;
location / {
set $backend_host $backend_upstream;
set $backend_port 80;
proxy_pass http://$backend_host:$backend_port;
proxy_set_header Host $backend_host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}










