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直接安装编译环境:

1
2
apt update
apt install build-essential -y

第二步通过apt安装libmaxminddb模块,此模块用来解析mmdb文件

1
sudo add-apt-repository ppa:maxmind /ppa

如安装失败,可以先安装以下依赖

1
apt-get install software-properties-common -y

第二步也可进行源码编译安装

1
2
3
4
5
6
7
8
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

1
2
3
...
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编译前需要先安装以下依赖:

1
apt install libpcre3-dev libssl-dev zlib1g-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev -y

cd 到nginx的源代码目录中,开始执行编译命令

1
2
3
4
5
./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路径下,方便下一步的操作

1
2
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层加入:

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
location  / {
#屏蔽非中国ip
if ($geoip2_country_code !~* "CN") {
return 403;
}
index index.html;
}

最后启动nginx。

end;