必须配置resolver指令并配合变量使用proxy_pass,resolver需置于http或location块中,valid参数控制DNS缓存时效,变量是触发动态解析的必要开关。

要让 Nginx 对 proxy_pass 中的域名做运行时动态解析(而非仅启动时查一次),必须启用本地 DNS 解析能力,核心是正确配置 resolver 指令并确保它被实际触发。关键不在于“本地 resolver”本身是否在本机运行,而在于 Nginx 能否通过指定的 DNS 服务器实时查询、缓存并更新上游域名对应的 IP。
resolver 必须显式声明且位置正确
resolver 指令需写在能被 proxy_pass 所在作用域“看到”的位置。常见有效位置有两类:
- 放在
http块顶层(推荐):全局生效,适用于大多数场景,尤其配合变量形式的proxy_pass - 放在
location或server块内:局部生效,旧版本 Nginx(
不能写在 upstream、events 或嵌套过深的条件块里,否则 Nginx 会报 no resolver defined 或静默失效。
必须搭配变量使用,静态域名不触发动态解析
仅写 proxy_pass http://api.example.com; 不管有没有 resolver,都只在启动时解析一次。真正触发动态 DNS 查询的唯一可靠方式是让 proxy_pass 的值包含变量:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- ✅ 正确:
set $backend "api.example.com:8080"; proxy_pass http://$backend; - ✅ 正确(用 map 安全映射):
map $arg_env $upstream_host { dev "dev-api.example.com"; prod "prod-api.example.com"; },再proxy_pass http://$upstream_host; - ❌ 错误:
proxy_pass http://api.example.com;(字面量,永远静态) - ❌ 错误:
proxy_pass $backend;(缺协议头,Nginx 不识别为 URL)
协议前缀 http:// 或 https:// 不可省略,否则无法进入 DNS 解析流程。
valid 参数决定动态性是否真实生效
valid 是 resolver 的核心参数,它控制 DNS 缓存的有效期。没有它,Nginx 默认不缓存或缓存行为不可控,容易造成频繁查询或长期不更新:
- 建议设为
valid=10s~valid=60s:兼顾响应及时性与 DNS 压力 - 示例:
resolver 114.114.114.114 8.8.8.8 valid=30s; - 若后端 IP 变更,等待超过
valid时间后,Nginx 会自动发起新查询;可通过 error.log 中resolving api.example.com和resolved to 10.20.30.40日志确认是否成功刷新
补充要点:Host 头与容错处理
动态解析后,Nginx 不会自动把变量中的域名填入请求头 Host,需手动设置:
-
proxy_set_header Host $backend;(若变量含端口,建议用独立变量如$upstream_host)
为防 DNS 查询失败导致 502,可加基础兜底:
proxy_next_upstream error timeout invalid_header http_502;- 必要时加
resolver_timeout 3s;避免单次 DNS 查询阻塞整个请求

















