chaihongjun.me

Geoip2地址库(免费版)在nginx的使用

根据maxmind官网的消息:

GeoLite Legacy数据库已于2019年1月2日停用

来源 : https://dev.maxmind.com/geoip/geoip2/geolite2/

这篇文章总结的是如何下载安装使用geoip2,以及如何更新它的数据库。系统环境是centos7+nginx1.16.1

安装

软件的安装涉及两个,有一个是系统的支持库一个是nginx的geoip2的模块。

首先是系统的支持库安装,这个库安装之后nginx的geoip2模块可以读取mmdb格式的数据文件。

  1. 前往  https://github.com/maxmind/libmaxminddb  下载最新的版本(目前是1.4.2),下载地址: https://github.com/maxmind/libmaxminddb/releases

  2. 解压完下载的安装包之后进行库的安装:

 $ ./configure
 $ make
 $ make check
 $ sudo make install
 $ sudo ldconfig

参考:

https://github.com/maxmind/libmaxminddb

接着是安装nginx的模块ngx_http_geoip2_module:

  1. 前往  https://github.com/leev/ngx_http_geoip2_module ,下载地址: https://github.com/leev/ngx_http_geoip2_module/releases  选择最新的版本

  1. 同样是解压之后的安装,选择的是以静态模块的方式:

 ./configure {之前nginx的配置参数 } --add-module=/path/to/ngx_http_geoip2_module
 make

这里后面操作请参考《WEB不停服nginx平滑静默升级和跨版本升级注意事项》,实际相当于Nginx的平滑升级。

下载数据库文件

既然是识别地理位置,就需要位置数据,前往  https://dev.maxmind.com/geoip/geoip2/geolite2/ 下载。

Geoip2地址库(免费版)在nginx的使用

城市和国家的都要下载,格式要maxmind db binary,下载的是两个压缩包,同样解压之后需要的是其中的mmdb文件,将两个mmdb文件(GeoLite2-City.mmdbGeoLite2-Country.mmdb)放置到某个目录内,比如 /alidata/GeoDatabases

配置

需要nginx使用数据库文件一定是要对nginx做针对性配置:

首先在nginx的conf目录内创建文件Geoip2.conf,然后写入:

 #IP地址库解析映射 
 geoip2 /alidata/GeoDatabases/GeoLite2-Country.mmdb {
         auto_reload 5m;
         $geoip2_metadata_country_build metadata build_epoch;
         $geoip2_country_code country iso_code;
         $geoip2_country_name country names en;
     }
 geoip2 /alidata/GeoDatabases/GeoLite2-City.mmdb {
      $geoip2_metadata_city_build metadata build_epoch;
      $geoip2_data_city_name city names en;
      $geoip2_data_continent_code continent code;
      $geoip2_data_continent_name continent names en;
      $geoip2_data_country_code country iso_code;
      $geoip2_data_country_name country names en;
      $geoip2_data_region_iso subdivisions 0 iso_code;
      $geoip2_data_region_name subdivisions 0 names en;
    }

上面的文件路径就是前面下载后数据库文件存放的绝对路径。

接着在fastcgi.conf最后追加:

 # Geoip2
 fastcgi_param GEOIP2_CITY_BUILD_DATE $geoip2_metadata_city_build;
 fastcgi_param GEOIP2_CITY $geoip2_data_city_name;
 fastcgi_param GEOIP2_CONTINENT_CODE $geoip2_data_continent_code;
 fastcgi_param GEOIP2_CONTINENT_NAME $geoip2_data_continent_name;
 fastcgi_param GEOIP2_COUNTRY_CODE $geoip2_data_country_code;
 fastcgi_param GEOIP2_COUNTRY_NAME $geoip2_data_country_name;
 fastcgi_param GEOIP2_REGION $geoip2_data_region_iso;
 fastcgi_param GEOIP2_REGION_NAME $geoip2_data_region_name;

最后,在nginx主配置文件nginx.conf的http段内添加:

 include  Geoip2.conf;
 log_format analytics '$remote_addr"-[$time_local]">>$request"$status">>$body_bytes_sent"'
                             '>>$http_referer">>$http_user_agent">>$http_x_forwarded_for"'
                             '>>$request_time">>$upstream_addr">>$host"$request_body'                            '>>$geoip2_data_country_name>>$geoip2_data_region_name>>$geoip2_data_city_name';

log_format 是日志文件格式设置,如果之前有配置,请注释之前的配置。另外,再去修改对应的各个vhost的日志名称统一改成analytics:

 ## 比如
 ## 原来是
 access_log /alidata/wwwlogs/www.domian.cn_nginx.log access;
 ## 现改成
 access_log /alidata/wwwlogs/www.domian.cn_nginx.log analytics;

数据库升级

官方也提供了一个数据更新的程序 geoipupdate ,只要下载好,配置好,并配合crontab就可以定期更新数据了。

  1. 前往  https://github.com/maxmind/geoipupdate/releases  下载适合自己平台的版本(这里选择 geoipupdate_4.1.5_linux_amd64.tar.gz)

  2. 解压之后,以root的身份把解压包里的文件geoipupdate复制到/usr/local/bin

  3. 进入到/usr/local/etc目录并创建文件GeoIP.conf写入:

 # The following AccountID and LicenseKey are required placeholders.
 # For geoipupdate versions earlier than 2.5.0, use UserId here instead of AccountID.
 AccountID 0
 LicenseKey 000000000000
   
 # Include one or more of the following edition IDs:
 # * GeoLite2-City - GeoLite 2 City
 # * GeoLite2-Country - GeoLite2 Country
 # For geoipupdate versions earlier than 2.5.0, use ProductIds here instead of EditionIDs.
 EditionIDs GeoLite2-City GeoLite2-Country
 
 ## 自定义的数据库目录,如果有改动,一定要配置
 DatabaseDirectory /alidata/GeoDatabases
  1. 使用crontab程序创建一个定期自动更新规则,类似如下的每周更新计划

 32 6 * * 3 /usr/local/bin/geoipupdate

以上就是完整的下载安装配置过程。然后,就可以看到nginx日志里对应IP的实际物理位置。


知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»