Nginx中正确配置resolver需四要素:显式声明于http/server块、至少两个DNS地址、必须设valid参数启用缓存(推荐30s)、合理设resolver_timeout(公网5s/内网2s),且不继承系统DNS。

要在 Nginx 中正确配置 resolver 实现外部 DNS 解析,核心是明确作用域、指定可靠 DNS 地址、启用缓存控制,并确保它与代理逻辑联动。不是加一行就生效,位置错、参数缺、用法不对,全白搭。
resolver 必须写在 http 或 server 块内,不能靠系统默认
Nginx 完全不读 /etc/resolv.conf,也不继承容器或宿主机的 DNS 设置。必须显式声明:
- 反向代理场景:推荐放在
http块顶层,全局生效,例如:resolver 223.5.5.5 114.114.114.114 valid=30s ipv6=off; - 正向代理场景:必须放在
server块内,且紧邻proxy_pass,例如:server { listen 80; resolver 114.114.114.114 valid=30s; location / { proxy_pass http://$http_host$request_uri; } } - 切勿只写一个 DNS 地址——至少配两个,如
114.114.114.114 8.8.8.8,防止单点失效
valid 参数必须设,否则等于没缓存
没加 valid,Nginx 默认行为是“每次请求都同步阻塞查 DNS”,极易被限流或拖慢响应。加上后才启用本地缓存:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
valid=30s:生产环境推荐值,平衡时效性与查询压力 -
valid=10s:适合 IP 频繁漂移的云服务或测试环境 - 避免
valid=5m以上——外部域名变更感知延迟太长,故障恢复慢
resolver_timeout 要设得准,不是越长越好
它不控制缓存,只管单次 DNS 查询最多等多久。设错会直接卡死 worker:
- 公网调用(如第三方 API):
resolver_timeout 5s;,覆盖 P95 延迟,又不放大抖动 - 内网 DNS(如 CoreDNS):
resolver_timeout 2s;,响应通常 - 严禁设成
10s或更高——一个卡住的查询会让整个 worker 挂起,高并发下迅速雪崩
proxy_pass 必须用变量,静态写法完全无效
写 proxy_pass http://api.example.com; 是启动时静态解析,IP 变了也无感知。真正触发运行时 DNS 查询,必须走变量路径:
- 反向代理示例:
location / { set $upstream "http://api.example.com"; proxy_pass $upstream; } - 正向代理示例:
proxy_pass http://$http_host$request_uri;(注意含协议前缀) - 如果用
upstream,需 Nginx ≥ 1.19.0 并加resolve:upstream backend { server api.example.com resolve valid=20s; }

















