之前有个问题一直没有留意,直到最近服务器动不动崩溃才意识到,似乎我一直没有禁止对服务器IP的直接访问。这次趁着更换操作系统并升级MediaWiki的时候就一起进行考虑了。
Nginx提供了多种方法来防止通过IP地址直接访问网站。
一、修改Nginx配置文件
要实现Nginx禁止通过IP访问,可以通过修改Nginx的配置文件(nginx.conf)来实现,以下是具体的配置步骤:
步骤1: 打开Nginx的配置文件nginx.conf。
步骤2: 在http块中添加一个新的server段,用于处理默认虚拟主机,关键配置在于listen 80 default;
这行代码,它表示这个server块将作为默认虚拟主机。
步骤3: 在这个server块中,可以设置返回403(禁止访问)或者是444(关闭连接却不返回信息),或者进行其他自定义操作,如跳转到指定页面。
server {
listen 80 default;
server_name _;
return 403;
}
在上述配置中,当用户通过IP地址或未设置的域名访问时,将返回403禁止访问的错误。
二、使用正则表达式限制域名访问
除了简单地禁止IP访问外,还可以通过正则表达式来限制只有特定的域名才能访问网站,以下是一个示例配置:
server {
listen 80;
server_name ~^(www.)?yourdomain.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
if ($host !~* ^(www.)?yourdomain.com$ ) {
return 403;
}
}
在这个配置中,server_name ~^(www.)?yourdomain.com;
使用了正则表达式来匹配指定的域名,而if ($host !~* ^(www.)?yourdomain.com$ )
则用于检查请求的Host头是否与正则表达式匹配,如果不匹配则返回403错误。
- 防盗链设置
为了防止资源被盗用,可以在Nginx中设置防盗链,这通常涉及到检查请求的Referer头部,以确保请求是从合法的页面发起的,以下是一个简单的防盗链配置示例:
server {
listen 80;
server_name yourdomain.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
valid_referers none blocked *.yourdomain.org www.yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
}
在这个配置中,valid_referers
指令用于指定合法的Referer头部值,如果请求的Referer头部不合法,则返回403错误。
三、注意事项
在进行以上配置时,请确保已经备份了原始的Nginx配置文件,以便在需要时可以恢复。
修改完配置文件后,需要重新加载或重启Nginx服务使配置生效,可以使用以下命令重新加载Nginx配置:
sudo nginx -s reload
如果服务器上有多个站点,并且只想禁止其中一个站点的IP访问,而不影响其他站点,那么需要在对应的server块中进行配置,而不是在全局的http块中。
对于复杂的需求,可能需要结合多种方法来实现完全的访问控制,可以先使用地理位置限制来允许或拒绝特定地区的访问,然后再在server块中进行更细粒度的控制。
通过以上配置,可以有效地防止通过IP地址直接访问Nginx服务器,同时提高服务器的安全性和稳定性。
存在的问题
这两天按网上搜来的如下配置,结果发现无法上传文件到OSS上了。
erver {
listen 80 default;
listen 443 default_server; #使用https/443时启用
ssl_certificate xxx.pem; #使用https/443时启用,输入任意站点的有效SSL证书路径即可
ssl_certificate_key xxx.pem; #使用https/443时启用,输入任意站点的有效SSL证书路径即可
server_name _;
return 444;
}
注释掉443和SSL的内容就恢复正常了。