GeoIP PECL für Nginx installieren und automatisch aktualisieren

Halli Leute,

heute mal ein kleiner Beitrag, wie ich GeoIP für Nginx aktivere. GeoIP bietet Datenbanken mit Standortdaten zu bestimmten IP-Adressen. Damit erhält man deutlich akkuratere Standortdaten für seine Websitebesucher.  Ich nutze unter anderem Piwik und wollte dort die IP-Erkennung mittels GeoIP PECL aktivieren. Ich nutze folgende Konfiguration:

  • Debian 6.0
  • Nginx 1.8.0
  • PHP5-FPM

GeoIP Datenbanken automatisiert herunterladen und aktualisieren

Ich nutze dazu ein kleines sh-script. Die dazugehörigen Datenbanken habe ich von hier: http://dev.maxmind.com/geoip/legacy/geolite/#Downloads Es sind bei weitem nicht alle frei verfügbar, aber man nimmt halt was man kann ;).

#!/bin/sh

# This script will automatically download the new databases of maxmind. It will send an mail in the beginning and in the end.

# Send mail for beginning
echo "GeoIP Aktualisierung wurde gestartet" | mail -s "GeoIP gestartet" deine@emailadresse.de

# Clean folder
rm GeoIP.dat.gz
rm GeoIPv6.dat.gz
rm GeoLiteCity.dat.gz
rm GeoLiteCityv6.dat.gz
rm GeoIPASNum.dat.gz
rm GeoIPASNumv6.dat.gz

# Download all data
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz
wget http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz
wget http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNumv6.dat.gz

# Untar the archives
rm GeoIP.dat
gunzip -v GeoIP.dat.gz
rm GeoIPv6.dat
gunzip -v GeoIPv6.dat.gz
rm GeoLiteCity.dat
gunzip -v GeoLiteCity.dat.gz
rm GeoLiteCityv6.dat
gunzip -v GeoLiteCityv6.dat.gz
rm GeoIPASNum.dat
gunzip -v GeoIPASNum.dat.gz
rm GeoIPASNumv6.dat
gunzip -v GeoIPASNumv6.dat.gz

# Rename GeoLiteCity.dat and GeoLiteCityv6.dat
mv GeoLiteCity.dat GeoIPCity.dat
mv GeoLiteCityv6.dat GeoIPCityv6.dat

# Send mail for end
echo "GeoIP Aktualisierung wurde erfolgreich beendet." | mail -s "GeoIP beendet" deine@emailadresse.de

Nun müssen wir das Script nur noch mittels eines chronjobs automatisch ausführen. Dazu kann man mit dem Befehl

crontab -e

die crontab bearbeiten und folgenen Eintrag hinzufügen:

40 15 18 * * /usr/share/GeoIP/./autoscript.sh

Nun haben wir eine aktuelle GeoIP Datenbank welche sich regelmäßig aktualisiert. Weiter gehts mit dem Einbinden in Nginx bzw. PHP.

Einbinden von GeoIP in PHP-FPM

Zunächst müssen wir noch ein paar Pakete installieren (Quelle: http://piwik.org/faq/how-to/faq_164/ ):

apt-get install php5-geoip php5-dev libgeoip-dev

Nun aktivieren wir noch Geoip mit folgendem Befehl:

pecl install geoip

Und zum Schluss muss geoip noch in der php.ini verewigt werden, damit dieses korrekt geladen wird. Achten darauf, dass ihr den richtigen Pfad für die GeoIP-Datenbanken setzt. In meinem Fall also /usr/share/GeoIP/

extension=geoip.so</span>
geoip.custom_directory=/usr/share/GeoIP/

So zum Schluss nur noch PHP-FPM neustarten:

/etc/init.d/php5-fpm restart

Jetzt sollte alles laufen. Testen wir mal ob alles geklappt hat.

Abschließender Test ob GeoIP vollständig und korrekt installiert ist

Ob alles korrekt installiert wurde, kann man ganz einfach mit folgendem PHP-Script testen:

<?php
$cst = array(
             'GEOIP_COUNTRY_EDITION' => GEOIP_COUNTRY_EDITION,
             'GEOIP_REGION_EDITION_REV0' => GEOIP_REGION_EDITION_REV0,
             'GEOIP_CITY_EDITION_REV0' => GEOIP_CITY_EDITION_REV0,
             'GEOIP_ORG_EDITION' => GEOIP_ORG_EDITION,
             'GEOIP_ISP_EDITION' => GEOIP_ISP_EDITION,
             'GEOIP_CITY_EDITION_REV1' => GEOIP_CITY_EDITION_REV1,
             'GEOIP_REGION_EDITION_REV1' => GEOIP_REGION_EDITION_REV1,
             'GEOIP_PROXY_EDITION' => GEOIP_PROXY_EDITION,
             'GEOIP_ASNUM_EDITION' => GEOIP_ASNUM_EDITION,
             'GEOIP_NETSPEED_EDITION' => GEOIP_NETSPEED_EDITION,
             'GEOIP_DOMAIN_EDITION' => GEOIP_DOMAIN_EDITION,
             );

foreach ($cst as $k=>$v) {
    echo $k.': '.geoip_db_filename($v).'  '.(geoip_db_avail($v) ? 'Available':''). "\n";
}
?>

mit

php geoip.php

sollte man dann eine Ähnliche Ausgabe erhalten:

GEOIP_COUNTRY_EDITION: /usr/share/GeoIP/GeoIP.dat  Available
GEOIP_REGION_EDITION_REV0: /usr/share/GeoIP/GeoIPRegion.dat
GEOIP_CITY_EDITION_REV0: /usr/share/GeoIP/GeoIPCity.dat  Available
GEOIP_ORG_EDITION: /usr/share/GeoIP/GeoIPOrg.dat
GEOIP_ISP_EDITION: /usr/share/GeoIP/GeoIPISP.dat
GEOIP_CITY_EDITION_REV1: /usr/share/GeoIP/GeoIPCity.dat  Available
GEOIP_REGION_EDITION_REV1: /usr/share/GeoIP/GeoIPRegion.dat
GEOIP_PROXY_EDITION: /usr/share/GeoIP/GeoIPProxy.dat
GEOIP_ASNUM_EDITION: /usr/share/GeoIP/GeoIPASNum.dat  Available
GEOIP_NETSPEED_EDITION: /usr/share/GeoIP/GeoIPNetSpeed.dat
GEOIP_DOMAIN_EDITION: /usr/share/GeoIP/GeoIPDomain.dat

Es gilt zu beachten, dass nicht alle Datenbanken verfügbar sind, da man für diese Zahlen muss. Alle frei verfügbaren Datenbanken wurden von mir eingebunden.

Hat alles geklappt, erhält man nun korrekte und genauere Standortdaten seiner Besucher. Wenn euch Fehler oder Anmerkungen auffallen / einfallen, immer her damit :). Ich freue mich darüber und werde Verbesserungen selbstverständlich in die Anleitung einbauen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.