温馨提示×

ubuntu nginx域名解析问题解决

小樊
32
2025-12-24 22:22:11
栏目: 云计算

Ubuntu 上 Nginx 域名解析问题的排查与修复

一、快速判断与定位

  • 检查域名是否真的能解析到服务器:在服务器上执行 dig/nslookup,确认返回的 A/AAAA 记录是目标 公网/内网 IP;若解析不到,先修正 DNS 服务商或本地 /etc/resolv.confDNS 服务器
  • 查看 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 nscdnscd -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

0