Включаем поддержку геоданных в Apache или mod_geoip из исходников

В ходе работы с WHM сервером столкнулся со следующей проблемой при установке mod_geoip:

mod_geoip-1.2.7-1.el5.x86_64 from epel has depsolving problems
  --> Missing Dependency: httpd-mmn = 20051115 is needed by package mod_geoip-1.2.7-1.el5.x86_64 (epel)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.

Всязанно это с тем, что в WHM апач - кастомизирован и лежит в папке /usr/local/apache/. Соответственно yum его не видит и говорит, что без httpd - никак. Соответсвенно та же проблема будет, если у Вас Apache собран из исходников.

Веселого мало, но и грустить не стоит.

Ставим GeoIP:

yum install geoip-devel geoip-data geoip

Скачиваем исходник mod_geoip:

wget -O 1.2.9.tar.gz https://github.com/maxmind/geoip-api-mod_geoip2/archive/1.2.9.tar.gz  
gunzip 1.2.9.tar.gz  
cd geoip-api-mod_geoip2-1.2.9/

Собирается он с помощью apxs:

/usr/local/apache/bin/apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c

В ходе компияции модуль будет установлен в нужный каталог и в конфиг Apache будет внесена следующая строка:

LoadModule geoip_module modules/mod_geoip.so

В случае с WHM конфиг файл apache (/usr/local/apache/conf/httpd.conf) динамичен, тоесть может быть сгенерирован из заготовок за ново в завимисти от обстоятельств. Именно поэтому его править не стоит, потомучто настройки потеряются, сайты лягут, клиент будет орать в телефон. В WHM редактируем файл:

nano /usr/local/apache/conf/includes/post_virtualhost_global.conf

Вкидываем в него:

LoadModule geoip_module       modules/mod_geoip.so

<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

Делаем:

/usr/local/apache/bin/apachectl -t

Ну и рестартуем апач что бы включить модуль.

Для проверки в корне сайта создаем файл geoiptest.php со следующим содержанием:

<?php
  print_r($_SERVER);
?>

Открываем в браузере файл и видим GEOIP_ADDR, и GEOIP_CONTINENT_CODE, и GEOIP_COUNTRY_NAME, и все остальное.
Для того, что бы информация о городах и странах обновлялась автоматически, создайте файл /etc/cron.monthly/geoip со следующим содержанием:

#!/bin/bash  
mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat.`$(ls /usr/share/GeoIP/GeoIP.dat* |wc -l)`  
wget -q -O /usr/share/GeoIP/GeoIP.dat.gz http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz  
gunzip /usr/share/GeoIP/GeoIP.dat.gz

Осталось сделать файл исполняемым, после чего даные GeoIP будут обновляться каждый месяц:

chmod +x /etc/cron.monthly/geoip

Пример ограничения доступа к сайту для северной америки:

RewriteEngine on
RewriteCond %{ENV:GEOIP_CONTINENT_CODE} ^NA$
RewriteRule ^(.*)$ - [F]