目前流行的做法就是openresty/nginx 去解析 maxmind 格式的geoip 数据。
实测开源地Lite版数据库,对国内的省、市支持度较差。
本文记录 openresty 源码编译,以及手动生成mmdb的过程。
这个库有两个作用:
1、生成一个动态库,由nginx 动态使用。
2、生成一个命令行工具,可手动验证 mmdb的内容是否可用。 文件名: mmdblookup
wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz
tar -zxf libmaxminddb-1.7.1.tar.gz
cd libmaxminddb-1.7.1
./configure && make && make install
# 查看所有关联信息,返回一个类似json的结果
mmdblookup -f GeoLite2-City.mmdb --ip 1.1.1.1
# 增加json 层级参数,可返回指定内容. 后面的参数,要看上面的情况添加
mmdblookup -f GeoLite2-City.mmdb --ip 1.1.1.1 city zh-CN
下载源码:
wget https://openresty.org/download/openresty-1.21.4.2.tar.gz
下载 geoip module
wget https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz
配置编译, 酌情添加
./configure --prefix=/app/openresty --add-module=../ngx_http_geoip2_module-3.4 --with-pcre --with-http_realip_module --with-stream --with-stream_realip_module --without-stream_limit_conn_module --with-http_perl_module
make && make install
Can't locate nginx.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
解决:
cd openresty-1.21.4.2/build/nginx-1.21.4
mkdir -p /usr/local/lib64/perl5/auto/nginx
cp objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so /usr/local/lib64/perl5/auto/nginx/
cp objs/src/http/modules/perl/blib/lib/nginx.pm /usr/local/lib64/perl5/
github自行下载后,放到conf 目录下
http {
geoip2 conf/city.mmdb {
$city_name default=北京 source=$remote_addr city;
$prov_name default=中国 source=$remote_addr province;
}
server {
listen 80;
server_name localhost;
location /loc {
return 200 "OK: $city_name , $remote_addr, $prov_name";
}
}
说明:
本来到这里可以结束 。。
由于maxmind官网下载的最新的Lite版本数据还是略显拉垮,决定手动撸一个。
查到资源有两个:
结合这两个资源,可以生成自己的专属mmdb
脚本比较简单,可参考官网写出。
当位置nginx 后面的openresty,拿到的 remote_addr 都是内网IP,需要进行一些配置
nginx 网关侧增加配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
说明: 外部请求的真实IP,是通过另外一个Header参数传给上游服务(up_stream)
openresty conf http 段新增:
set_real_ip_from 10.10.0.0/16; // nginx /openresty 所在内网IP段
real_ip_header X-Real-IP;