您当前的位置:首页 > 计算机 > 服务器 > Nginx

Openresty 处理 GeoIP 地址解析

时间:11-11来源:作者:点击数:

目前流行的做法就是openresty/nginx 去解析 maxmind 格式的geoip 数据。

实测开源地Lite版数据库,对国内的省、市支持度较差。

本文记录 openresty 源码编译,以及手动生成mmdb的过程。

0x01 安装

1. maxmind

这个库有两个作用:

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
  • mmdblookup 使用说明:
    一般查询:
# 查看所有关联信息,返回一个类似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

2. openresty

下载源码:

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
  • QA:
    启动 nginx时:可能看到这种错误:

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/ 

0x02 配置示例

1.下载 mmdb

github自行下载后,放到conf 目录下

2. nginx 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";
        }
}

说明:

  • 上面的 geoip2 指令能力由 module 提供,每次http请求都会根据请求头中的 $remote_addr 信息,查询mmdb,把结果放到 当前上下文中的变量:$city_name 和 $prov_name
  • 在后续的处理中,可以直接使用那个变量,此处直接返回给请求方。也可以添加到自定义header,传给上游服务使用。

本来到这里可以结束 。。

0x03 自定义mmdb数据

由于maxmind官网下载的最新的Lite版本数据还是略显拉垮,决定手动撸一个。

查到资源有两个:

结合这两个资源,可以生成自己的专属mmdb

脚本比较简单,可参考官网写出。

0x04 openresty 获取真实IP配置

当位置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;
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