Настройка GeoIP на Drupal 7 и Drupal 10, 11

Andy Wits Blog

Настройка GeoIP на Drupal 7 и Drupal 10, 11

Идём на оффициальный сайт Maxmind и создаём аккаунт. Интересно, что я не смог создать аккаунт через VPN. Сервис распознает ip-адреса хостеров и не даёт создать аккаунт. Уже созданный аккаунт работает через VPN. Поэтому, чтобы создать аккаунт, пришлось воспользоваться реальным ip адресом какого-либо компьютера (либо своего, либо с помощью vpngate+softether).

Настройка GeoIP на Drupal 7

Ставим модуль geoip https://www.drupal.org/project/geoip
Также пришлось поставить патч на ядро D7. Патч взял отсюда: https://www.drupal.org/files/issues/2019-05-08/3026443-d7-72.patch

Теперь можно пользоваться API GeoIP. Мне понадобилась только функция geoip_country_code(geoip_ip_address()), которая выдаёт 2х-буквенный код страны.

Например, можно делать проверку условия:

if (geoip_country_code(geoip_ip_address()) == "XX") {
     // do something   
}

Настройка GeoIP на Drupal 10 / Drupal 11

Ставим модуль GeoIP на Drupal 10 || 11:

composer require 'drupal/geoip:^3.0'
./vendor/bin/drush pm-install geoip

Хотя этот модуль от этого же разработчика, он значительно отличается. Отличается и API модуля.

Чтобы им воспользоваться, нужно добавить функцию в кастомный плагин (или же Drupal::service) примерно такого вида:

function is_client_ip_country_code_XX() {
$ip_address = \Drupal::request()->getClientIp();
$user_country_code = \Drupal::service('geoip.geolocation')->geolocate($ip_address);
  if (isset($user_country_code)) {
    if ($user_country_code == "XX") {
      return TRUE;
    } elseif ($user_country_code <> "XX") {
      return FALSE;
    }
  }
}

И потом уже в файлах темы добавлять (внутри функции YOURTHEME_preprocess_YOURBLOCK):

    // // GeoIP API
    if (is_client_ip_country_code_XX()) {
      // do something
    }
    // prevent cache this block
    // this code also need Internal Page Cache module disabled
    // works with Dynamic Page Cache module enabled
    $variables['#cache']['max-age'] = 0;

! Важно учесть, что нужно отключить Internal Page Cache, а Dynamic Page Cache можно включить. Тогда мы можем max-age ставить в "0" и блок будет динамическим. Иначе, Друпал по умолчанию делает кэш страницы первого анонимного пользователя и для всех последующих отображает то же самое. По сути GeoIP API становится бесполезным из-за такого кэширования.

Скрипт для обновление GeoIP баз по расписанию

Документация говорит, что должна быть возможность HTTPS подключения с нашего сервера. Можно это сделать так:

curl -I https://mm-prod-geoip-databases.a2649acb697e2c09b632799562c076f2.r2.cloudflarestorage.com

Получим какой-то ответ (скорее всего 400, но это неважно).

Скачаем утилиту geoipupdate с гитхаба https://github.com/maxmind/geoipupdate/releases (последний пакет для дебиан) и установим в систему.

wget https://github.com/maxmind/geoipupdate/releases/download/v6.1.0/geoipupdate_6.1.0_linux_amd64.deb

Потом установим (пакет не просит никаких зависимостей):

dpkg -i geoipupdate_6.1.0_linux_amd64.deb

Чтобы настроить /etc/GeoIP.conf заходим в личный кабинет https://www.maxmind.com/en/account и через меню "my accounts" - "manage license key" создаём новый licence key и затем ID аккаунта и license key прописываем в конфиг. Также выбираем "EditionIDs" (в моём случае - GeoLite2-Country).

Другие опции не будем менять, но будем учитывать. Например, то, что по-умолчанию база скачивается в папку /usr/share/GeoIP.

Проверим, что в этой папке лежит:

ls -lh /usr/share/GeoIP
total 7.8M
-rw-r--r-- 1 root root 1.6M Nov  8  2018 GeoIP.dat
-rw-r--r-- 1 root root 6.2M Nov  8  2018 GeoIPv6.dat

Какие-то старые базы в старом формате...

Попробуем обновить, просто выполнив в консоли команду

geoipupdate

Проверим снова:

ls -lh /usr/share/GeoIP
total 14M
-rw-r--r-- 1 root root 1.6M Nov  8  2018 GeoIP.dat
-rw-r--r-- 1 root root 6.2M Nov  8  2018 GeoIPv6.dat
-rw-r--r-- 1 root root 6.1M Feb 20 13:15 GeoLite2-Country.mmdb

Осталось набросать небольшой скрипт на bash, который будет по крону выполнять эту команду и копировать в нужные папки сайта или сайтов.

Проверим, где лежит исполняемый файл:

~# whereis geoipupdate
geoipupdate: /usr/bin/geoipupdate /usr/share/man/man1/geoipupdate.1

Теперь сделаем скрипт, который загружает базы с сервиса Maxmind и копирует их в папки, где располагается Drupal:

#!/bin/bash

/usr/bin/geoipupdate

$geoipdb="GeoLite2-Country.mmdb"

D7="/home/user/example.com/www/sites/all/libraries/geoip"
cp /usr/share/GeoIP/$geoipdb $D7/$geoipdb
chown user:www-data $D7/$geoipdb
chmod 644 $D7/$geoipdb

D10="/home/user/example2.com/www/web/sites/default/files"
cp /usr/share/GeoIP/$geoipdb $D10/$geoipdb
chown user:www-data $D10/$geoipdb
chmod 644 $D10/$geoipdb
Published on Feb 20 2024 at 11:00 am
Time to read 2 minute(s)
Categories
  • Web Development

Contact me on