Nginx反向代理域名无法访问问题

问题描述:nginx正常启动,ip访问能正常访问项目,域名访问显示无法访问此网站(DNS_PROBE_FINISHED_NXDOMAIN),意思是当浏览器无法找到您尝试访问的网站时会出现,其实看网站报错我们就知道大概率是DNS解析相关问题,但是如果下次我们不知道DNS报错应该怎么去排除并找出错误呢?下面就是相关思路。

解决思路

一、查看是否服务器问题

查看防火墙是否关闭,防火墙是否放行端口,如果是云服务器查看安全组是否放行端口(相关运营商有设置安全组手册)。

如果第一次安装22端口是会给我们开放一次的,如果发现没有开一定要第一时间开放22端口以下是Ubuntu服务器防火墙相关命令:

sudo ufw status    #查看防火墙状态

sudo apt-get install ufw   #安装防火墙

sudo ufw enable   #开启防火墙

sudo ufw allow 22   #开放22端口

sudo ufw delete allow 22   #关闭22端口(开启关闭端口都需要重启才能生效)

sudo ufw reload   #重启防火墙

sudo ufw disable   #关闭防火墙

进入端口在线测试网站,查看80和443端口是否对外放行 可以找一个在线测试端口网站这样比一个个的去测方便点,我用的是端口在线检测工具

二、项目本身问题

项目部署完毕看本地是否能正常访问,或者开通端口进行外部浏览器访问。 本地访问: curl 127.0.0.1:项目端口

三、nginx问题

查看nginx是否正常启动 sudo systemctl status nginx

四、nginx配置问题

防止出现多个nginx配置文件,我们并不知道实际上调用的是哪个配置文件,因此我们必须找到实际调用的配置文件才能进行修改。
查看nginx安装路径 ps aux | grep nginx查看nginx生效配置文件路径 nginx -t

五、 配置文件书写问题

1. 注意Location 的语法问题,这里是很多人出错的问题

Location具体语法: location [ = | ~ | ~* | ^~ ] uri { ... }- = 表示精确匹配 - ~ 表示区分大小写的正则匹配 - * 表示不区分大小写的正则匹配 - ^ 表示 uri 以某个字符串开头 - / 表示通用匹配

2. root与alias区别

nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。 root使用范围:http、server、location、if alias使用范围:location 下面举给个例子:

server {
    location /static/ {
        root /var/www;  #请求 /static/file.txt 将映射到 /var/www/static/file.txt
    }

}

在这个例子中,当请求匹配到/static/路径时,Nginx会在/var/www目录下寻找对应的文件。 root 的处理结果是:root 路径 + location 路径,location 路径包括匹配后面的请求,即 /var/www+ /static/file.txt

server {
    location /static/ {
        alias /var/www/data/;  # 请求 /static/file.txt 将映射到 /var/www/data/file.txt
    }
}

在这个例子中,alias指示Nginx将路径重写为/var/www/data/,而不是简单地将请求路径添加到/var/www中。 alias 的处理结果是:使用 alias 路径替换 location 路径,即 /static/file.txt的/static/ 会变成/var/www/data/,比如请求 /static/file.txt 将映射到 /var/www/data/file.txt

3. proxy_pass结尾带 / 和不带 / 的区别

如果请求成功匹配到 location 的规则,不同的请求类型对应的转发配置不同

静态资源: 使用 alias、root 关键字。

API接口: 使用 proxy_pass 关键字。

proxy_pass 结尾带/的场景中,会截断匹配成功的location规则,转发剩余的 URI。 proxy_pass 结尾不带带/的场景中,会保留匹配成功的location规则,并且转发剩余的 URI。

详情请看文章 Nginx学习笔记

4.利用日志查看错误点

可以查看我上篇文章如何在自己的Ubuntu服务器上快速的使用Nginx中的第四点,日志配置,分点开启日志,然后查看日志,确定是否进行请求,以及请求的地址等等。

六.域名问题

域名过期/没有进行备案 这些都有很明显的报错信息。 DNS解析问题 确定主域名@,DNS解析是用A记录来绑定服务器的ip地址进行解析(因为我nginx设置的反向代理规则为主机ip端口转发给域名) A记录、CNAME解析区别

A 记录(Address Record)是一种 DNS 记录类型,用于将域名映射到一个 IPv4 地址。通过设置 A 记录,你可以将特定的域名直接指向一个具体的 IP 地址,从而使用户能够通过这个域名访问相应的服务器或网络资源。

CNAME 是 DNS(Domain Name System)中的一种记录类型,全称为 Canonical Name(规范名)。CNAME 记录用于将一个域名映射到另一个域名,实现域名的别名或重定向。 功能: CNAME 记录用于创建别名,将一个域名映射到另一个域名。 用途: 主要用于将一个域名的访问重定向到另一个域名,方便管理和维护。当目标域名的 IP 地址变化时,只需更新目标域名的 DNS 记录,而不必更改所有引用该域名的记录。

总结:

A 记录直接将域名映射到一个 IPv4 地址,而 CNAME 记录将域名映射到另一个域名。 A 记录速度较快,因为它直接映射到 IP 地址,不会引入额外的查询步骤。CNAME 记录可能稍微减慢解析速度,因为它需要额外的查询步骤以查找目标域名的 IP 地址。 A 记录适用于需要直接映射到 IP 地址的情况,而 CNAME 记录适用于创建别名或者需要更灵活管理目标位置的情况。