关键是区分系统级dns失效与nginx自身解析机制问题:host not found in upstream(配置加载期解析失败)、no peer_addr(无目标ip)、resolver timeout、getaddrinfo() failed等均为间接标志;需结合nslookup验证、检查resolver配置位置与作用域、确认容器网络及libc兼容性,并优先用ip或hosts临时恢复,再以自定义resolver+变量实现生产根治。

排查 Nginx 日志中的 DNS 解析异常,关键是区分“系统级 DNS 失效”和“Nginx 自身解析机制问题”。错误通常不直接写“DNS failed”,而是以间接形式出现,比如 host not found in upstream、no peer_addr、Connection refused(但上游 IP 明显不对),或 error.log 中反复出现 resolver 超时、无法解析域名等提示。
看日志里有没有明确的 DNS 相关关键词
打开 /var/log/nginx/error.log,重点搜索以下内容:
- host not found in upstream:Nginx 启动或重载时解析失败,说明 proxy_pass 或 upstream 中用了域名,但当时无法解析(注意:这不是运行时错误,是配置加载阶段)
- no peer_addr:不是 DNS 错误本身,而是下游因 DNS 没返回 IP 导致连接无目标地址;需回溯确认是否真没解析出 A 记录
-
resolver timeout 或 resolver failed:说明 Nginx 配了
resolver,但指定的 DNS 服务器不可达或响应慢 -
getaddrinfo() failed:底层调用失败,常见于域名拼写错误、空变量、或短域名在 K8s 中跨 namespace 未补全(如用
redis而非redis.default.svc.cluster.local)
验证 DNS 是否真能解析那个域名
别只信 nslookup,要模拟 Nginx 的行为环境:
- 在 Nginx 所在机器上执行:
nslookup your-upstream-domain,看是否返回 A/AAAA 记录 - 如果返回正常,再试:
nslookup your-upstream-domain 114.114.114.114,排除本地 DNS 服务异常 - 若用的是容器或 K8s Pod,进容器执行:
cat /etc/resolv.conf,确认 nameserver 是否指向 kube-dns/coredns,且 search 域是否匹配(例如缺default.svc.cluster.local会导致短域名解析失败) - 检查是否用了 musl libc(如 Alpine 镜像):它默认不支持 EDNS0,某些内网 DNS 会拒绝响应;可临时换 Ubuntu 镜像或加
--dns=8.8.8.8启动验证
检查 Nginx 配置中 resolver 是否生效
Nginx 不用系统 DNS,除非你显式配置 resolver。常见误区:
- 只在 http 块写了
resolver,但在 stream 块代理 TCP 时没单独配——stream 模块必须独立配置 resolver - 用了变量 + proxy_pass(如
set $upstream "api.example.com"; proxy_pass https://$upstream;),但没配 resolver → 不会触发运行时解析 - resolver 缓存时间设太长(如
valid=1d),导致后端 IP 变更后 Nginx 仍用旧地址;建议设为valid=30s~300s并配合resolver_timeout 5s - resolver 写了内网 DNS 地址(如
10.96.0.10),但该地址在 Nginx 所在节点网络不可达(比如宿主机没连 K8s 网络)
绕过 DNS 的临时与长期方案
快速恢复服务优先用临时手段,再定位根因:
-
应急上线:把
proxy_pass https://service.example.com改成proxy_pass https://10.244.1.55,跳过解析环节 -
系统级兜底:在
/etc/hosts加一行10.244.1.55 service.example.com,所有进程都生效 -
生产推荐:Nginx 配自定义 resolver(如
resolver 114.114.114.114 223.5.5.5 valid=60s;),搭配变量使用,脱离系统 DNS 依赖 -
容器场景加固:K8s Pod 中设
dnsPolicy: ClusterFirst,并确保resolv.conf里的 search 域覆盖业务需要(必要时用dnsConfig显式指定)











