resolver_timeout的核心目标是让Nginx在DNS查询失败或延迟过高时快速放弃、及时重试或返回错误,避免worker进程被长期阻塞;它仅作用于单次DNS查询,需与resolver配合且仅对动态域名解析生效。

配置 resolver_timeout 的核心目标不是“防止堆积”,而是让 Nginx 在 DNS 查询失败或延迟过高时**快速放弃、及时重试或返回错误**,从而避免 worker 进程被长期阻塞。它必须和 resolver 指令配合使用,且只对动态域名解析(如 proxy_pass 后接域名、upstream 中带 resolve)生效。
明确 resolver_timeout 的作用边界
这个指令控制的是单次 DNS 查询的等待上限,不是整个请求生命周期。Nginx 不会因一次超时就直接拒绝客户端请求,而是可能触发重试逻辑或报 502/503。常见误区是把它当成“全局请求超时开关”,其实它只管 DNS 那一跳。
-
不生效场景:proxy_pass 直接写死 IP(如
http://10.0.1.5:8080)、upstream server 列表中未加resolve关键字 -
生效前提:配置了
resolver,且 proxy_pass 或 upstream 使用了可解析的域名 -
典型表现:日志中出现
resolving timed out或no resolver defined
合理设置 timeout 值的实操建议
设得太短(如 1s)会导致频繁 DNS 失败,尤其在公网 DNS(如 8.8.8.8)偶发延迟时;设得太长(如 30s)会让单个请求卡住整个连接,拖累并发能力。推荐按网络环境分级设定:
- 内网服务 + 自建 DNS(如 dnsmasq):
resolver_timeout 2s;,valid 可设为60s - 混合环境(部分走公网 DNS):
resolver_timeout 5s;,搭配多个 nameserver(如resolver 114.114.114.114 8.8.8.8 valid=30s;) - 高可用要求强的生产系统:避免单点 DNS,用
resolver_timeout 3s;+valid=15s,缩短缓存时间换取响应灵敏度
配合其他参数降低 DNS 风险
单靠 resolver_timeout 不足以解决请求堆积问题,需组合优化:
- 在
upstream块中为每个 server 显式加resolve,确保每次请求都做 DNS 查询(而非仅启动时解析一次) - 启用
proxy_next_upstream error timeout invalid_header http_502;,让上游不可达时自动切到下一个节点 - 限制单个 worker 的并发连接数(
worker_connections 1024;),避免 DNS 卡顿引发雪崩 - 若后端域名极少变更,考虑用本地 hosts 绑定或定期脚本更新 IP 并 reload nginx,绕过运行时解析
验证是否生效的简单方法
修改配置后,用 nginx -t 检查语法,再 nginx -s reload。观察 error.log 是否还有大量 resolving timed out;也可临时把 resolver 设为一个不存在的地址(如 resolver 192.0.2.1;),看请求是否在指定 timeout 后快速返回 502,而不是挂十几秒。


















