Home page > LAMP : Linux - Apache - Mysql - Php > Apache > Modules complémentaires > mod_geoip pour Apache 2

mod_geoip pour Apache 2

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:

  1. 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 :

  1. sudo a2enmod geoip

On pourra le désactiver tout aussi simplement avec la commande suivante :

  1. sudo a2dismod geoip

Il est ensuite nécessaire de redémarrer le serveur Apache pour le prendre en considération :

  1. /etc/init.d/apache2 restart

Le module est automatiquement configuré par le fichier /etc/apache2/mods-available/geoip.conf dont le contenu est :

  1. <IfModule mod_geoip.c>
  2.   GeoIPEnable On
  3.   #GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
  4. </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 :

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) :

  1. sudo mkdir -p /opt/scripts/

Voici une adaptation du script de Sid McLaurin trouvé ici.

On ouvre le fichier updateGeoIP.sh :

  1. sudo nano /opt/scripts/updateGeoIP.sh

Et on y colle les lignes suivantes :

  1. #!/bin/bash
  2. #
  3. # GeoIP Databases Update
  4. # Version 1.1
  5. #
  6. # updateGeoIP.sh
  7. #
  8. # SID Solutions
  9. # http://sidsolutions.net
  10. # Copyright (c) 01/13/2008
  11. # Programmed by Sid McLaurin
  12. #
  13. # Adpated for Apache & regular Debian folders by kent1
  14. #
  15. # Description:
  16. #
  17. # Script to update all GeoIP databases
  18. #
  19. # Location:
  20. #
  21. # /opt/scripts/
  22. #
  23. # Changes:
  24. # 01/02/2009 - Create an URL for the new location of the
  25. # GeoIP.dat
  26. # 20/07/2009 - Adaptation forApache & regular Debian
  27. # folders by kent1
  28.  
  29. # Variables
  30. URL=http://www.maxmind.com/download/geoip/database/
  31. NUMURL=http://www.maxmind.com/download/geoip/database/asnum/
  32. COUNTRYURL=http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/
  33. GEODBS=( "GeoIP.dat.gz" "GeoLiteCity.dat.gz" "GeoIPASNum.dat.gz" )
  34. GEOPATH=/usr/share/GeoIP
  35. GEOUSER=www-data
  36. GEOGROUP=www-data
  37.  
  38. echo -e "\n\033[1;32m\tStarting GeoIP Database Update\n  \033[0m"
  39.  
  40. # Change to GeoIP database directory
  41. cd $GEOPATH
  42.  
  43. # Delete previous database
  44. echo -e "\033[1;33mRemoving previous databases\033[0m ...............\c"
  45. /bin/rm -f Geo*dat
  46. echo -e  "\033[1;32m Done!\n \033[0m"
  47.  
  48. # Get new databases
  49. echo -e "\033[1;31mDownloading databases\n\033[0m"
  50.  
  51. for GEODB in ${GEODBS[@]}
  52. do
  53.  
  54.   echo -e "\tDownloading \033[1;33m"$GEODB"\033[0m ..........\c"
  55.   if [ $GEODB = "GeoLiteCity.dat.gz" ]
  56.     then
  57.        /usr/bin/wget $URL$GEODB > /dev/null 2>&1
  58.   elif [ $GEODB = "GeoIPASNum.dat.gz" ]
  59.     then
  60.       /usr/bin/wget $NUMURL$GEODB > /dev/null 2>&1
  61.   else
  62.       /usr/bin/wget $COUNTRYURL$GEODB > /dev/null 2>&1
  63.   fi
  64.   echo -e  "\033[1;32m Done!\n \033[0m"
  65.  
  66. done
  67.  
  68. # Deflate new databases
  69. echo -e "\033[1;31mDeflating databases\n\033[0m"
  70.  
  71. for GEODB in ${GEODBS[@]}
  72. do
  73.  
  74.   echo -e "\tDeflating \033[1;33m"$GEODB"\033[0m ............\c"
  75.   /bin/gunzip $GEODB
  76.   echo -e  "\033[1;32m Done!\n \033[0m"
  77.  
  78. done
  79.  
  80. # Set permissions
  81. if [ "$GEOUSER" != "" ] || [ "$GEOGROUP" != "" ];
  82. then
  83.   echo -e "\033[1;31mSetting permissions\n\033[0m"
  84. fi
  85. # Set user permissions
  86. if [ "$GEOUSER" != "" ]
  87. then
  88.   echo -e "\033[1;33m\tSetting user permissions to "$GEOUSER"\033[0m .........\c"
  89.   /bin/chown -R $GEOUSER $GEOPATH
  90.   echo -e  "\033[1;32m Done!\n \033[0m"
  91. fi
  92.  
  93. # Set group permissions
  94. if [ "$GEOGROUP" != "" ]
  95. then
  96.   echo -e "\033[1;33m\tSetting group permissions to "$GEOGROUP"\033[0m ........\c"
  97.   /bin/chgrp -R $GEOGROUP $GEOPATH
  98.   echo -e  "\033[1;32m Done!\n \033[0m"
  99. fi
  100.  
  101. # Done!
  102. 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 :

  1. 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) :

  1. 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 :

  1. ls -lsa /usr/share/GeoIP

Les dates de fichiers doivent correspondre à la date de la dernière modificationd e la base donnée (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 :

  1. sudo crontab -e

Cette commande doit ouvrir le fichier des taches cron avec votre éditeur par défaut, ajoutez y cette ligne :

  1. 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) tous les ans (dernière étoile), tous les mois (première étoile) le 15 de chaque mois, à 5h00.

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 :

  1. sudo nano /etc/apache2/mods-available/geoip.conf

Puis de remplacer son contenu par :

  1. <IfModule mod_geoip.c>
  2.   GeoIPEnable On
  3.   GeoIPDBFile /usr/share/GeoIP/GeoLiteCity.dat
  4. </IfModule>

Puis de recharger la configuration d’apache par :

  1. 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

Articles connexes

No comments



Any message or comment?
  • (To create paragraphs, you simply leave blank lines.)

Who are you? (optional)
  • [Sign In]