在前端Nginx运行环境中时候会有多个nginx服务,同时也包括了支持多个域名多个项目访问,随着工信部对备案要求的严格和不定期的筛查,会偶然查到其他不知名的域名绑定了自己的服务器上,或安装其他服务通过其他手段后默让服务器绑定了此域名,此时nginx就会自动去访问你服务器的默认前端服务,这样就很容易被工信部的工作人员查到,就通知你诊改,此时对nginx的域名配置管理就显得尤为的重要,轻则服务器上的服务停止,重则封服务器的IP。为此为大家讲明白其中的来龙去脉,方便大家在工作能够快速定位问题、解决问题。

问题产生描述

如对线上的域名a.myserver.com进行网络策略变更。变更包括对当前使用的机器A解除域名a.myserver.com的nginx配置,将a.myserver.com解析到机器B,那么问题来了,因为机器A上的nginx域名配置不止a.myserver.com,在将a.myserver.com解析到机器B后业务正常,但是发现机器Aa.myserver.com的nginx日志一直能收到其他域名的请求和心跳检测,正常情况这是不应该存在其他域名的日志打印到a.myserver.com日志里面。为什么不是a.myserver.com域名的请求会转发到a.myserver.com域名上?

基础配置

nginx配置文件
nginx 配置文件/usr/lcoal/nginx/conf/nginx.conf具体根据自己的文件位置
http 的括号里面添加一行:

1
2
include  /usr/local/nginx/conf/vhosts.conf;  #一个文件包含多个域名配置,具体看自己nignx的位置
#include /usr/local/nginx/conf/vhost/*.conf #多个域名文件,一个域名一个配置文件

一个域名一个文件的写法
首先打开nginx域名配置文件存放目录:/usr/local/nginx/conf/ ,如要绑定域名www.myserver.com则在此目录建一个文件:www.myserver.com.conf然后在此文件中写规则,如:

1
2
3
4
5
6
7
8
server 

listen      80; 
server_name  www. myserver.com;             #绑定域名 
index index.htm index.html index.php;     #默认文件 
root /home/www/myserver.com;              #网站根目录
include location.conf;                           #调用其他规则,也可去除
}

nginx服务器重起命令:/etc/init.d/nginx restart绑定成功

一个文件包含多个域名的写法

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

listen      80; 
server_name  www. myserver.com myserver.com;             #绑定域名 
index index.htm index.html index.php;     #默认文件 
root /home/www/ myserver.com;              #网站根目录
include location.conf;                           #调用其他规则,也可去除
}
 
server 

listen      80; 
server_name  msn. myserver.com;             #绑定域名 
index index.htm index.html index.php;     #默认文件 
root /home/www/msn. myserver.com;        #网站根目录
include location.conf;                           #调用其他规则,也可去除
}

问题分析

基础的配置讲解完后下面开始正式分析问题,通过和服务提供方的沟通得知,这个是机器A上其他服务的心跳检测和请求。根据观察,这些域名都是服务方的域名。非我们服务使用域名,我们的nginx是没有对非自己业务域名进行解析。
问题应该出在nginx配置上。 通过查看nginx配置得知,nginx没有配置默认解析域名或相关的处理。这样造成nginx匹配不到域名的时候,会将请求发到域名节点的第一个域名上。
刚好这里我们的域名节点都是单独的*.myserver.conf文件。a.myserver.com.conf内的a.myserver.com被当成默认域名进行了解析,造成了没有匹配上的域名全部都转发到a.myserver.com域名节点上。

解决方案

禁止IP直接访问80端口和443端口或者禁止非本站的域名绑定我们的IP,放到最前一个server上面即可

在vhosts文件夹下面新建一个default.conf,然后进行如下代码的配置,通过在nginx配置里面增加defaultdefault_server指令设置默认域名解析,这样没有匹配上的域名就不会解析到其他业务的域名上,同时为了防止未备案的域名恶意指向自己,也可以将默认域名解析返回nginx响应码444,这样返回的就是未响应的网页了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80 default;
listen 443 ssl default_server;
server_name _;
return 444;
ssl_certificate /opt/nginx/cert/8336626_myserver.com.pem;
ssl_certificate_key /opt/nginx/cert/8336626_myserver.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 404.html https://$host$request_uri;
}

ssl_certificate:设置安全证书文件pem的路径。
ssl_certificate_key:设置安全证书文件key的路径。
ssl_session_timeout:ssl_session_timeout time。

最后访问的效果如图所示:

注意: Nginx上对于SSL服务器在不配置证书的时候会出现协议错误,哪怕端口上配置了其他网站也会报错。443端口如果也跟80端口那样子的配置,使用https方式访问正常的域名也会被拒绝连接。解决办法就是添加一个证书。