Nginx通过地理位置限制访问

  • 介绍
  • 先决条件
  • 获取数据库
  • 了解数据库结构
  • 在NGINX Plus中配置GeoIP2
  • 方案:选择最近的服务器

介绍

NGINX Plus可以根据用户的地理位置来区分用户。例如,您可以为不同的国家/地区提供不同的网站内容,或者可以将内容分发限制为特定的国家或城市。

NGINX Plus使用第三方MaxMind数据库来匹配用户的IP地址及其位置。知道地理位置后,便可以在mapsplit_clients模块中使用基于Geoip的变量。

注意: MaxMind GeoLite传统数据库目前已停产,应改用MaxMind GeoIP2或GeoLite2数据库和NGINX Plus GeoIP2模块。

地理位置限制适用于HTTP和TCP / UDP协议。

先决条件

  • NGINX Plus GeoIP2动态模块
  • MaxMind的GeoIP2或GeoLite2数据库
  • (可选)mmdblookup实用程序,用于在MaxMind数据库文件中查找IP地址

获取数据库

可以从MaxMind下载页面获得GeoIP2或GeoLite2数据库。在此示例中,使用了免费的GeoLite2可下载数据库。

要获取和解压缩GeoLite2国家数据库:

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
$ gunzip GeoLite2-Country.mmdb.gz

要获取和解压缩GeoLite2 City数据库:

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
$ gunzip GeoLite2-City.mmdb.gz

了解数据库结构

要查看可用的地理数据,可以使用mmdblookup实用程序查询GeoLite2-Country和GeoLite2-City数据库。地理数据表示为JSON树。

安装libmaxminddb数据库实用程序:

  • 对于Amazon Linux,CentOS,Oracle Linux和RHEL:

    $ yum install libmaxminddb-devel

  • 对于Debian和Ubuntu:

    $ apt-get install libmaxminddb-dev

  • 对于SLES:

    $ zypper install libmaxminddb-devel

对数据库的查询可以以下格式发送:

mmdblookup –file [FILE PATH] –ip [IP ADDRESS] [DATA PATH]

例如,要获取8.8.8.8IP地址的所有可用地理数据,请发送以下命令:

$ mmdblookup --file /usr/local/etc/geoip2/GeoLite2-Country.mmdb --ip 8.8.8.8

输出将是:

{"continent":{"code":"NA" <utf8_string>"geoname_id":6255149 <uint32>"names":{"de":"Nordamerika" <utf8_string>"en":"North America" <utf8_string>"es":"Norteamérica" <utf8_string>"fr":"Amérique du Nord" <utf8_string>"ja":"北アメリカ" <utf8_string>"pt-BR":"América do Norte" <utf8_string>"ru":"Северная Америка" <utf8_string>"zh-CN":"北美洲" <utf8_string>}}"country":{"geoname_id":6252001 <uint32>"iso_code":"US" <utf8_string>"names":{"de":"USA" <utf8_string>"en":"United States" <utf8_string>"es":"Estados Unidos" <utf8_string>"fr":"États-Unis" <utf8_string>"ja":"アメリカ合衆国" <utf8_string>"pt-BR":"Estados Unidos" <utf8_string>"ru":"США" <utf8_string>"zh-CN":"美国" <utf8_string>}}"registered_country":{"geoname_id":6252001 <uint32>"iso_code":"US" <utf8_string>"names":{"de":"USA" <utf8_string>"en":"United States" <utf8_string>"es":"Estados Unidos" <utf8_string>"fr":"États-Unis" <utf8_string>"ja":"アメリカ合衆国" <utf8_string>"pt-BR":"Estados Unidos" <utf8_string>"ru":"США" <utf8_string>"zh-CN":"美国" <utf8_string>}}}

例如,要获取特定的地理数据,例如仅获取特定国家/地区的ISO代码,请在命令末尾添加参数:country iso_code

$ mmdblookup --file /usr/local/etc/geoip2/GeoLite2-Country.mmdb --ip 8.8.8.8 country iso_code

在用于NGINX的GeoIP2模块中创建变量时,也会使用这些参数。

