Ubuntu 上 Nginx 域名解析问题的排查与修复
一、快速判断与定位
二、常见根因与对应修复
未给反向代理指定 DNS 解析器
现象:启动或首次请求时报 “no resolver defined to resolve …”。
修复:在 http 或 server 块中显式配置 resolver,并设置合理 valid(如 10–30s)与 resolver_timeout(如 3–5s)。示例:
http {
resolver 8.8.8.8 1.1.1.1 valid=30s;
resolver_timeout 5s;
}
注意:resolver 必须放在 http/server 块,不能放在 location 内。
Nginx 对 upstream 域名缓存过久
现象:后端 IP 变更后,Nginx 仍连旧 IP,出现 502/连接超时。
修复:缩短 valid(如 10–30s),并在变更后执行 sudo nginx -s reload;若用变量方式动态解析,务必用 set $backend “http://xxx”; proxy_pass $backend;,否则域名可能被永久缓存。
系统或本地 DNS 缓存导致“改了 DNS 不生效”
现象:dig 已正确,但应用仍解析到旧 IP。
修复:清理缓存。
容器内或内网服务用域名互相访问
现象:Docker 中 Nginx 代理 tomcat:8080 报 “host not found”。
修复:
三、可直接套用的 Nginx 配置示例
反向代理到上游域名(动态解析,避免永久缓存) http { resolver 8.8.8.8 1.1.1.1 valid=10s ipv6=off; resolver_timeout 3s;
server {
listen 80;
server_name app.example.com;
location / {
set $backend "http://backend.example.com";
proxy_pass $backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
} 要点:使用 set + proxy_pass 变量、设置 resolver/valid/timeout,变更后 reload。
将二级域名反向代理到本机端口(静态目标) server { listen 80; server_name books.example.com;
location / {
proxy_pass http://127.0.0.1:**3000**;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
} 要点:这是“端口映射”的典型用法,域名解析到服务器 IP,Nginx 再转发到本地端口。
四、验证与收尾