Nginx: Блокируем доступ к сайту пользователям из нежелательных стран

Иногда встает задача заблокировать доступ к сайту для пользователей из нежелательных стран, например из Пакистана и Китая.

Как это сделать на примере web-сервера nginx мы рассмотрим ниже.

Исходные данные: Debian 8.9 (jessie), nginx 1.13.5 (nginx установлен из официального репозитария)
Задача: Заблокировать доступ к сайту для Пакистана и Китая.

Ставим модуль geoip:

apt-get install nginx-module-geoip

Проверяем наличие базы GeoIP

ls -l /usr/share/GeoIP/GeoIP.dat

Если нет, то ставим:

apt-get install geoip-database libgeoip1

Обновим базу MaxMind до актуальной версии:

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.bak
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz && mv GeoIP.dat /usr/share/GeoIP/

Теперь настроим сам nginx, в файле /etc/nginx/nginx.conf пишем

load_module modules/ngx_http_geoip_module.so;
load_module modules/ngx_stream_geoip_module.so;

Далее в секции http пишем:

# Block country China and Pakistan
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country_mysite {
    default yes;
    CN no;
    PK no;
}

Далее в нужном vhost для location / ставим блок:

location / {
    if ($allowed_country_mysite = no) {
            return 403;
    }
    ...
}

Проверяем и перезагружаем конфигурацию nginx:

nginx -t
nginx -s reload

На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.