nginx-geoip2模块使用详解

前言

前面的博客介绍了如何通过重新编译nginx,从而加载geoip2模块。还有简单的使用案例。

传送门:nginx-配置GeoIP2模块获取地域信息

接下来将继续介绍geoip2模块的详细参数和变量配置规则。

配置参数

示例

http {
    ...
    geoip2 /etc/maxmind-country.mmdb {
        auto_reload 5m;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code default=US source=$variable_with_ip country iso_code;
        $geoip2_data_country_name country names en;
    }

    geoip2 /etc/maxmind-city.mmdb {
        $geoip2_data_city_name default=London city names en;
    }
    ....

    fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
    fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
    fastcgi_param CITY_NAME    $geoip2_data_city_name;
    ....
}

stream {
    ...
    geoip2 /etc/maxmind-country.mmdb {
        $geoip2_data_country_code default=US source=$remote_addr country iso_code;
    }
    ...
}

geoip2模块可以配置在http和stream下。

参数1-自动重新加载(默认禁用)

启用自动重新加载将使 nginx 以指定的时间间隔检查数据库的修改时间,如果发生更改则重新加载。

auto_reload 

参数2-元数据

检索有关 geoip 数据库的元数据。

格式

$variable_name metadata 

可用字段:

  • build_epoch:maxmind 数据库的构建时间戳。
  • last_check:最后一次检查数据库的更改(使用 auto_reload 时)
  • last_change:上次重新加载数据库的时间(使用 auto_reload 时)

如示例中“$geoip2_metadata_country_build metadata build_epoch;”。是将maxmind数据库的构建时间戳的值,赋值给变量“$geoip2_metadata_country_build”,后面在nginx中就可以使用变量“$geoip2_metadata_country_build”。

参数3-地理IP

格式

$variable_name [default=
  • $variable_name为自定义变量名,后续在配置文件中可以直接使用变量。
  • 如果未指定default,则如果未找到该变量将为空。
  • 如果未指定source,则 $remote_addr 将用于执行查找。
  • 其中path值,可以使用mmdblookup查询获取相关路径(后续将给出示例)。

如何自定义“地理IP”变量?(示例)

mmdblookup命令使用

mmdblookup这个命令在安装geoip2依赖--libmaxminddb时就会被一起装上。

源码包路径:libmaxminddb-1.6.0/bin/mmdblookup

选项

-f,--file        指定mmdb数据库文件路径
-i,--ip          指定要查找的ip
-v,--verbose     打印详细输出。具体来说,这会导致此应用程序输出数据库元数据。
--version        显示版本
-h,-?,--help     帮助文档

example

(不提供查找路径时)

[root@10-10-10-10 cofigure]# mmdblookup --file GeoLite2-Country.mmdb --ip 10.10.10.10

{
    "names": {
        "en": "Germany",
        "de": "Deutschland"
    },
    "cities": [ "Berlin", "Frankfurt" ]
}

可以通过使用以下查找路径调用 mmdblookup 来查找英文名称:

mmdblookup --file ... --ip ... names en

数组编号从零 (0) 开始。可以使用以下命令查找列表中的第二个城市:

mmdblookup --file ... --ip ... cities 1

示例-IP所在-国家的编码、国家名、城市名

http {
    ......

    #geoip2模块加载Country数据库,并且配置自定义变量
    geoip2 /etcd/nginx/conf/GeoLite2-Country.mmdb {
      $geoip2_country_code default=unknow source=$http_x_forwarded_for country iso_code;
      $geoip2_country_name default=unknow source=$http_x_forwarded_for country names en;
    }

    #geoip2模块加载City数据库,并且配置自定义变量
    geoip2 /etcd/nginx/conf/GeoLite2-City.mmdb {
      $geoip2_data_city_name default=unknow source=$http_x_forwarded_for city names en;
      $geoip2_data_city_subdivisions default=unknow source=$http_x_forwarded_for subdivisions 0 names en;
    }

    location /myip {
      default_type application/json;
      return 200 '{"ip":$http_x_forwarded_for,"countryCode":"$geoip2_country_code","countryName":"$geoip2_country_name","citySubdivisions":"$geoip2_data_city_subdivisions","cityName":"$geoip2_data_city_name"};';
    }    
    ......
}

nginx-geoip2模块使用详解_第1张图片

解析:

以$geoip2_data_city_subdivisions source=$http_x_forwarded_for subdivisions 0 names en;为例

  $geoip2_data_city_subdivisions:为自定义变量名

  default:当ip在数据库中没有查到时,变量的值为default的值。如果未定义defualt,值则为空。

  source:定义ip的值来自于哪里。默认为$remote_addr

  subdivisions 0 names en:剩下的都属于示例中的“path”,这个路径是根据mmdblookup返回的json数据来填写的。

{
    "subdivisions":
      [
        {
          "geoname_id":
            1809935 
          "iso_code":
            "GD" 
          "names":
            {
              "en":
                "Guangdong" 
              "fr":
                "Province de Guangdong" 
              "zh-CN":
                "广东" 
            }
        }
      ]
  }

参考文档

https://github.com/chinagoldline/ngx_http_geoip2_moduleicon-default.png?t=M0H8https://github.com/chinagoldline/ngx_http_geoip2_modulemmdblookup - a utility to look up an IP address in a MaxMind DB fileicon-default.png?t=M0H8https://maxmind.github.io/libmaxminddb/mmdblookup.html

你可能感兴趣的:(nginx,nginx,运维,linux)