nginx安装geoip2模块实践分享
nginx安装geoip2模块实践分享
前言
在开发的项目中,因网站需要暴露到公网,所以针对非中国ip进行屏蔽迫在眉睫。毕竟小业务也只是国内用户。
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,足以应付简单的网页,所以项目前端一开始就没有选择复杂的容器。
刚好nginx可以进行geoip2模块的集成,来实现ip的甄别。
条件
目前geoip2下载ip库需要注册用户才可下载。官方网址:https://www.maxmind.com/en/home
选择geo,注册账户后,在账户信息列表可以看到下载页面
https://www.maxmind.com/en/accounts/429281/geoip/downloads
同时该网站提供付费的api调用。不过我等白嫖党直接就pass掉了。就不再了解。
可以下载GeoLite2-city或者GeoLite2-Country的gzip。或者两个都下载,然后在windows或者Linux里面解压,得到mmdb格式文件,这个便是ip库,
之后便是开始为nginx安装模块。
安装模块
nginx目前有两种安装方式,源码安装,或者使用linux的在线安装,apt或者yum或者docker安装。
本次只讲述不是源码安装的步骤,环境为Ubuntu 20.04 。不是源码安装的还是需要一个源码,所以可以现在nginx下载对应的源码。
第一步是使用ubuntu系统,用apt直接安装编译环境:
apt update
apt install build-essential -y
第二步通过apt安装libmaxminddb模块,此模块用来解析mmdb文件
sudo add-apt-repository ppa:maxmind /ppa
如安装失败,可以先安装以下依赖
apt-get install software-properties-common -y
第二步也可进行源码编译安装
git clone --recursive https://github.com/maxmind/libmaxminddb
cd libmaxminddb
./bootstrap
./configure
make
make check
sudo make install
sudo ldconfig
使用mmdblookup –version确认是否安装成功。
第三步编译安装ngx_http_geoip2_module模块
首先获得模块源码https://github.com/leev/ngx_http_geoip2_module/releases
然后获得与当前nginx版本相同的源码,需要使用nginx -V查看版本。http://nginx.org/download/ 下载源码网址。
之后查看当前nginx的编译参数:nginx -V
...
configure arguments: --with-cc-opt= '-g -O2 -fdebug-prefi
...
注意configure arguments:后面的完整参数。接下来开始编译模块,在查询出的configure arguments:最后加上–add-dynamic-module=/root/dev/ngx_http_geoip2_module-3.0
module=后面为模块源码存储地址。
之后再nginx源码目录下进行编译
ginx编译前需要先安装以下依赖:
apt install libpcre3-dev libssl-dev zlib1g-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev -y
cd 到nginx的源代码目录中,开始执行编译命令
./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2'...
...
... --add-dynamic-module=/root/dev/ngx_http_geoip2_module-3.0
make
make modules
编译完成后,我们切换到objs目录,可以看到我们想要的两个库文件:
ngx_http_geoip2_module.so
ngx_stream_geoip2_module.so
接下来我们把这两个文件移动到/usr/lib/nginx/modules路径下,方便下一步的操作
mv ngx_http_geoip2_module.so /usr/lib/nginx/modules
mv ngx_stream_geoip2_module.so /usr/lib/nginx/modules
备份 /usr/sbin 目录下的nginx文件
把编译后的objs文件夹内的nginx文件移动到/usr/sbin 文件夹内
第四步配置NGINX的ngx_http_geoip2_module模块
在nginx.conf中第一行加入load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
别忘了将ip库上传
COPY ./GeoLite2-City.mmdb /home/yuki/data/geoip2/
COPY ./GeoLite2-Country.mmdb /home/yuki/data/geoip2/
在nginx.conf的http层加入:
geoip2 /home/yuki/data/geoip2/GeoLite2-Country.mmdb {
$geoip2_country_code default=CN country iso_code;
$geoip2_country_name country names zh-CN;
}
geoip2 /home/yuki/data/geoip2/GeoLite2-City.mmdb {
$geoip2_city_name default=ShangHai city names zh-CN;
}
在server层便可使用geoip2。
判断非中国ip
location / {
#屏蔽非中国ip
if ($geoip2_country_code !~* "CN") {
return 403;
}
index index.html;
}
最后启动nginx。
end;