nginx正向代理中resolver必须置于server块内,指定内网dns(如10.1.2.100)、设置valid=30s和resolver_timeout 3s,并启用ipv6=off,以确保域名解析走可信可控链路、避免公网风险。

在 Nginx 正向代理中,用 resolver 指令指定内网专有 DNS 服务器,核心是让代理请求的域名解析完全走可信、可控的内部链路,避免依赖公网 DNS 带来的延迟、污染或劫持风险。关键不在于“能不能配”,而在于“配对位置、参数和配套行为”。
必须在正向代理 server 块里显式声明 resolver
Nginx 的 resolver 不继承自 http 块(尤其在正向代理场景下),必须直接写在监听代理端口的 server 块内。否则变量型 proxy_pass(如 http://$http_host)会退化为系统默认解析,失去控制权。
- 正确写法示例:
server {
listen 3128;
resolver 10.1.2.100 valid=30s ipv6=off;
proxy_connect;
proxy_connect_allow all;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
}
}
-
10.1.2.100是你部署的内网 DNS(如 CoreDNS 或 dnsmasq),需确保该地址可从 Nginx 所在主机直连且端口 53 开放 - 不能写成
resolver 10.1.2.100:53—— Nginx 默认用 UDP 53,端口号不可显式指定 - 多个 DNS 可写为
resolver 10.1.2.100 10.1.2.101 valid=30s;,Nginx 会轮询使用(注意:不支持自动故障切换,需靠上游 DNS 自身高可用)
valid 参数不是可选,而是安全与性能的双重保障
valid=30s 表示 DNS 缓存结果仅在此期限内被复用;超时后强制重新查询并校验。这对内网 DNS 尤其重要——它把“缓存”变成“有保鲜期的信任凭证”,配合内网 DNS 启用的 DNSSEC,能有效过滤篡改响应。
- 若省略
valid,Nginx 默认缓存时间极短(通常几秒),导致高频重复查询,加重 DNS 负载 - 建议值:内网环境稳定可设
valid=30s;若后端服务 IP 频繁变更(如 K8s Service),可缩至valid=15s - 务必搭配
resolver_timeout 3s;,防止单次 DNS 查询阻塞整个请求(默认 30s 太长)
禁用 IPv6 避免隐式失败
内网 DNS 通常只提供 A 记录(IPv4),若未关闭 IPv6 解析,Nginx 会先发 AAAA 查询,超时后再查 A —— 这个“等待+重试”过程会显著拖慢首包时间,甚至引发连接超时。
- 加
ipv6=off强制只走 IPv4,消除不确定性 - 除非你确认内网 DNS 和所有目标服务都完整支持 IPv6 并已启用 AAAA 记录,否则不建议开启
验证是否真正走内网 DNS
光写配置不够,得验证生效:
- 开启
error_log /var/log/nginx/error.log debug;,触发一次代理请求后搜索日志中的resolving或cached,看解析目标是否命中10.1.2.100 - 用
dig @10.1.2.100 example.com在 Nginx 主机上手动测试,确认该 DNS 能正常返回且响应快( - 对比关闭 resolver 和启用内网 resolver 后的
curl -x 127.0.0.1:3128 https://example.com -w "%{time_total}s\n",TTFB 应明显下降且更稳定











