Установка GeoIP и Mod_GeoIP для Apache CentOS/RedHat/Fedora
GeoIP — это продукт Maxmind который состоит из нескольких сопутствующих товаров. GeoIP преподносит информацию о конкретном IP-адрес. ГеоИП выполняет поиск по своим базам данных по данному хосту или IP-адресу и возвращает информацию о стране, где находиться IP, город, провайдер и другую информацию.
В своей статье «Установка GeoIP и Mod_GeoIP для Apache CentOS/RedHat/Fedora» хочу рассказать как установить GeoIP для Apache CentOS/RedHat/Fedora на примере CentOS 6.6.
Способ 1 — установка из пакетов.
Для начала обновим ОС:
# yum update
Переходим в папку и выкачиваем все необходимое. Скачиваем GeoIP и GeoIpCity:
# mkdir /usr/share/GeoIP && cd /usr/share/GeoIP && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
Распаковываем скачанные архивы:
# gunzip GeoIP.dat.gz && gunzip GeoLiteCity.dat.gz
— Устанавливаем PHP с поддержкой геоИП:
# yum install php-devel php-pear php-devel GeoIP GeoIP-devel GeoIP-data zlib-devel mod_geoip -y
— Можно еще одним способом установить, используя pecl.
Устанавливаем дополнительные пакеты для работы:
# yum install php-pear pecl -y
Обновляем содержимое репозитория:
# pecl channel-update pecl.php.net
Устанавливаем сам geoIP:
# pecl install geoip
Прописываем ( добавляем) библиотеку в php.ini:
echo "extension=geoip.so" > /etc/php.d/geoip.ini
И перезапускаем апач:
# service httpd restart
Способ 2 — установка из исходного кода.
Вы должны знать, как установить модули Apache и пересобрать Apache с помощью APXS.
Переходим в директорию и скачиваем файлы:
# cd /usr/local/src/ && wget http://www.maxmind.com/download/geoip/api/c/GeoIP-latest.tar.gz && tar -xzf GeoIP-latest.tar.gz && cd /usr/local/src/GeoIP-*
Устанавливаем утилитку ( можно и без нее):
# yum install libtool
И запускаем ее:
# libtoolize -f
Конфигурим:
# ./configure
Можно собрать rpm пакет, вы можете ознакомиться:
Создание RPM или DEB пакетов с Checkinstall в Linux
Но я покажу как произвести установку дальше:
# make && make check && make install
Скачиваем модуль для апача — mod_geoip, распаковываем его и переходим в папку для конфигурирования:
# cd /usr/local/src/ && wget http://www.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2-latest.tar.gz && tar -xzf mod_geoip2-*.tar.gz && cd /usr/local/src/mod_geoip2_*
Выполняем команду для установки данного модуля:
# apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c
Получил ошибку:
-bash: apxs: command not found
Исправление следующее:
# yum install httpd-devel
Теперь стоит выполнить:
# chmod 755 /usr/lib64/httpd/modules/mod_geoip.so
Вывело напоминание, что необходимо прописать ( активировать) geoip в конфигурационом файле httpd.conf. Для этого, выполняем следующие действия:
# vim /etc/httpd/conf/httpd.conf
И прописываем следующие строки:
[...] <IfModule mod_geoip.c> GeoIPEnable On GeoIPScanProxyHeaders On GeoIPDBFile /usr/local/share/geoip/GeoIP.dat GeoIPDBFile /usr/local/share/geoip/GeoLiteCity.dat </IfModule> [...]
Последние штрихи, нужно скачать и положить в папку базы:
# cd /usr/local/share && mkdir geoip && cd geoip && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz && gunzip GeoIP.dat.gz
и
# cd /usr/local/share/geoip && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz && gunzip GeoLiteCity.dat.gz
Перезапускаем апач:
# service httpd restart
И переходим к тестированию.
Проверка работы GeoIP для Apache CentOS/RedHat/Fedora.
1. Можно создать файл:
# echo "<?php phpinfo (); ?>" > /home/captain/php_info.php
/home/captain — это путь, который прописан в виртуальном хосте для моего сайта.
2. Можно выполнить команду:
# php -m | grep geo
3. Создаем пхп скрипт:
# vim /home/captain/geoip_test.php
Вставляем:
<pre> Whence are you come to here?: <?php $country_code = apache_note("GEOIP_COUNTRY_CODE"); $region = apache_note("GEOIP_REGION"); $country_name = apache_note("GEOIP_COUNTRY_NAME"); $city = apache_note("GEOIP_CITY"); echo "Country code: " . $country_code . "\n"; echo "Region: " . $region . "\n"; echo "Name of country: " . $country_name . "\n"; echo "City: " . $city . "\n"; ?> </pre>
Обновление баз для GeoIP
Создаем скрипт для обновления ( так будет проще всего):
# vim /home/captain/update_geoip_db.sh
Вставляем:
#!/bin/bash cd /usr/local/share/geoip/ mv GeoIP.dat GeoIP.dat.old && mv GeoLiteCity.dat GeoLiteCity.dat.old /usr/bin/wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz /usr/bin/wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz gunzip GeoIP.dat.gz && gunzip GeoLiteCity.dat.gz
Делаем его исполняемым:
# chmod 750 /home/captain/update_geoip_db.sh
Добавляем данный скрипт в crontab на выполнение, каждые 1-е число месяца:
# crontab -e 0 0 1 * * /home/captain/update_geoip_db.sh
Блокировка стран
Создаем файл ( если его нет) .htaccess. И для примера, например, я хочу заблокировать всех пользователей с Белорусии и Румынии, то прописываем данные строки в файл:
GeoIPEnable On GeoIPDBFile /usr/share/geoip/GeoIP.dat SetEnvIf GEOIP_COUNTRY_CODE RO BlockCountry SetEnvIf GEOIP_COUNTRY_CODE RL BlockCountry Deny from env=BlockCountry
PS: можно так же вставлять в конфиг с apache. В раздел <IfModule mod_geoip.c>
Перенаправление пользователей по странам
Ниже пример кода будет перенаправлять пользователей на основе кода страны. Если вы хотите перенаправить всех пользователей в зависимости от страны, то нужно использовать mod_rewrite в сочетании с mod_geoip в вашем файле .htaccess. Для примера, я сделаю перенаправление для Украины и Польши следующим образом:
RewriteEngine on GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(UA|PL)$ RewriteRule ^(.*)$ http://www.linux-notes.org/UA_PL/$1 [L]
Вот и все, моя тема «Установка GeoIP и Mod_GeoIP для Apache CentOS/RedHat/Fedora» завершена.