resolver_timeout生效需同时满足:配置resolver、proxy_pass/upstream使用域名、upstream server显式声明resolve、dns协议匹配;内网设2s,混合环境4–5s,高敏系统3s配valid=15s;须搭配upstream resolve、proxy_next_upstream及worker连接限制防雪崩。

要规避 DNS 服务器故障引发的 Nginx 负载均衡长时间挂起,关键不是“堵住”请求,而是让 DNS 查询失败得快、切得准、缓存得当——resolver_timeout 是其中最直接的响应开关,但它必须和 resolver、valid、upstream 配置协同生效。
确保 resolver_timeout 生效的前提条件
这个指令只在以下场景起作用:
- 配置了 resolver 指令(至少一个可用 nameserver)
-
proxy_pass 或 upstream server 使用域名而非固定 IP(如
proxy_pass http://api.example.com;) - upstream 中对应 server 显式声明 resolve 关键字(否则仅启动时解析一次,不触发 timeout 控制)
- 未启用 IPv6 或 DNS 服务器本身支持所用协议(避免因协议不匹配隐式卡死)
合理设置 resolver_timeout 值
超时值需平衡“快速失败”与“误判率”:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 内网环境 + 自建 DNS(如 dnsmasq、CoreDNS):设为 2s,网络稳定且延迟低
- 混合环境(部分走公网 DNS):设为 4–5s,兼顾 8.8.8.8 或 114.114.114.114 的偶发抖动
- DNS 故障高发或对切换敏感的系统:设为 3s,并配合
valid=15s缩短缓存,提升响应灵敏度 - 避免设为 1s 或更低——公网 DNS 在丢包重传时可能超过 1s,反而导致大量无效失败
搭配 upstream 和重试机制防雪崩
单靠 resolver_timeout 无法解决后端不可达问题,需组合防御:
- 在 upstream 块中为每个 server 加 resolve,确保每次请求都做实时 DNS 查询
- 启用
proxy_next_upstream error timeout invalid_header http_502;,让 DNS 解析失败(502)或连接超时可自动切到下一个 upstream 节点 - 限制 worker 并发连接数(
worker_connections 1024;),防止个别 DNS 卡顿耗尽全部 worker 连接 - 若后端域名极少变更,可改用本地
/etc/hosts绑定或定时脚本更新 IP 后 reload nginx,彻底绕过运行时解析
验证配置是否真正起效
改完配置后不要只信语法检查:
- 执行
nginx -t && nginx -s reload - 临时将 resolver 设为一个不可达地址(如
resolver 192.0.2.1;),观察错误日志是否在设定的 timeout 秒后出现resolving timed out,并返回 502 - 正常运行时,检查 access.log 中
$upstream_addr是否随 DNS 变更而更新,确认缓存刷新逻辑生效










