nginx中resolver动态dns解析需四件套:显式resolver(http/server块、禁ipv6)、valid控制缓存时效、resolver_timeout设2–5s防卡死、proxy_pass必须用变量触发运行时解析,缺一不可。

在 Nginx 的 server 块中配置 DNS 解析服务器地址与缓存时间,核心是使用 resolver 指令——但它**不能单独写在 server 块里就生效**,必须配合变量驱动的 proxy_pass 才能触发运行时解析。直接写 proxy_pass http://example.com; 仍是启动时静态解析,resolver 完全不起作用。
resolver 必须显式声明且位置正确
resolver 指令需写在 http 或 server 块顶层(非 location 内),推荐放在 http 块中统一管理:
- 指定至少两个可靠 DNS 服务器,避免单点失效,例如:
resolver 223.5.5.5 114.114.114.114 valid=30s ipv6=off; -
valid=30s表示 DNS 缓存最多保留 30 秒,过期后下次请求会重新解析 -
ipv6=off可跳过 AAAA 查询,防止 IPv6 不通拖慢整体解析速度 - Nginx 不读取系统
/etc/resolv.conf,必须显式配置,否则默认无 DNS 解析能力
proxy_pass 必须用变量才能触发动态解析
只有通过变量间接调用域名,Nginx 才会在每次请求时查 resolver 并做运行时 DNS 查询:
- ✅ 正确写法(在
server或location中):set $upstream "http://api.example.com";<br>proxy_pass $upstream;
- ❌ 错误写法(静态解析,
resolver无效):proxy_pass http://api.example.com; - HTTPS 场景下还需额外两行,否则 SNI 不匹配会导致 502:
proxy_ssl_server_name on;<br>proxy_ssl_name "api.example.com";
控制单次 DNS 查询超时,防 worker 卡死
resolver_timeout 独立于 valid,它只限制一次 DNS 查询最多等多久,建议设为 2–5 秒:
- 写在同级
server或http块中,例如:resolver_timeout 3s; - 设太短(如 1s)易因网络抖动误判失败;设太长(如 30s)会让 worker 长时间阻塞,影响并发
- 该值不控制缓存时长,只管“这次查 DNS 能忍多久”
注意:upstream 块里的域名默认仍是静态解析
即使你在 upstream 中写了 server backend.example.com:80;,Nginx 开源版仍只在启动/重载时解析一次。若需 upstream 动态解析,需满足:
- Nginx ≥ 1.19 +
resolve参数(如server backend.example.com resolve;) - 且必须搭配
resolver使用,否则报错或退化为静态解析 - 更稳妥的做法是放弃 upstream 域名,改用 IP 列表 + 外部编排工具(如 Ansible、K8s Endpoints)实时更新配置并 reload











