Модуль геолокации для Apache HTTP Server (mod_maxminddb)

В данной заметке рассмотрены настройка и использование в работе веб-сервера Apache HTTP Server нового модуля геолокации от MaxMind mod_maxminddb, вышедшему на замену устаревшему mod_geoip, о котором кстати тоже имеется соответствующая заметка. Модуль max_maxminddb позволяет определить географическое положение подключившегося к серверу клиента по IP адресу, а также установить его привязку к стране, области, даже городу и т.п. Модуль оказывается полезным когда необходимо осуществлять фильтрацию клиентов по странам, для перенаправления (редиректов) в зависимости от местоположения клиента. К примеру, на данном сайте модуль используется для сохранения информации о посетителях, оставивших комментарий (геоположение, ОС, браузер).
Новый модуль разработан в связи с модификацией и улучшением структуры базы данных MaxMind, которая теперь поддерживает множество языков, стала более подробной (полное описание нововведений есть на официальном сайте, а ссылка на него в конце статьи). С выпуском модуля были введены абсолютно новые директивы конфигурирования, в связи с чем собственно и потребовалось обновление заметки. Модуль поддерживает Apache HTTP Server версии 2.2 и выше.
Установка и настройка модуля будет осуществляться на сервере FreeBSD с установленным Apache HTTP Server версии 2.4. На момент написания статьи в портах доступна версия mod_maxminddb 1.1.0. Итак, устанавливаем модуль.

# cd /usr/ports/www/mod_maxminddb
# make install clean

Задание параметров модулей у меня осуществляется отдельно для каждого модуля в соответствующих файлах, которые в дальнейшем подключаются в основной конфигурационный файл веб-сервера. Соответственно содержимое конфигурационного файла /usr/local/etc/apache24/modules.d/020_maxmind_module.conf у меня выглядит так:

LoadModule maxminddb_module       libexec/apache24/mod_maxminddb.so

<IfModule maxminddb_module>
 # Включаем модуль
 MaxMindDBEnable On

 # Указываем базы данных
 MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
 MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoLite2-City.mmdb

 # Задаем переменные окружения, в которые будут помещаться
 # сведения о геолокации
 MaxMindDBEnv GEOIP_COUNTRY_CODE COUNTRY_DB/country/iso_code
 MaxMindDBEnv GEOIP_REGION_CODE  CITY_DB/subdivisions/0/iso_code
 MaxMindDBEnv GEOIP_COUNTRY_NAME CITY_DB/country/names/en
 MaxMindDBEnv GEOIP_CITY_NAME CITY_DB/city/names/en
 MaxMindDBEnv GEOIP_LONGITUDE CITY_DB/location/longitude
 MaxMindDBEnv GEOIP_LATITUDE CITY_DB/location/latitude

 # Выключаем модуль там, где это не нужно
 <FilesMatch "\.(gif|jpe?g|png|ico|bmp|css|xml|pdf|rar|jar|js|doc|docx|html|xhtml)$">
   GeoIPEnable Off
 </FilesMatch>
</IfModule>

