第十二節——限制地理位置訪問

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

相關文章
相關標籤/搜索