GeoIP для Nginx
Расширение GeoIP позволяет определить местоположение клиента в зависимости от его IP адрес. Определяется Город, область, страна, долгота, широта, и другая информация. Очень удобно использовать на сайтах, которые переведены на несколько языков и переадресовывать клиентов из разных стран на страницы с их родным языком.
Итак для начала нужно убедиться что Nginx собран с поддержкой geoip:
nginx -V 2>&1 |grep http_geoip_module
Если вы ничего не получили в ответ - можете почитать статью о том, как собрать nginx из исходников с поддержкой geip.
Дальше нужно скачать базы GeoIP и разместить их в месте, доступном для nginx. Я создал папку:
mkdir /etc/nginx/geoip && cd /etc/nginx/geoip
Скачиваем последние версии баз:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip *.gz
Настраиваем Nginx на работу с базами. Для начала нужно добавить следующие строки в nginx.conf в секцию http:
geoip_country /etc/nginx/geoip/GeoIP.dat; # the country IP database
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # the city IP database
Директива geoip_country добавляет доступными переменные:
$geoip_country_code
- две буквы кода страны, на пример: RU, US, UA.$geoip_country_code3
- две буквы кода страны, на пример: RUS, USA.$geoip_country_name
- расширенное имя страны, на пример: Russian Federation, United States
Директива geoip_city добавляет доступными переменные:
$geoip_region
- имя региона на пример, Moscow City.$geoip_city
- имя города, на пример: Moscow, Washington, Lisbon.$geoip_postal_code
- почтовый код$geoip_city_continent_code
$geoip_latitude
$geoip_longitude
Для того, что бы это все заработало, нужно добавить нужны переменные в файл с конфигурацией fcgi.
У меня это /etc/nginx/conf/fastcgi_params:
### SET GEOIP Variables ###
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
Если же вы используете Nginx как фронт-энд (reverse proxy), тогда нужно еще создать эти же строки в файл proxy.conf
Примеры использования в настройках Nginx:
Использование кода страны для отображения контента:
if ($geoip_country_code = RU) {
сделать что-то для посетителей из России ;
# например set root path /var/www/html/content/ru/;
}
Использование кода города для отображения контента:
if ($geoip_region = Moscow) {
сделать что-то для посетителей из Москвы ;
# например set root path /var/www/html/content/Moscow/;
}