WebWost WebWostbeta

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 мы можем получить следующую информацию:

Ограничиваем доступ

Теперь попробуем ограничить доступ для жителей некоторых стран, например Китая... Для этого нам необходимо добавить следующий код:

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. Спасибо за внимание!

0 Комментариев

Новый комментарий