resolver 是 nginx 正向代理解析域名的关键指令,必须在 location 或 server 块内显式配置,不可继承;需配合 valid 参数启用 dns 缓存,并支持多 dns 地址顺序尝试。

在 Nginx 中配置正向代理时,resolver 指令不是可选项,而是关键依赖——它决定了 Nginx 能否正确解析上游服务器的域名。没有它,proxy_pass 后跟域名(如 http://api.example.com)会直接报错“invalid URL prefix”或 502;即使写成 IP,也丧失灵活性和可维护性。
resolver 必须显式声明,且位置有讲究
resolver 不能放在 http 块顶层就万事大吉。它必须出现在实际发起 DNS 查询的上下文中:即 location 或 server 块内,且紧邻使用域名的 proxy_pass 指令。Nginx 不会向上继承 resolver 配置。
- ✅ 正确写法:
location /api/ {<br> resolver 8.8.8.8 valid=30s;<br> proxy_pass http://backend-api.example.com;<br>} - ❌ 错误写法(resolver 在 http 块里,location 内无 resolver):
http {<br> resolver 8.8.8.8;<br> server {<br> location /api/ {<br> proxy_pass http://backend-api.example.com; # ❌ 无 resolver,解析失败<br> }<br> }<br>}
valid 参数决定缓存行为,避免频繁查询或过期失效
DNS 解析结果默认不缓存,每次请求都查一次——这不仅拖慢响应,还可能触发上游 DNS 限流。用 valid=TIME 显式启用缓存,并设合理 TTL:
-
valid=30s:适合后端 IP 经常变动的场景(如容器服务、蓝绿发布) -
valid=5m:通用推荐值,平衡时效性与负载 -
valid=1h:仅适用于 IP 极其稳定的传统部署,但风险是故障切换延迟高
注意:valid 不影响 DNS 服务器返回的原始 TTL,而是强制覆盖为指定值;Nginx 自己管理缓存生命周期,无需额外进程。
支持多个 DNS 服务器,但不自动 failover
resolver 可列出多个地址,用空格分隔,例如:resolver 114.114.114.114 8.8.8.8 1.1.1.1 valid=30s;。但 Nginx 并非轮询或健康探测式容灾——它按顺序尝试,第一个能连通的 DNS 就用,后续地址仅在前一个不可达时启用(超时或拒绝连接),不因解析失败(如 NXDOMAIN)而跳转。
- 若主 DNS 返回 “域名不存在”,Nginx 不会换下一个 DNS 重试,直接报 502
- 若主 DNS 连接超时(如网络中断),则尝试第二个,依此类推
- 建议优先选本地 DNS 或内网 DNS(如 CoreDNS),减少外网依赖
正向代理中 resolver 的特殊注意事项
严格来说,Nginx 官方不原生支持通用正向代理(HTTP CONNECT 方法),需配合第三方模块(如 ngx_http_proxy_connect_module)。但即使在此类增强场景下,resolver 的作用逻辑不变:
- 对普通 HTTP/HTTPS 请求(非 CONNECT),仍靠
resolver + proxy_pass解析目标域名 - 对 CONNECT 请求(如浏览器访问 HTTPS 站点),目标域名来自客户端 CONNECT 请求行(如
CONNECT example.com:443 HTTP/1.1),此时 resolver 用于解析该域名,供 Nginx 建立隧道 - 务必确认所用模块版本兼容当前 Nginx,并在
location中为 CONNECT 请求路径单独配置 resolver
不复杂但容易忽略:resolver 是正向代理能“认出域名”的前提,不是配了就能用,得配对、配稳、配活。










