ubuntu nginx域名解析问题解决
Ubuntu 上 Nginx 域名解析问题的排查与修复
一、快速判断与定位
- 检查域名是否真的能解析到服务器:在服务器上执行 dig/nslookup,确认返回的 A/AAAA 记录是目标 公网/内网 IP;若解析不到,先修正 DNS 服务商或本地 /etc/resolv.conf 的 DNS 服务器。
- 查看 Nginx 是否能启动与语法正确:执行 sudo nginx -t;若报 “host not found in upstream …”,说明反向代理的 upstream 域名在启动或首次解析时失败。
- 看错误日志定位阶段:执行 sudo tail -n50 /var/log/nginx/error.log,常见关键词有 “host not found in upstream”“no resolver defined”。
- 排除端口与访问路径:确认 80/443 未被占用(如 sudo ss -tulpen | grep ‘:80|:443’),以及云厂商 安全组/防火墙已放行。
- 若只是客户端访问异常,可能是本地或运营商 DNS 缓存,可更换公共 DNS(如 223.5.5.5/223.6.6.6、1.1.1.1、8.8.8.8)后再试。
二、常见根因与对应修复
-
未给反向代理指定 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。
修复:清理缓存。- 使用 nscd:执行 sudo systemctl restart nscd 或 nscd -i hosts。
- 使用 dnsmasq:执行 sudo systemctl restart dnsmasq。
- 使用 systemd-resolved:执行 sudo systemd-resolve --flush-caches。
-
容器内或内网服务用域名互相访问
现象:Docker 中 Nginx 代理 tomcat:8080 报 “host not found”。
修复:- 让 Nginx 与后端在同一 Docker 网络,用 服务名访问(如 http://tomcat:8080)。
- 若必须用域名,确保容器内 /etc/resolv.conf 有可用 DNS,或在宿主机部署 dnsmasq 并在容器内使用 127.0.0.1 作为解析器。
三、可直接套用的 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 再转发到本地端口。
四、验证与收尾
- 配置语法与生效:执行 sudo nginx -t & & sudo systemctl reload nginx。
- 解析与连通性:
- dig/nslookup 检查域名解析是否到期望 IP。
- curl -v http://域名 验证是否返回 200/301/302 等预期状态码。
- 日志复核:再次查看 /var/log/nginx/error.log 是否还有解析或连接错误。
- 外部访问:若从外网访问失败,核对 云安全组/本机防火墙已放行 80/443。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: ubuntu nginx域名解析问题解决
本文地址: https://pptw.com/jishu/780867.html
