一、ngx_http_geoip_module模块

ngx_http_geoip_module模块使用预编译的MaxMind数据库,根据客户端IP地址创建变量值 ,读取ip所在地信息。

当使用支持IPv6的数据库(1.3.12, 1.2.7)时,IPv4地址被查找为IPv4映射的IPv6地址。

默认情况下不构建此模块,应 使用 --with-http_geoip_module 配置参数启用它。

此模块需要 MaxMind GeoIP

Example Configuration

http {
    geoip_country GeoIP.dat;
    geoip_city GeoLiteCity.dat;
    geoip_proxy 192.168.100.0/24;
    geoip_proxy 2001:0db8::/32;
    geoip_proxy_recursive on;
    ...
}

使用场景:

  1. 区别国内外的ip
  2. 区别城市间的ip


二、指令

句法:geoip_country file;

默认:—

配置项:http

功能:指定用于根据客户端 IP 地址确定国家/地区的数据库。使用此数据库时可以使用以下变量:

  • $geoip_country_code:两个字母的国家代码,例如“ RU”、“ US”。
  • $geoip_country_code3:三字母国家代码,例如“ RUS”、“ USA”。
  • $geoip_country_name:国家名称,例如“ Russian Federation”、“ United States”。


句法:geoip_city file;

默认:—

配置项:http

功能:定用于根据客户端IP地址确定国家、地区和城市的数据库。使用此数据库时可以使用以下变量:

  • $geoip_area_code:电话区号(仅限美国)。由于相应的数据库字段已弃用,此变量可能包含过时的信息。
  • $geoip_city_continent_code:两个字母的大洲代码,例如“ EU”、“ NA”。
  • $geoip_city_country_code:两个字母的国家代码,例如“ RU”、“ US”。
  • $geoip_city_country_code3:三字母国家代码,例如“ RUS”、“ USA”。
  • $geoip_city_country_name:国家名称,例如“ Russian Federation”、“ United States”。
  • $geoip_dma_code:根据Google AdWords API 中的geotargeting,美国的 DMA 区域代码(也称为“都市圈代码”)。
  • $geoip_latitude:纬度。
  • $geoip_longitude:经度。
  • $geoip_region:双符号国家地区代码(地区、领土、州、省、联邦土地等),例如“ 48”、“ DC”。
  • $geoip_region_name:国家地区名称(地区、领地、州、省、联邦土地等),例如“ Moscow City”、“ District of Columbia”。
  • $geoip_city:城市名称,例如“ Moscow”、“ Washington”。
  • $geoip_postal_code:邮政编码。


句法:geoip_org file;

默认:—

配置项:http

功能:该指令出现在版本 1.0.3 中。指定用于根据客户端 IP 地址确定组织的数据库。使用此数据库时,以下变量可用:

$geoip_org:组织名称,例如“墨尔本大学”


句法:geoip_proxy address | CIDR;

默认:—

配置项:http

功能:定义可信地址。当请求来自受信任的地址时,将使用“X-Forwarded-For”请求标头字段中的地址。


三、示例演示

3.1、下载IP数据库

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

上面的地址已失效(Maxmind不再支持Geolite产,仅支持Geolite2),可以从GeoIP Legacy Databases下载

Nginx高级之高级模块(geoip_module)_数据库

在目录下会生成2个.gz的文件, 解压生成2个.dat文件然后将它们拷贝至/etc/nginx/geoip目录下:

$ gzip -d -k GeoIP.dat.gz
$ gzip -d -k GeoLiteCity.dat.gz
$ sudo mkdir /etc/nginx/geoip
$ sudo cp GeoIp.dat /etc/nginx/geoip
$ sudo cp GeoLiteCity.dat /etc/nginx/geoip

Nginx高级之高级模块(geoip_module)_nginx_02

3.2、下载可以读取GeoIP数据库的工具

IP 地域数据库(GeoIP.dat)文件是二进制的,需要用GeoIP库来读取。所以除了要下载 GeoIP.dat 文件外,还需要安装能读取这个文件的库。

GeoIP project files : GeoIP

$ wget https://launchpadlibrarian.net/96958425/GeoIP-1.4.8.tar.gz  
# http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz失效
$ tar -zxvf GeoIP-1.4.8.tar.gz
$ cd GeoIP-1.4.8    # 注意这个解压出的版本随时在变,我解压时,是1.4.8版本的
$ ./configure
$ make; make install

上面的操作,将工具安装到了/usr/local/lib目录下,我们需要让其生效。

Nginx高级之高级模块(geoip_module)_ci_03

$ echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
$ ldconfig

3.3、编译nginx带上 ngx_http_geoip_module 模块

(3条消息) nginx添加模块_青霄的博客-CSDN博客

查看有没有geoip模块:若没有  使用 --with-http_geoip_module 配置参数编译nginx

Nginx高级之高级模块(geoip_module)_数据库_04

3.4、配置conf.d/geoip.conf: 在http域引入上面生成的2个.dat文件

# 引入地域ip文件
geoip_country /etc/nginx/geoip/GeoIp.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; 
 
server {
    listen 8088;
    server_name localhost;
 
    root /usr/share/nginx/html/;
 
    #set $geoip_country_code "hh";
    #set $geoip_country_name "china";
    #set $geoip_city "nj";
 
 
    # 所在国代码不是CN则拦截,返回403
    location / {
        if ($geoip_country_code != CN) {  
            return 403;
        }
        index index.html index.htm;
    }
    
    # 测试本地ip的所在国名称/所在国代码/所在城市名称
    location /myip {
        default_type text/plain;
        add_header X-Geo $geoip_country_code;                   
        add_header X-Geo3 $geoip_country_code3;
 
        return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
    }
}

3.5、测试

阿里云机器,ECS公网IP: 47.103.25.92

在代理的情况下($geoip_country_code不为CN)访问nginx, 结果如下:

Nginx高级之高级模块(geoip_module)_数据库_05

Nginx高级之高级模块(geoip_module)_数据库_06

在无代理的情况下用本地ip($geoip_country_code为CN)访问nginx, 结果如下:

Nginx高级之高级模块(geoip_module)_ci_07

Nginx高级之高级模块(geoip_module)_nginx_08


四、参考

Module ngx_http_geoip_module

nginx - HttpGeoipModule $geoip_country_code is blank - Server Fault

#2321(ngx_http_geoip_module问题) - 恩金克斯 (nginx.org)

duplicate geoip variable · Issue #92 · leev/ngx_http_geoip2_module · GitHub


转自:https://blog.csdn.net/leiwuhen92/article/details/131379717