在NGINX Plus中配置GeoIP2

  1. 为NGINX Plus安装GeoIP2动态模块:

    对于Amazon Linux,CentOS,Oracle Linux和RHEL:

    $ yum install nginx-plus-module-geoip2

    对于Debian和Ubuntu:

    $ apt-get install nginx-plus-module-geoip2

    对于SLES:

    $ zypper install nginx-plus-module-geoip2

  2. load_module使用main配置级别中指定的指令在NGINX Plus配置文件中启用GeoIP2动态模块:

    load_module modules/ngx_http_geoip2_module.so;
    load_module modules/ngx_stream_geoip2_module.so;http {# ...
    }

  3. 路径的国家和城市数据库添加到NGINX配置与块,或两者:geoip2 {}http {}stream {}

     
    http { #... geoip2 GeoIP2/GeoLite2-Country.mmdb { #... } geoip2 GeoIP2/GeoLite2-City.mmdb { #... } } stream { #... geoip2 GeoIP2/GeoLite2-Country.mmdb { #... } geoip2 GeoIP2/GeoLite2-City.mmdb { #... } } 

  4. 根据GeoIP数据库结构,创建自定义变量,该变量将保留GeoIP2数据库中的数据,然后将数据传递给mapsplit_clients指令(可以在和上下文中应用):http {}stream {}

geoip2 GeoIP2/GeoLite2-City.mmdb {$geoip2_data_city_name   city names en;$geoip2_data_postal_code postal code;$geoip2_data_latitude    location latitude;$geoip2_data_longitude   location longitude;$geoip2_data_state_name  subdivisions 0 names en;$geoip2_data_state_code  subdivisions 0 iso_code;
}geoip2 GeoIP2/GeoLite2-Country.mmdb {$geoip2_data_continent_code   continent code;$geoip2_data_country_iso_code country iso_code;
}#...

方案:选择最近的服务器

使用来自创建的变量的地理位置数据,可以将客户端连接重定向到最近的服务器,从而减少网络延迟并提高连接速度。

这可以通过在变量中使用来自GeoIP2数据库的大洲代码和map将创建另一个变量的模块来实现,该变量的值将是基于大洲位置的最接近的服务器。基于此值,NGINX将请求传递给相应的上游服务器组。

  1. 对于IP地址无法与GeoIP数据库匹配的情况,请确保已为每个大陆(例如欧洲,北美)配置了服务器或上游服务器组:eunaall

    upstream all {server all1.example.com:12345;server all2.example.com:12345;
    }upstream eu {server eu1.example.com:12345;server eu2.example.com:12345;
    }upstream na {server na1.example.com:12345;server na2.example.com:12345;
    }

  2. 添加具有任何名称(例如)的变量的块,以获取GeoIP2数据库的洲代码:geoip2 {}$geoip2_data_continent_code

      
    geoip2 GeoIP2/GeoLite2-Country.mmdb { $geoip2_data_continent_code continent code; } #... 

  3. 创建map将创建$nearest_server变量的块:

    #...
    map $geoip2_data_continent_code $nearest_server {default all;EU      eu;NA      na;AS      as;AF      af;
    }
    #...

  4. 创建一个块,该块将根据变量中传递的值将请求传递给上游服务器组之一:server {}$nearest_server

    server {listen 12346;proxy_pass http://$nearest_server;
    }

如果大陆是欧洲,则$nearest_serverwill 的值将是eu,并且连接将eu通过proxy_pass伪指令传递给上游:

#...
server {listen 12346;proxy_pass http://$nearest_server;
}upstream all {server all1.example.com:12345;server all2.example.com:12345;upstream eu {server eu1.example.com:12345;server eu2.example.com:12345;
}
upstream na {server na1.example.com:12345;server na2.example.com:12345;
}
#...

此示例可以在httpstream上下文中应用。

# can be either "http {}" or "stream {}"
#...
geoip2 GeoIP2/GeoLite2-Country.mmdb {$geoip2_data_continent_code continent code;
}map $geoip2_data_continent_code $nearest_server {default all;EU      eu;NA      na;AS      as;AF      af;
}server {listen 12346;proxy_pass http://$nearest_server;}upstream all {server all1.example.com:12345;server all2.example.com:12345;
}upstream eu {server eu1.example.com:12345;server eu2.example.com:12345;
}upstream na {server na1.example.com:12345;server na2.example.com:12345;
}

在此示例中,将在GeoLite2-Country.mmdb数据库中检查IP地址,结果将被写入$geoip2_data_continent_code变量。map在我们的示例中,NGINX Plus会将变量的值与指令中的值进行匹配,并将结果写入自定义变量中$nearest_server。根据的值$nearest_serverproxy_pass伪指令将选择相应的上游服务器。

更多信息

  • GeoIP2动态模块安装说明
  • MaxMind GeoIP2数据库
  • MaxMind Geolite2免费可下载数据库

Nginx通过地理位置限制访问相关推荐

  1. 阿里云服务器ECS Linux系统分析nginx或apache当天访问最多的IP

    Linux 系统查询 nginx 或 apache 当天访问最多的 IP 方法,以一键安装包为例可以执行如下命令: cat /alidata/log/nginx/access/testweb.log ...

  2. Nginx 禁止某 IP 访问

    导语 总有一些不怀好意的人来访问我的网站,而且频率还很高,所以就用简单的方式禁止访问,就用 Nginx 来实现. 创建黑名单 在 /usr/local/nginx/conf 目录下创建 blocksi ...

  3. nginx之静态资源访问和负载均衡的使用!

    一.前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍): 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接 ...

  4. 通过Nginx配置多域名访问

    通过Nginx配置多域名访问 一.下载Nginx 访问Nginx官网选择对应版本和安装包:http://nginx.org/ 以下讲述为在Windows环境下配置Nginx进行多域名访问 二.Ngin ...

  5. nginx配置 vue打包后的项目 解决刷新页面404问题|nginx配置多端访问

    访问vue页面时,/# 使url看着不美观,使用 H5 history模式可以完美解决这个问题,但需要后端nginx帮助.接下来我们自己配置一下. 使用前端路由,但切换新路由时,想要滚动到页面顶部,或 ...

  6. 全网最详细的docker配置nginx http2 优化高速访问

    Nginx 从 1.13.9 版本开始加入了 HTTP/2 的 Server Push 功能,本文将介绍如何在 Nginx 下实现 HTTP/2 服务器推送 (Server Push) .这里我们首先 ...

  7. docker 启动成功但无法访问_docker nginx 运行后无法访问的问题解决

    ## 1 最近在学docker部署,一开始打算将nginx先docker化的. 对照官方的docker镜像介绍说明,进行自定义配置 将官方的nginx.conf复制出来后,修改添加了一些自定义,主要是 ...

  8. nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】

    平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我.跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心 ...

  9. docker安装nginx,配置nginx,并成功访问

    [Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...

最新文章

  1. 一张图追踪测序的大历史背景
  2. Direct2D教程(三)简单几何图形
  3. SpringBoot开发第一个Web入门级应用(超详细)
  4. arcgis 坐标系 2000坐标系_干货 | 关于投影和坐标系那些事,你是否都已还给了老师?...
  5. [react] 你有用过React的插槽(Portals)吗?怎么用?
  6. 那些年我们踩过的坑-NSTimer
  7. 【ROS学习笔记】(五)话题消息的定义与使用
  8. 使用spss做各种相关性分析的方法和步骤
  9. idea配置svn地址
  10. 使用Python写登录京东商城购物,加入购物车的脚本
  11. 物联网可靠连接——PLC-IOT电力线载波通讯
  12. Boobooke (播布客) 是个好网站
  13. IT之家精华:苹果iOS系统发布/固件下载/升级更新大全表~
  14. 【转载】如何统计分析网站的访问量
  15. 堆内存和栈内存的区别
  16. html行内样式选择器怎么写,巧用CSS伪类选择器实现九种样式的九宫格
  17. 武林传奇之七剑下天山java游戏开发商_武林传奇2之七剑下天山的配方
  18. 树以及二叉树的常用性质以及遍历
  19. PM常用语看这篇就够了
  20. 机器视觉定位入门三步走-第二步

热门文章

  1. Memcache 中实现消息队列
  2. 视差滚动(Parallax Scrolling)效果的原理和实现
  3. Magento布局layout.xml文件详解
  4. Ubuntu 16.04 安装phpmyadmin以及注意事项
  5. 【C++基础学习】关于C++静态成员函数和变量
  6. 字符流的抽象类 reader writter java
  7. django-路由-通过正则表达式来捕获路径-对应视图函数
  8. 计算机编程语言的分类与python语言快速度认识
  9. 两个数组的交集 II---简单
  10. WinForm下屏幕截图程序的实现