背景环境

硬件:阿里云 2 核 4 G 轻量应用级服务器

操作系统:Ubuntu 18.04.6 LTS

nginx version:nginx/1.14.0 (Ubuntu)

故障表现

域名成功解析到了 ip,此 ip 访问自己的应用正常,但是域名访问却指向了 nginx 的 index page。

原因剖析

首先必须了解该问题涉及到的 nginx 的相关知识。

nginx 相关配置 路径
总配置文件 /etc/nginx/nginx.conf
nginx 配置的默认 server 配置文件 /etc/nginx/sites-enabled/default
我们自定义的 server 配置文件 /etc/nginx/conf.d 下所有以 .conf 后缀的文件

后面两个路径可以在总配置文件中找到:

1
2
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

注意第二个路径是 sites-enabled 而不是 sites-available,这两者区别可自行 google,相关知识和本文问题无关。

nginx 默认的 server 配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}

而当前的 ip 与之对应的自定义 server 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

upstream django {
server 127.0.0.1:9595; # uwsgi 配置的ip和端口
}

server {
listen 80; # 监听80端口
server_name 120.77.233.137;

location / {
# 请求转发到 uwsgi 服务器
proxy_pass http://django;

# 设置请求头,并将头信息传递给服务器端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

可以自定义的 server_name 为 120.77.233.137,域名 kcool.top 访问时不会匹配到这个 server,就会交给 nginx 的 default_server 处理,也就到了 nginx 的 index page。

解决办法已经呼之欲出了。

解决办法

最好的解决办法是将域名 kcool.top 也加入我们自定义的 server_name 中,和现有的 ip 以空格分隔,即 :

1
server_name kcool.top 120.77.233.137

不得不说很多教程说多个 server_name 以逗号分隔实在是太坑了。

还有一种办法是将总配置文件的下面这行注释掉:

1
include /etc/nginx/sites-enabled/*;

讲道理会 404 的,我也不知道为什么可行,有空再琢磨~