GeoIP
Использование модуля GeoIP для nginx
Al-Sher
Всем привет. Сегодня я хочу рассказать про работу с модулем GeoIP для nginx. Данный модуль позволяет узнать, откуда пользователь зашел к нам на сайт(страна/город), а так же блокировать пользователей из некоторых стран.
Установка GeoIP
Для работы GeoIP с nginx, необходим модуль geoIP. Давайте проверим, имеется ли таковой на нашем сервере:
nginx -V
Если в списке configure arguments имеется фраза --with-http_geoip_module, то модуль уже установлен, иначе Вам придется пересобрать Nginx, включив данный модуль в конфигурацию. О том, как собирать Nginx, я уже писал в этой статье.
Далее нам необходимо скачать более новую базу GeoIP. Сделать это можно следующими командами:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
Первая база(GeoIP) содержит в себе только информацию о стране, а вот вторая(GeoLiteCity) уже содержит в себе информацию о городах...
Подключение к Nginx
Давайте теперь подключим наши базы в Nginx. Подправим наш конфиг:
nano /etc/nginx/nginx.conf
Нам необходимо подключить наши базы, для этого добавим в секцию http следующие строки:
geoip_country /path/to/GeoIP.dat;
geoip_city /path/to/GeoLiteCity.dat;
Не забудьте указать правильный путь к базам GeoIP! Теперь добавим некоторую информацию, которую Nginx будет передавать нашему обработчику(например, PHP):
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
Теперь в PHP нам достаточно вызвать
$_SERVER['GEOIP_COUNTRY_CODE']
для получения кода страны.
Переменные GeoIP
В модуле GeoIP мы можем получить следующую информацию:
- geoip_country_code - код страны(2 символа);
- geoip_country_code3 - код страны(3 символа);
- geoip_country_name - название страны;
- geoip_region - область;
- geoip_city - город;
- geoip_postal_code - почтовый индекс;
- geoip_latitude - широта;
- geoip_longitude - долгота.
Ограничиваем доступ
Теперь попробуем ограничить доступ для жителей некоторых стран, например Китая... Для этого нам необходимо добавить следующий код:
map $geoip_country_code $allowed_country {
default yes;
CN no;
}
Таким образом, мы разрешаем доступ из всех стран, кроме Китая. Но что, если вдруг нам понадобится разрешить доступ только для жителей США и Канады? Ну что же, тогда нам следует default сделать отрицательным. Пример:
map $geoip_country_code $allowed_country {
default no;
US yes;
CA yes;
}
Осталось лишь возвращать ошибку для жителей стран, чьи посещения мы хотим ограничить:
if ($allowed_country = no) {
return 403;
}
Заключение
В заключение хочу сказать лишь то, что удобнее всего хранить необходимые параметры GeoIP в файле с другими fastcgi-параметрами, то есть в /etc/nginx/fastcgi_params. Спасибо за внимание!