nginx的resolver指令必须与含变量的proxy_pass同处location或server块内才生效,仅写在http块顶层不被继承;需配valid=参数控制缓存时效、resolver_timeout防阻塞、ipv6=off避冗余查询。

Nginx 的 resolver 指令用于指定它向哪个 DNS 服务器发起域名查询,不是可有可无的配置项,而是决定 proxy_pass 能否正确解析域名的关键前提。
必须写在能触发 DNS 查询的位置resolver 不能只放在 http 块顶层就认为全局生效。它必须出现在实际用到域名的上下文中:即 location 或 server 块内,并且要和 proxy_pass(尤其是含变量的写法)处于同一作用域。Nginx 不会向上继承 resolver,写错位置等于没写。
-
✅ 正确示例(在 location 内显式声明):
location /api/ { resolver 223.5.5.5 114.114.114.114 8.8.8.8 valid=30s ipv6=off; set $upstream "api.example.com"; proxy_pass http://$upstream; } -
❌ 错误示例(
resolver在http块,location内未重复声明):http { resolver 8.8.8.8; # 这里写了 ≠ location 里能用 server { location /api/ { proxy_pass http://api.example.com; # 报错:no resolver defined to resolve } } }
DNS 地址支持多个,但顺序很重要
可以空格分隔写多个 IP,比如:
resolver 114.114.114.114 223.5.5.5 1.1.1.1 valid=30s;
Nginx 按顺序尝试,仅当前一个 DNS 连接失败(超时或拒绝) 才换下一个;如果它连上了但返回“域名不存在”(NXDOMAIN),不会跳转,直接报 502。所以建议把响应快、稳定性高的 DNS 放第一位,例如云厂商内网 DNS 或本地 CoreDNS。
必须配合 valid= 控制缓存行为
不加 valid=,Nginx 默认按 DNS 记录原始 TTL 缓存——很多云服务 TTL 只有几秒,会导致高频查询;而完全不缓存又可能拖慢请求。合理设置能平衡时效与性能:
-
valid=10s–30s:适合 K8s Service、SLB、容器化后端等 IP 频繁变动场景 -
valid=2m–5m:适合 CDN 回源、SaaS 接口等相对稳定的外部服务
别忘了 resolver_timeout
单次 DNS 查询不能无限等待,建议设为 3s 或 5s:
resolver_timeout 3s;
太短(如 1s)易因网络抖动误判失败;太长(如 10s)会明显拉高首字节时间(TTFB)。
IPv6 默认开启,若后端不支持建议关掉
加 ipv6=off 可避免冗余查询和潜在失败:
resolver 223.5.5.5 valid=30s ipv6=off;
不复杂但容易忽略











