NGINX基於用戶地理位置區分用戶。例如,不一樣的國家有不一樣的網站內容,或限制特定國家或城市的內容。nginx
NGINX使用第三方MaxMind數據庫匹配用戶的IP地址和位置。一旦知道地理位置,而後能夠在map或split_clients模塊使用基於geoip的變量。數據庫
$ nginx -V 2>&1 | grep -- 'http_geoip_module' $ nginx -V 2>&1 | grep -- 'stream_geoip_module'
或確保模塊是動態連接。服務器
$ 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
http { #... geoip_country GeoIP/GeoIP.dat; geoip_city GeoIP/GeoLiteCity.dat; #... } stream { #... geoip_country GeoIP/GeoIP.dat; geoip_city GeoIP/GeoLiteCity.dat; #... }
例如,在geoip_city、map指令中使用$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 eu。rest
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