Настройка nginx + GeoIP на FreeBSD

Зачем это надо? Да много чего можно наворотить! Например разным странам выдавать разный контент, проксировать трафик на разные сервера и тд. Мне, например, для ограничения нежелательного трафика на некий тестовый web-сервер. Хочу дать туда доступ только из Украины, остальных — в баню!
У меня уже был установлен и настроен nginx, поэтому тут упомяну только о включении в его сборку необходимого модуля.
Для начала я установил GeoIP из портов:

root@gw:~# cd /usr/ports/net/GeoIP
root@gw:/usr/ports/net/GeoIP# make install clean

После этого проверил стоит ли в собранном ранее nginx необходимый флаг HTTP_GEOIP:

root@gw:/usr/ports/net/GeoIP# cd /usr/ports/www/nginx
root@gw:/usr/ports/www/nginx# make config


Вот что я увидел:
nginx + GeoIP
Тоесть nginx у меня уже был собран с опцией GeoIP и пересобирать его ненужно. Если у вас не так, просто отметьте опцию и пересоберите nginx командой make reinstall
Теперь нужно скачать саму базу GeoIP в которой собственно и хранится информация о том какие блоки IP принадлежат какой стране. Переходим в директорию с конфигами nginx:

root@gw:/usr/ports/www/nginx# cd /usr/local/etc/nginx

Создадим для базы GeoIP отдельную директорию db и перейдем в нее:

root@gw:/usr/local/etc/nginx# mkdir db
root@gw:/usr/local/etc/nginx# cd db/

Скачаем базу данных GeoIP и распакуем ее:

root@gw:/usr/local/etc/nginx/db# wget -c http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
--2014-05-14 10:00:11--  http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
Распознаётся geolite.maxmind.com (geolite.maxmind.com)… 108.168.255.243
Подключение к geolite.maxmind.com (geolite.maxmind.com)|108.168.255.243|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 388647 (380K) [application/octet-stream]
Сохранение в: «GeoIP.dat.gz»

100%[=============================================================================================================>] 388 647      289KB/s   за 1,3s  

2014-05-14 10:00:13 (289 KB/s) - «GeoIP.dat.gz» сохранён [388647/388647]

root@gw:/usr/local/etc/nginx/db# gunzip GeoIP.dat.gz

Вот что получили в результате:

root@gw:/usr/local/etc/nginx/db# ls -l
total 688
-rw-r--r--  1 root  wheel  677128  6 май 21:27 GeoIP.dat
root@gw:/usr/local/etc/nginx/db# cd
root@gw:~#

Видим некий файлик GeoIP.dat, это какраз и есть нужная нам база GeoIP.

Дальше настроим nginx:

root@gw:~# vim /usr/local/etc/nginx/nginx.conf

В секции http добавить следующее (в примере запрещено всем, кроме UA):

http {

    geoip_country /usr/local/etc/nginx/db/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        UA yes;
    }
.....

Ну и дальше в каждую секцию server, при необходимости использовать GeoIP, нужно добавить простое условие:

if ($allowed_country = no) {
            return 444;
        }

Сохранить конфиг, перегрузить nginx

root@gw:~# service nginx restart
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Stopping nginx.
Waiting for PIDS: 1623.
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.
root@gw:~#

Наслаждаемся 🙂
Я потестил с разных IP доступ к ресурсу, все работает верно! С зоны UA сайт доступен, с US и RU — нет.

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?