一、查看
1. 先查看本地nginx是否有ngx_http_geoip2模块(如果有的同学有该模块可以直接跳到下面直接配置nginx服务)
nginx -V
二、安装
1. 安装所需依赖
yum install -y libmaxminddb-devel pcre-devel zlib-devel gcc gcc-c++ make git
2. 下载ngx_http_geoip2模块
随便找一个或者新建一个文件夹来放,注意:记住文件夹路径,后面有用(我这边自己新建了一个geoip的文件夹)
cd /www/geoip
git clone https://github.com/leev/ngx_http_geoip2_module.git
3. nginx添加ngx_http_geoip2_module模块(如何添加可以参考我的另一篇文章nginx添加模块)
--add-module=/www/geoip/ngx_http_geoip2_module
4. 下载 IP 地理位置数据库文件
官方下载地址https://www.maxmind.com/en/accounts/1031493/geoip/downloads
4.1 首先先注册,注册只要邮箱就行,其他随便填
4.2 下载对应数据库文件
这里下载GeoLite2 Country或者GeoLite2 City都行,如果你需要精确到城市,推荐下载GeoLite2 City;如果你只需要精确到国家,推荐下载GeoLite2 Country
找一个文件夹放置数据库文件,只需要GeoLite2-Country.mmdb文件就行,记住文件路径
我这里跟上面的放一起,最终路径/www/geoip/ngx_http_geoip2_module/GeoLite2-Country.mmdb
三、配置nginx
1. 加载 IP 地理位置数据库
nginx
http {
# 加载 GeoIP 数据库文件
geoip2 /path/to/GeoLite2-Country.mmdb { # 指定 GeoIP2 数据库文件路径
auto_reload 60m; # 每 60 分钟自动重新加载数据库文件
$geoip2_metadata_country_build metadata build_epoch; # 获取数据库元数据
$geoip2_data_country_code country iso_code; # 获取 IP 所属国家的 ISO 代码
}
}
2. 配置拦截规则
nginx
http {
# 设置拦截规则
map $geoip2_data_country_code $allowed_country {
default yes; # 默认情况下允许访问
CN no; # 指定中国 IP 地址不被拦截
}
}
3. 应用拦截规则
nginx
server {
listen 80;
server_name example.com;
if ($allowed_country = yes) { # 如果 IP 地址所属国家被标记为不允许访问
return 403; # 返回 403 Forbidden 错误页面
}
# 其他配置项
}
如果只针对某个站,你也可以在某个站的伪静态中添加如下代码
if ($allowed_country = yes) { # 如果 IP 地址所属国家被标记为不允许访问
return 403; # 返回 403 Forbidden 错误页面
}
四、测试
1. 测试GeoLite2-Country.mmdb是否有效
cd /www/geoip/ngx_http_geoip2_module
mmdblookup --file ./GeoLite2-Country.mmdb --ip 88.88.88.88 country iso_code
2. 测试获取到的数据是否正常
可以在nginx伪静态里面加下面这段,访问即可看到打印的内容
default_type text/plain;
add_header X-Country-Code $geoip2_data_country_code;
add_header X-Country-Code $allowed_country;
add_header X-Country-Code $geoip2_metadata_country_build;
return 200 'Hello, $geoip2_data_country_code ! Your content $geoip2_metadata_country_build allowed country is $allowed_country';