Nginx + GeoIP屏蔽国外访问
这个功能是基于with-http_geoip_module模块实现的,可以设置需要屏蔽的区域访问
测试环境:centos 7.6
工具: xshell
一、首先需要先下载nginx源码包,下载nginx、解压,配置与编译,安装
wget http://nginx.org/download/nginx-1.16.1.tar.gz
解压与配置安装
#下载编译依赖
yum -y install gcc pcre-devel openssl-devel zlib-devel
#添加用户和用户组 设置程序启动的用户
groupadd www
useradd -M -g www -s /usr/sbin/nologin www
#解压源码包
tar -zxvf nginx-1.16.1.tar.gz
#编译安装过程
cd nginx-1.16.1
./configure --user=www --group=www \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_geoip_module
#编译 && 安装
make && make install
/usr/local/nginx/sbin/nginx #启动
/usr/local/nginx/sbin/nginx -s stop #关闭
以上只是编译与安装nginx,如果没有nginx的,或者嫌麻烦的,也可以使用,我这边写的一键安装脚本,nginx是1.16.1,php是7.3的,mysql是5.6的,仅限centos7使用
教程与脚本:https://github.com/darren2025/LNMP-
二、怎么配置模块
1.首先,先下载IP库
wget http://www.321dz.com/shell/GeoIPv6.dat
2.我这里将这个文件复制道nginx配置文件下,如果你们地址不一样就换一下,如果不换也可以(随意这步)
cp -r GeoIPv6.dat /usr/local/nginx/conf
3.编辑nginx配置文件,我的配置文件在 /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
将下面的内容添加进 http {} 区域,并且要放在任何include语句之前:
geoip_country /usr/local/nginx/conf/GeoIPv6.dat; #放刚才那个下载的文件地址
map $geoip_country_code $allowed_country {
default no; #默认都拒绝
CN yes; #允许中国
TW yes; #允许台湾,台湾也是中国的
HK yes; #中国香港
MO yes; #中国澳门
}
以上是定义规则,现在要使用规则,接下来在server {} ,一个server代表一个虚拟主机区域里添加以下内容:
#判断是不是在拦截范围,是直接403,不让访问了
if ($allowed_country = no) {
return 403;
}
效果图:一个是用美国服务器访问的,一个是用我本地浏览器访问的
当然也可以对某些目录限制
location /admin {
if ($allowd_country = no) {
return 403;
}
}
这个是不允许特定区域访问这个admin目录,这个就要看怎么应用了.
4.最后完成后,记得重载nginx配置
/usr/local/nginx/sbin/nginx -s reload #重载配置文件 使配置生效(当更改了配置文件的时候需要使用)