Le module GeoIp pour apache2 est un module permettant de connaitre une géolocalisation approximative des visiteurs. Il est basé sur les base de données de MaxMind. Certaines sont gratuites, d’autres payantes. Ici nous allons expliquer comment utiliser les bases de données gratuites.
Installation des paquets
Dans un premier temps, on installera les paquets nécessaires grâce à apt
:
- sudo apt-get install geoip-bin libapache2-mod-geoip libgeoip1
Activation du module
Pour activer dans la configuration d’Apache le nouveau module, il suffira de lancer cette commande :
- sudo a2enmod geoip
On pourra le désactiver tout aussi simplement avec la commande suivante :
- sudo a2dismod geoip
Il est ensuite nécessaire de redémarrer le serveur Apache pour le prendre en considération :
- /etc/init.d/apache2 restart
Le module est automatiquement configuré par le fichier /etc/apache2/mods-available/geoip.conf
dont le contenu est :
- <IfModule mod_geoip.c>
- GeoIPEnable On
- #GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
- </IfModule>
Ici la directive GeoIPDBFile
est commentée, s’il est actif le module utilisera la base de donnée standard qui se trouve à l’endroit /usr/share/GeoIP/GeoIP.dat
. Si vous souhaitez utilisez une autre base il suffit donc de décommenter et de modifier la directive GeoIPDBFile
(voir la suite pour les explications sur les bases de données).
Les bases de données
Les bases de données utilisées par le module sont par défaut dans le répertoire /usr/share/GeoIP/
.
Il y a plusieurs bases de données utilisables :
- GeoLite Country (dont le pendant payant est GeoIp Country comme son nom l’indique correspond aux pays. Mise à jour chaque mois.
- GeoLite City (dont le pendant payant est GeoIP City comme son nom l’indique correspond aux villes. Mise à jour chaque mois.
- GeoLite ASN Mise à jour irrégulière.
Mise à jour des bases de données
Afin de tenir ces bases de données à jour, il suffit de les récupérer sur le serveur de Maxmind, les décompresser et les copier dans le répertoire /usr/share/GeoIP
. Cette tâche est longue, fastidieuse et on doit y penser régulièrement pour tenir son système à jour.
La solution est d’utiliser un script updateGeoIP.sh
qui rend automatique ce travail à intervalle régulier (en Cron).
On va dans un premier temps créer un répertoire /opt/scripts
qui nous sert de répertoire de scripts personnels (vous pouvez les mettre où bon vous semble) :
- sudo mkdir -p /opt/scripts/
Voici une adaptation du script de Sid McLaurin trouvé au hasard du net.
On ouvre le fichier updateGeoIP.sh
:
- sudo nano /opt/scripts/updateGeoIP.sh
Et on y colle les lignes suivantes :
- #!/bin/bash
- #
- # GeoIP Databases Update
- # Version 1.1
- #
- # updateGeoIP.sh
- #
- # SID Solutions
- # Copyright (c) 01/13/2008
- # Programmed by Sid McLaurin
- #
- # Adpated for Apache & regular Debian folders by kent1
- #
- # Description:
- #
- # Script to update all GeoIP databases
- #
- # Location:
- #
- # /opt/scripts/
- #
- # Changes:
- # 01/02/2009 - Create an URL for the new location of the
- # GeoIP.dat
- # 20/07/2009 - Adaptation forApache & regular Debian
- # folders by kent1
- # Variables
- URL=http://www.maxmind.com/download/geoip/database/
- NUMURL=http://www.maxmind.com/download/geoip/database/asnum/
- COUNTRYURL=http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/
- GEODBS=( "GeoIP.dat.gz" "GeoLiteCity.dat.gz" "GeoIPASNum.dat.gz" )
- GEOPATH=/usr/share/GeoIP
- GEOUSER=www-data
- GEOGROUP=www-data
- echo -e "\n\033[1;32m\tStarting GeoIP Database Update\n \033[0m"
- # Change to GeoIP database directory
- cd $GEOPATH
- # Delete previous database
- echo -e "\033[1;33mRemoving previous databases\033[0m ...............\c"
- /bin/rm -f Geo*dat
- echo -e "\033[1;32m Done!\n \033[0m"
- # Get new databases
- echo -e "\033[1;31mDownloading databases\n\033[0m"
- for GEODB in ${GEODBS[@]}
- do
- echo -e "\tDownloading \033[1;33m"$GEODB"\033[0m ..........\c"
- if [ $GEODB = "GeoLiteCity.dat.gz" ]
- then
- /usr/bin/wget $URL$GEODB > /dev/null 2>&1
- elif [ $GEODB = "GeoIPASNum.dat.gz" ]
- then
- /usr/bin/wget $NUMURL$GEODB > /dev/null 2>&1
- else
- /usr/bin/wget $COUNTRYURL$GEODB > /dev/null 2>&1
- fi
- echo -e "\033[1;32m Done!\n \033[0m"
- done
- # Deflate new databases
- echo -e "\033[1;31mDeflating databases\n\033[0m"
- for GEODB in ${GEODBS[@]}
- do
- echo -e "\tDeflating \033[1;33m"$GEODB"\033[0m ............\c"
- /bin/gunzip $GEODB
- echo -e "\033[1;32m Done!\n \033[0m"
- done
- # Set permissions
- if [ "$GEOUSER" != "" ] || [ "$GEOGROUP" != "" ];
- then
- echo -e "\033[1;31mSetting permissions\n\033[0m"
- fi
- # Set user permissions
- if [ "$GEOUSER" != "" ]
- then
- echo -e "\033[1;33m\tSetting user permissions to "$GEOUSER"\033[0m .........\c"
- /bin/chown -R $GEOUSER $GEOPATH
- echo -e "\033[1;32m Done!\n \033[0m"
- fi
- # Set group permissions
- if [ "$GEOGROUP" != "" ]
- then
- echo -e "\033[1;33m\tSetting group permissions to "$GEOGROUP"\033[0m ........\c"
- /bin/chgrp -R $GEOGROUP $GEOPATH
- echo -e "\033[1;32m Done!\n \033[0m"
- fi
- # Done!
- echo -e "\033[1;32m\tGeoIP Database update completed!\n \033[0m"
Son utilisation est simple, après avoir récupéré le script, placez le dans le répertoires que vous souhaitez (Pour retrouver facilement vos scripts personnels, placez les dans un répertoire facile à retrouver /opt/scripts/
par exemple).
Donnez lui les droits d’exécution de la sorte :
- sudo chmod +x /opt/scripts/updateGeoIP.sh
Pour le tester il vous suffit de lancer la commande (en vous plaçant dans le répertoire où est situé le script) :
- bash /opt/scripts/updateGeoIP.sh
Les nouvelles bases de données devraient être téléchargées et mises en place. Pour le vérifier faites :
- ls -lsa /usr/share/GeoIP
Les dates de fichiers doivent correspondre à la date de la dernière modification de la base de données (soit le mois en cours au moins pour GeoLite City et GeoLite Country).
Pour automatiser cette mise à jour, il faut créer la tache cron adéquate en faisant :
- sudo crontab -e
Cette commande doit ouvrir le fichier des taches cron avec votre éditeur par défaut, ajoutez y cette ligne :
- 0 5 15 * * /opt/scripts/updateGeoIP.sh > /dev/null 2>&1
Cette ligne signifie pour simplifier, on exécute le script /opt/scripts/updateGeoIP.sh qu’on ne logue pas (> /dev/null) n’importe quel jour de la semaine, tous les mois (première étoile) le 15 de chaque mois, à 5h00 (voir cet article pour plus de précision).
Ainsi vos base de donnée de géolocalisation resteront à jour chaque mois.
Modification de la configuration Apache
Après avoir récupéré les bases de données, on peut vouloir utiliser la base des villes afin d’avoir de meilleurs informations. Le plugin GeoIP de Piwik le nécessite par exemple sinon les visiteurs ont comme ville la valeur "Unknown".
Pour cela il suffit de modifier le fichier de configuration de GeoIP pour Apache :
- sudo nano /etc/apache2/mods-available/geoip.conf
Puis de remplacer son contenu par :
- <IfModule mod_geoip.c>
- GeoIPEnable On
- GeoIPDBFile /usr/share/GeoIP/GeoLiteCity.dat
- </IfModule>
Puis de recharger la configuration d’apache par :
- sudo /etc/init.d/apache2 force-reload
Cas d’utilisation de GeoIP
- GeoIP est principalement utilisé par les outils de statistiques par exemple :
- AWStats : analyseurs de fichiers de logs pour Apache / FTP / mail
- Piwik : outil d’analyse de fréquentation web par tracker javascript. En utilisant le plugin adéquat