Nginx默认域名配置-实现禁止IP直接访问80端口或禁止非本站的域名绑定服务器IP
在前端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
后业务正常,但是发现机器A
上a.myserver.com
的nginx日志一直能收到其他域名的请求和心跳检测,正常情况这是不应该存在其他域名的日志打印到a.myserver.com
日志里面。为什么不是a.myserver.com
域名的请求会转发到a.myserver.com
域名上?
基础配置
nginx配置文件
nginx 配置文件/usr/lcoal/nginx/conf/nginx.conf
具体根据自己的文件位置
http 的括号里面添加一行:
1 | include /usr/local/nginx/conf/vhosts.conf; #一个文件包含多个域名配置,具体看自己nignx的位置 |
一个域名一个文件的写法
首先打开nginx域名配置文件存放目录:/usr/local/nginx/conf/
,如要绑定域名www.myserver.com
则在此目录建一个文件:www.myserver.com.conf
然后在此文件中写规则,如:
1 | server |
nginx服务器重起命令:/etc/init.d/nginx restart
绑定成功
一个文件包含多个域名的写法
1 | server |
问题分析
基础的配置讲解完后下面开始正式分析问题,通过和服务提供方的沟通得知,这个是机器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配置里面增加default
和default_server
指令设置默认域名解析,这样没有匹配上的域名就不会解析到其他业务的域名上,同时为了防止未备案的域名恶意指向自己,也可以将默认域名解析返回nginx响应码444,这样返回的就是未响应的网页了。
1 | server { |
ssl_certificate:设置安全证书文件pem的路径。
ssl_certificate_key:设置安全证书文件key的路径。
ssl_session_timeout:ssl_session_timeout time。
最后访问的效果如图所示:
注意: Nginx上对于SSL服务器在不配置证书的时候会出现协议错误,哪怕端口上配置了其他网站也会报错。443端口如果也跟80端口那样子的配置,使用https方式访问正常的域名也会被拒绝连接。解决办法就是添加一个证书。