В данной статье будет вестись рассказ о настройке модуля mod_geoip для веб-сервера Apache. Данный модуль позволяет определить географическое положение подключившегося к серверу клиента по IP адресу. Зачем это нужно? Ответ прост — появляется возможность фильтрации клиентов по странам или автоматом направлять клиента на нужную часть сайта. К примеру, на данном сайте используется модуль, который сохраняет информацию о посетителях, оставивших комментарий (геоположение, ОС, браузер).
Вот информацию о геоположении как раз предоставляет модуль mod_geoip.
На момент написания статьи в портах доступна версия mod_geoip 1.2.8. Ставим модуль.
-
# cd /usr/ports/www/mod_geoip2
-
# make install clean
После установки модуля необходимо проверить включен ли он, для этого нужно посмотреть в главном конфигурационном файле Apache присутствует ли строчка:
-
LoadModule geoip_module libexec/apache22/mod_geoip.so
Для настройки модуля доступны следующие директивы:
- GeoIPEnable bool — включить/отключить модуль. Включить/отключить модуль можно в любом месте конфигурационного файла, даже в .htaccess. Возможные значения On или Off.
- GeoIPDBFile dbpath [flag] — путь к файлу с базой данных о географической информации. По умолчанию файл находится здесь: /usr/local/share/GeoIP/GeoIP.dat. Опциональное поле flag позволяет установить дополнительные режимы работы с базой данных (на данный момент модуль не позволяет комбинировать опции):
- Standard — не использовать кеширование, таким образом используется меньше памяти. Является значением по молчанию.
- MemoryCache — кешировать данные в памяти, влечет за собой большее потребление памяти. Рекомендуется использовать с небольшими базами днных.
- MMapCache — делает тоже самое, что и MemoryCache, только для загрузки в память базы данных используется системный вызов mmap.
- CheckCache — заставляет модуль проверять базу данных на предмет изменения (обновления). Если база данных была изменена, то модуль перезагрузит ее. Если опция не используется, то при изменении базы данных необходимо перезагружать Apache.
- IndexCache — частичное кеширование данных из базы данных, то есть будут кешироваться данные, к которым были обращения. Рекомендуется использовать с большими базами данных.
- GeoIPEnableUTF8 bool — предоставлять информацию о геоположении в кодировке UTF-8 вместо ISO-8859-1. Возможные значения On или Off.
- GeoIPOutput param — параметр определяет, куда помещать информацию о геположении. Возможные значения:
- Notes — только в таблицу уведомлений Apache (например, доступ из PHP можно осуществить через функцию apache_note).
- Env — только в переменные окружения. Полный список переменных, которые добавляет модуль, есть на официальном сайте (ссылка на него в конце статьи).
- All — комбинация Notes и Env. Является значением по умолчанию.
- GeoIPScanProxyHeaders bool — проверять запрос на наличие заголовков (заголовки указаны в порядке проверки их модулем) HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, X-Forwarded-For, HTTP_REMOTE_ADDR. Если такие присутствуют, то использовать IP адрес из них для определения местоположения. Возможные значения On или Off.
- GeoIPUseLastXForwardedForIP bool — используется, если включен параметр GeoIPScanProxyHeaders. В заголовках (указанных выше), может быть указан не один IP адрес, а список IP адресов. Если такой присутствует, то по умолчанию используется первый IP адрес. С включением данного параметра будет использоваться последний IP адрес из списка. Возможные значения On или Off.
Не полный список переменных, которые добавляет модуль в переменные окружения и в таблицу уведомлений Apache:
- GEOIP_ADDR — IP адрес, который использовался для поиска в базе данных.
- GEOIP_CONTINENT_CODE — 2-х буквенный код континента, к которой принадлежит IP адрес (пример, EU для Европы).
- GEOIP_COUNTRY_CODE — 2-х буквенных код страны (например, RU для России)
- GEOIP_COUNTRY_NAME — полное название страны (например, Russian Federation для России)
Пример конфигурации модуля:
<ifmodule geoip_module> GeoIPEnable Off GeoIPDBFIle /usr/local/share/GeoIP/GeoIP.dat Standard GeoIPEnableUTF8 Off GeoIPOutput Env GeoIPScanProxyHeaders On GeoIPUseLastXForwardedForIP On </ifmodule>
Модуль достаточно сконфигурировать глобально, а потом подключать его в нужных виртуальных хостах, например, таким образом:
<virtualhost *:80> <ifmodule geoip_module> GeoIPEnable On <filesmatch ".(gif|jpe?g|png|ico|bmp|css|xml|pdf|rar|jar|js|doc|docx|html|xhtml)$"> GeoIPEnable Off </filesmatch> </ifmodule> </virtualhost>
При желании там же можно изменить и другие параметры. Как говорилось ранее с помощью информации от модуля можно ограничивать доступ по странам, например для какого-нибудь виртуального хоста можно сделать:
<ifmodule geoip_module> GeoIPEnable On </ifmodule><ifmodule setenvif_module> SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry </ifmodule> <directory /path/to/www> Deny from all Allow from env=AllowCountry </directory>
Таким образом, доступ к сайту будет только у жителей РФ. На официальном сайте можно скачать дополнительные базы (например, чтобы, отображался еще и город).