Для настройки модуля доступны следующие директивы:

  • MaxMindDBEnable bool — включить/отключить модуль. Включить/отключить модуль можно в любом месте основного конфига Apache, даже в .htaccess. В настоящее время возможно конфигурирование модуля в глобальном пространстве, а также пространствах ограничивающихся директивами VirtualHost, Directory, Location. Следует сделать важное замечание, что при выключенном модуле наследование параметров из глобального пространства или VirtualHost в пространства, ограничивающиеся директивами Directory, Location и .htaccess не осуществляется. Т.е. не включив модуль и задав все параметры в основном конфиге Apache, придется задавать их снова при включении модуля в .htaccess. Возможные значения On или Off.
  • MaxMindDBFile DB_NAME DB_PATH — путь к файлу с базой данных MaxMind в формате mmdb. Обычно файлы находятся в /usr/local/share/GeoIP/*.mmdb.
  • MaxMindDBEnv ENV_NAME DB_NAME/tree/field — директива позволяет экспортировать в переменные окружения Apache сведения, содержащиеся в базе данных MaxMind. Первый параметр имя переменной окружения, в которую будут экспортированы сведения, второй параметр указывает из какого поля в базе данных брать данные сведения.

Помимо задаваемых в конфигурации, в переменные окружения Apache модулем всегда экспортируются MMDB_ADDR, которая содержит IP адрес, по которому осуществлялся поиск в базе данных, а также MMDB_INFO, в которой указан результат поиска (успешно/не успешно). В соответствии с приведенной в данной заметке конфигурацией, в заданные нами переменные окружения Apache будут экспортированы следующие данные:

  • GEOIP_COUNTRY_NAME — название страны (например, Russia для России)
  • GEOIP_REGION_CODE — 3-х буквенный код региона, области
  • GEOIP_LATITUDE и GEOIP_LONGITUDE — географические координаты (долгота и широта)
  • GEOIP_CITY_NAME — название города (например, Moscow)
  • GEOIP_COUNTRY_CODE — 2-х буквенных код страны (например, RU для России)

Как говорилось ранее с помощью информации от модуля можно ограничивать доступ по странам, например для какого-нибудь виртуального хоста можно сделать:

<IfModule maxminddb_module>
 MaxMindDBEnable On
 MaxMindDBFile DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
 MaxMindDBEnv GEOIP_COUNTRY_CODE DB/country/iso_code

 <IfModule setenvif_module>
   SetEnvIf GEOIP_COUNTRY_CODE ^(RU) AllowCountry
 </IfModule>

 <Directory /path/to/www>
   Require env AllowCountry
 </Directory>
</IfModule>

Таким образом, доступ к сайту будет только у жителей РФ. На официальном сайте можно скачать дополнительные базы данных, содержащие более подробные сведения об IP адресах. Актуальные базы данных стоят денег, но устаревшые на месяц выкладываются бесплатно. Обновление или первичное скачивание баз данных MaxMind рекомендую делать утилитой geoipupdate, которая тоже имеется в портах FreeBSD (net/geoipupdate). После ее установки необходимо отредактировать конфиг /usr/local/etc/GeoIP.conf.

# Дополнительные сведения о настройке и использовании geoipupdate
# можно получить на странице https://dev.maxmind.com/geoip/geoipupdate/

# Здесь указывается "account ID" и лицензионный ключ, которые вадаются MaxMind
# при покупке лицензии (см. https://www.maxmind.com/en/my_license_key).
# Если лицензии на платные базы нет, тогда указываются нули.
AccountID 0
LicenseKey 000000000000

# Указываем базы данных, которые будут скачиваться с серверов MaxMind.
# Базы данных разделяются пробелом.
EditionIDs GeoLite2-Country GeoLite2-City

# Следующие параметры являются не обязательными для конфигурирования.

# Директория, в которой будут сохраняться базы данных MaxMind.
# По умолчанию: /usr/local/share/GeoIP
DatabaseDirectory /usr/local/share/GeoIP

# Сервер, с которого будут скачиваться базы данных.
# По умолчанию: "updates.maxmind.com"
Host updates.maxmind.com

# Параметры прокси. Если порт не указан, то используется "1080".
# Proxy 127.0.0.1:8888

# Параметры для авторизации на прокси.
# ProxyUserPassword username:password

# Количество сохраняемых модификаций (предыдущих версий) БД.
# По умолчанию: "0".
# PreserveFileTimes 0

# Файл блокировки. Используется только в процессе работы geoipupdate.
# Учтите: После создания он не удаляется программой.
# По умолчанию: ".geoipupdate.lock" в директории, указанной в DatabaseDirectory.
LockFile /usr/local/share/GeoIP/.geoipupdate.lock

Автоматическое обновление баз данных MaxMind можно осуществлять через cron следующим образом:

#min:hour:day:month:day of week:command
27    17   *    *       6       /usr/local/bin/geoipupdate

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

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика