目前流行的做法就是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;
-