第十二节——限制地理位置访问

1    介绍

NGINX基于用户地理位置区分用户。例如,不一样的国家有不一样的网站内容,或限制特定国家或城市的内容。nginx

NGINX使用第三方MaxMind数据库匹配用户的IP地址和位置。一旦知道地理位置,而后能够在map或split_clients模块使用基于geoip的变量。数据库

2    先决条件

  • 使用http geoip和/或stream geoip模块的NGINX。
  • MaxMind数据库。

3    在NGINX上配置GeoIP

  •  使用--with-http_geoip_module和/或--with-http_stream_geoip_module配置标记编译NGINX:
$ nginx -V 2>&1 | grep -- 'http_geoip_module'
$ nginx -V 2>&1 | grep -- 'stream_geoip_module'

或确保模块是动态连接。服务器

  • 下载并解压MaxMind Geo国家和城市数据库:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$ gunzip GeoIP.dat.gz
$ gunzip GeoLiteCity.dat.gz
  •  使用geoip_country和geoip_city指令添加数据库路径到NGINX配置:
http {
    #...
    geoip_country GeoIP/GeoIP.dat;
    geoip_city    GeoIP/GeoLiteCity.dat;
    #...
 }
   
stream {
    #...
    geoip_country GeoIP/GeoIP.dat;
    geoip_city    GeoIP/GeoLiteCity.dat;
    #...
}
  • 使用GeoIP模块的标准变量传递数据到mapsplit_clients指令。

例如,在geoip_citymap指令中使用$geoip_city_continent_code变量,能够建立另外一个变量的值基于链接位置最近的服务器:网站

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

而后你能够基于$nearest_server变量传入的值选择一个上游服务器:spa

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

若是大陆是欧洲,那么$nearest_server的值为eu,链接将经过proxy_pass指令传递给upstream eurest

4    完整例子

geoip_country GeoIP/GeoIP.dat;
geoip_city    GeoIP/GeoLiteCity.dat;
map $geoip_city_continent_code $nearest_server {
    default default {};
    EU      eu;
    NA      na;
    AS      as;
    AF      af;
server {
    listen 12346;
    proxy_pass $nearest_server;
}
upstream eu {
    server eu1.example.com:12345;
    server eu2.example.com:12345;
}
upstream na {
    server na1.example.com:12345;
    server na2.example.com:12345;
}

在该例子中,在GeoLiteCity.dat数据库中检查IP地址,结果写入$geoip_city_continent_code变量。NGINX将匹配变量的值和map指令的值,结果在自定义变量中,上面的例子中$nearest_server。基于$nearest_server的值,proxy_pass指令选择适当上游服务器。code

相关文章
相关标签/搜索