美文网首页Nginx
Nginx启用Geoip2,实现国家、城市识别

Nginx启用Geoip2,实现国家、城市识别

作者: 我真不是大牛 | 来源:发表于2020-11-04 16:29 被阅读0次

    1. 背景

    • 风控服务:根据用户ip,获取常用地址。判断用户的异地登录,触发风控校验。
    • maxmind不再提供Legacy Databases的下载支持

    2.源码编译集成

    1. 源码及DB文件下载

    image.png

    推荐都使用最新版本
    最新DB无法下载的可留邮箱

    2. 首先安装api库

    # 解压
    sudo tar -xvf libmaxminddb-1.4.3.tar.gz
    cd libmaxminddb-1.4.3
    #安装
    sudo ./configure && sudo make && sudo make install
    #加入lib path 避免找不到
    sudo sh -c "echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf"
    sudo ldconfig
    

    3. 安装nginx

    sudo tar -xvf 3.3.tar.gz
    sudo tar -xvf nginx-1.18.0.tar.gz
    cd nginx-1.18.0
    ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --add-module=/data/geoip2/ngx_http_geoip2_module-3.3
    sudo make
    # 若为平滑升级,则无需install
    sudo make install
    

    4. 配置nginx

    1. 修改nginx配置
    #http模块
    #确认需要使用的IP,不推荐使用这种方式
    #realip取值:若x-forward-for不为空,则取第一个ip;否则取remote_addr
    map $http_x_forwarded_for $realip {
            ~^(\d+\.\d+\.\d+\.\d+) $1;
            default $remote_addr;
    }
    #http模块
    #引入geoip2的配置文件,配置文件内容见下面部分
    include /etc/nginx/conf.d/geoip2.conf;
    #location模块
    #把城市国家信息放入header
    #geoip2相关变量定义在下面部分
    proxy_set_header Country_Code $geoip2_country_code;
    proxy_set_header City_Code $geoip2_city_name_en;
    

    特殊环境原因,无法知晓内网IP段,且X-Forward-For有为空的情况,所以无法使用real ip 模块
    若环境正常,推荐大家使用real ip模块

    1. 添加geoip2基础配置
      解压 GeoLite2-City_20201103.tar.gz GeoLite2-Country_20201103.tar.gz2个文件,把2个.mmdb格式的文件放入任意目录(如/data/geo2_db/)
    #配置geoip2配置文件 /etc/nginx/conf.d/geoip2.conf
    geoip2 /data/geo2_db/GeoLite2-Country.mmdb {
             auto_reload 5m;
             $geoip2_metadata_country_build metadata build_epoch;
             #国家编码
             $geoip2_country_code source=$realip country iso_code;
             #国家英文名
             $geoip2_country_name_en source=$realip country names en;
             #国家中文名
             $geoip2_country_name_cn source=$realip country names zh-CN;
    }
    geoip2 /data/geo2_db/GeoLite2-City.mmdb {
          $geoip2_metadata_city_build metadata build_epoch;
          #城市英文名,大多是拼音,有重复情况
          $geoip2_city_name_en source=$realip city names en;
          #城市中文名,部分城市没有中文名
          $geoip2_city_name_cn source=$realip city names zh-CN;
          #城市id,maxmaind 库里的id,非国际标准
          $geoip2_data_city_code source=$realip city geoname_id;
    }
    

    5. 测试

    1. 添加测试location,启动nginx
    #添加测试location,把地理位置返回
    location = /geo {
            default_type text/plain;
           # return 200 "haha";
            return 200 'countryCode:$geoip2_country_code\n countryNameEn: $geoip2_country_name_en\n countryNameCn: $geoip2_country_name_cn\n cityNameEn: $geoip2_city_name_en\n cityNameCn: $geoip2_city_name_cn\n cityCode: $geoip2_data_city_code\n';
        }
    
    #测试nginx配置是否正确
    sudo /usr/local/nginx/sbin/nginx -t
    #若无问题则会输出
    #nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    #nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    #启动nginx
    sudo /usr/local/nginx/sbin/nginx
    
    1. 测试
      可以去代理网站,找一些国内外ip测试
    #无域名的可以使用host测试
    curl -H "X-Forwarded-For: 124.72.237.255,42.248.50.9,202.5.56.71" your.domain.com/geo
    
    image.png

    4. 参考资料

    1. maxmind的api库https://github.com/maxmind/libmaxminddb
    2. nginx_geoip2模块https://github.com/leev/ngx_http_geoip2_module
    3. maxmind官网https://dev.maxmind.com/geoip/geoip2/geolite2/

    5.常见问题

    1. Nginx configure error: the HTTP rewrite module requires the PCRE librar
      解决方案https://blog.cpming.top/p/nginx-http-rewrite-module-requires-pcre
    #安装pcre
    sudo yum install pcre-devel
    
    1. Enable ngx_http_ssl_module on Mac. error /bin/sh: ./config: No such file or directory
      解决方案
    sudo yum install openssl-devel
    

    相关文章

      网友评论

        本文标题:Nginx启用Geoip2,实现国家、城市识别

        本文链接:https://www.haomeiwen.com/subject/qnawvktx.html