Nginx和Java各自DNS缓存叠加导致后端连接异常,需分别验证nslookup结果与error.log中upstream IP是否一致、检查resolver+变量配置是否生效、确认JVM networkaddress.cache.ttl设置,并优先reload或改用IP临时恢复。

排查 Nginx + Java 应用部署中因 DNS 解析缓存引发的后端连接异常,核心是厘清“谁在缓存”“缓存在哪”“缓存是否过期”。Nginx 和 Java 各自有一套 DNS 缓存机制,两者可能叠加失效,不能只查一边。
先确认异常是否真由 DNS 缓存引起
别一上来就 reload 或改配置。先做快速验证:
- 在 Nginx 服务器上执行
nslookup your-java-backend.example.com,看返回的 IP 是否和 error.log 中报错的目标 IP 一致;如果不一致,说明 Nginx 缓存了旧地址 - 同时在 Java 应用所在机器(尤其是容器内)也执行同样 nslookup,再加一句
nslookup your-java-backend.example.com 8.8.8.8,排除本地 DNS 服务异常或 search 域缺失问题 - 查 Nginx error.log,搜索
upstream timed out或Connection refused,重点看日志里 upstream 地址是否长期固定不变——这是典型静态 DNS 缓存表现 - 用 curl 直连 Java 后端(绕过 Nginx):如果直连正常,但经 Nginx 就失败,基本可锁定是 Nginx 层 DNS 缓存问题
检查 Nginx 配置是否启用动态解析
Nginx 默认对 proxy_pass http://backend.example.com 这类字面量域名只解析一次,重启或 reload 才更新。要支持运行时刷新,必须满足三个条件:
- 配置了
resolver指令(如resolver 8.8.8.8 valid=10s;),且写在location或server块内,不能只放在http块顶层(尤其当 proxy_pass 在子块中时) -
proxy_pass必须引用变量,例如:set $backend "backend.example.com"; proxy_pass http://$backend;;写死域名不会触发 resolver - 确保没有遗漏作用域问题:比如 resolver 在 server 块,但 set 和 proxy_pass 在 location 内,多数版本支持;但若用 stream 模块代理 TCP,则必须单独配 resolver
同步排查 Java 进程自身的 DNS 缓存
Java 应用(尤其是 HttpClient、Feign、Dubbo 等)也会缓存 DNS 结果,默认 TTL 受 JVM 参数控制:
立即学习“Java免费学习笔记(深入)”;
- 检查启动参数是否含
-Dnetworkaddress.cache.ttl=0(禁用缓存)或-Dnetworkaddress.cache.ttl=30(设为 30 秒)。未显式设置时,JDK 8+ 默认为 -1(永久缓存),JDK 7 为 30 秒 - 容器环境下,Java 可能因 musl libc(如 Alpine 镜像)无法正确处理 EDNS0,导致 DNS 查询静默失败;可临时换用 Ubuntu 基础镜像或加
--dns=8.8.8.8启动容器验证 - 修改 /etc/hosts 后,Java 不自动刷新缓存,必须重启 JVM;也可在代码中调用
InetAddress.clearCache()(JDK 8+ 支持) - 若 Java 应用本身作为客户端去调用其他服务,其 DNS 异常会表现为
UnknownHostException,需结合 Java 日志与系统 nslookup 综合判断
快速验证与临时恢复方案
生产环境出问题,优先保障可用性:
- 立即生效:执行
nginx -s reload,强制刷新 Nginx 的 DNS 缓存(注意 reload 不中断连接) - 更稳妥:将
proxy_pass临时改为 IP 地址(如proxy_pass http://10.20.30.40:8080;),或在 /etc/hosts 中固化映射,避免依赖 DNS - 验证 resolver 是否真工作:执行
nginx -T | grep proxy_pass,输出若仍是域名而非 IP,说明变量路径生效;若输出已解析 IP,说明没走 resolver - 长期根治:对 Java 服务域名,统一使用 FQDN(如
service-a.default.svc.cluster.local),并在容器 resolv.conf 的 search 域中补全,避免短域名解析失败


















