Включаем поддержку геоданных в 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]