13、Nginx高级之高级模块(geoip_module)

一、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数据库
在目录下会生成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

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

IP 地域数据库(GeoIP.dat)文件是二进制的,需要用GeoIP库来读取。所以除了要下载 GeoIP.dat 文件外,还需要安装能读取这个文件的库。
$ 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目录下,我们需要让其生效。
$ echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
$ ldconfig

3.3、编译nginx带上 ngx_http_geoip_module 模块

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

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, 结果如下:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值