核心是确认Nginx是否使用过期IP:日志中upstream后显示的IP若与dig结果不一致,即为DNS缓存问题;原生upstream不支持动态解析,须改用变量+resolver、resolve参数或第三方模块。
排查 upstream 因 DNS 缓存未更新导致的后端失联,核心是确认 Nginx 当前连接的 IP 是否已过期——它不看系统能否解析,而看 Nginx 实际发往哪个地址。
打开 /var/log/nginx/error.log,搜索以下关键词:
upstream: "http://10.20.30.40:80/"
dig your-backend-domain.com +short,比对返回的 IP 是否与日志中一致原生 upstream 不支持运行时 DNS 刷新。只要写成这样:
upstream backend {
server api.example.com:80;
}
就代表 Nginx 只在启动或重载时解析一次,之后永不更新。解决路径只有三种:
resolve 参数(需配合顶层 resolver)proxy_pass + 变量模式(放弃 upstream 结构,用 set $upstream "api.example.com"; proxy_pass http://$upstream;)nginx-upstream-dynamic-servers,支持 server api.example.com resolve;
即使写了 resolver,也必须满足两个条件才起作用:
resolver 必须出现在 http、server 或 location 块中(不能只写在 stream 模块却用于 http 流量)proxy_pass 必须引用变量,而非直写域名;upstream 中的 server 行加 resolve 才会触发 resolvernslookup api.example.com 8.8.8.8,确认 DNS 服务器可达且返回正确 IPnginx -T | grep resolver 和 nginx -T | grep proxy_pass,确认配置被加载且没被静态展开为 IP不重启、不改配置也能快速锁定问题:
1.2.3.4 api.example.com(填当前正确的后端 IP)curl -I http://your-nginx-domain/api,若立刻恢复,基本坐实是 DNS 缓存问题valid=30s 过期后重试,观察错误是否重现ss -tnp | grep :8080 查看 worker 进程当前连的是哪个 IP,对比是否随 DNS 变更而更新