502高频根因为DNS解析漂移,Nginx未及时感知后端域名IP变更;需查error.log中“resolving timed out”等关键词,实测dig/nslookup对比IP与域名连通性,确认后配置resolver于http块顶层、proxy_pass改用变量形式,并依内外网场景选择hosts映射或SNI增强方案。

502 出现时若后端用的是域名(比如 api.internal 或容器名 user-service),DNS 解析漂移是高频根因——Nginx 没有及时感知 IP 变更,还在往旧地址发请求,自然连不上,直接报 502。
看错误日志确认是不是 DNS 问题
打开 Nginx 错误日志(通常是 /var/log/nginx/error.log),重点搜这几类关键词:
- “resolving timed out”:DNS 查询超时
-
“no resolver defined to resolve”:配置了域名但没配
resolver - “getaddrinfo() failed” 或 “connect() failed (111: Connection refused)” 后紧跟着域名(不是 IP):说明解析出了 IP,但那个 IP 已失效
手动验证 DNS 解析是否滞后
别只信配置,要实测:
- 在 Nginx 所在机器上执行:
dig +short your-backend-domain或nslookup your-backend-domain,记下返回的 IP - 立刻 curl 测试这个 IP:
curl -v http://<em>上面查到的IP</em>:8080/health,看通不通 - 再 curl 域名本身:
curl -v http://your-backend-domain:8080/health,对比响应是否一致 - 如果 IP 能通、域名不通,或两次返回的 IP 不一样,基本就是 DNS 缓存没刷新
检查 resolver 配置是否生效且匹配场景
resolver 不是加了就万事大吉,得看怎么用、用在哪:
-
位置必须对:
resolver要写在http块顶层,不能只放在某个server或location里 -
值要合理:内网用 Docker 的 DNS 就写
resolver 127.0.0.11 valid=5s ipv6=off;公网服务推荐阿里 DNS223.5.5.5,valid=30s比较稳妥 -
proxy_pass 必须触发变量:硬写
proxy_pass http://backend.example.com不会走 resolver;得改成set $up "backend.example.com"; proxy_pass http://$up;
区分内外网,选对解决路径
内网微服务和云上/跨网服务,处理逻辑完全不同:
-
内网(K8s/Docker/私有集群):优先禁用动态 DNS,改用
/etc/hosts映射或直接写 Pod/IP。resolver 在内网反而容易因 DNS 延迟引发 502 -
公网或泛域名场景:必须配
resolver+ 变量形式proxy_pass,否则容器重建、SLB 切换、CDN 回源都可能卡在旧 IP 上 -
HTTPS 后端带 SNI:除了 resolver,还得加
proxy_ssl_server_name on;和proxy_ssl_name your-domain.com;,否则 SSL 握手失败也会 502


















