Notez que cet article a été écrit pour la première fois il y a plus de 2 ans, mais n'est pas nécessairement obsolète.
MaxMind fournit des renseignements sur la localisation des adresses IP, sous la marque commerciale GeoIP. Grâce aux données GeoIP, les entreprises peuvent en apprendre davantage sur la rapidité des connexions de leurs clients, sur leurs fournisseurs d’accès Internet (ou FAI) et plus. Le service n’est pas lié au système de géolocalisation.

Par défaut, le module GeoIP n’est pas installé avec le serveur PHP NGINX. Pour vérifier si le module est présent, on entre:
1 2 3 4 5 6 7 |
xavier@server:~$ nginx -V nginx version: nginx/1.10.2 built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) built with OpenSSL 1.0.2g-fips 1 Mar 2016 (running with OpenSSL 1.0.2g 1 Mar 2016) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr /lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/err or.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-pa th=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http- proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fa stcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var /cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with- ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-h ttp_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_sec ure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_ module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module - -with-stream --with-stream_ssl_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wf ormat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-fun ctions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed' |
Et l’on vérifie dans la liste des arguments configurés, la présence de --with-http_geoip_module .
Si ce n’est pas le cas, deux solutions sont possibles:
- Soit on installe GeoIP à l’aide de Composer (meilleure pratique),
- Soit on compile le module Nginx GEOIP.
De plus, sur Ubuntu, il y a le paquet geoip-database qui peut être installé avec apt, mais il n’est pas à jour, il contient seulement la base GEOIP.dat (pays), il manque la base des villes GeoLiteCity.dat.
Installation de GeoIP à l’aide de Composer:
Si Composer n’est pas installé, suivre le tutoriel d’installation de Composer. C’est aujourd’hui la meilleure pratique pour inclure une librairie dans un projet.
1 |
xavier@server:~/www/monSite$ composer require geoip/geoip:~1.17 |
On télécharge les binaires (bases de données):
1 2 3 4 5 6 |
xavier@server:~/temp$ wget -N http://geolite.maxmind.com/download/geoip/data/GeoLiteCountry/GeoIP.dat.gz xavier@server:~/temp$ wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz xavier@server:~/temp$ sudo mkdir /usr/local/share/GeoIP xavier@server:~/temp$ sudo mv GeoIP.dat /usr/local/share/GeoIP/ xavier@server:~/temp$ sudo mv GeoLiteCity.dat /usr/local/share/GeoIP/ xavier@server:~/temp$ ln -s /usr/local/share/GeoIP/GeoIPLiteCity.dat /usr/local/share/GeoIPCity.dat |
On utilise ensuite GeoIP dans son fichier PHP:
1 2 3 4 5 6 7 8 9 10 |
<?php require 'vendor/autoload.php'; $gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD); echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" . geoip_country_name_by_addr($gi, "24.24.24.24") . "\n"; echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" . geoip_country_name_by_addr($gi, "80.24.24.24") . "\n"; geoip_close($gi); |
Compilation du module Nginx GeoIP:
Les données de GeoIP seront accessibles dans le tableau $_SERVER ( ex: $_SERVER[ ‘GEOIP_CITY’ ] )
1 2 3 4 5 6 |
xavier@server:~$ sudo su [sudo] password for xavierbs: root@server:/home/xavier# mkdir /opt root@server:/home/xavier# cd /opt root@server:/opt# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz root@server:/opt# tar -zxvf GeoIP.tar.gz |
Pour ajouter un module externe à Nginx, Nginx doit être compilé, c’est-à-dire être installé à partir des sources. Le désavantage d’installer Nginx à partir des sources est qu’il ne donne pas la possibilité d’utiliser les fonctions system start/stop et les fichiers log. Afin d’obtenir les mêmes possibilités que s’il avait été installé à partir d’un package, il faut suivre les étapes suivantes:
- Ajouter le dépot Nginx PPA:
12xavier@server:/opt$ sudo add-apt-repository -y ppa:nginx/stablexavier@server:/opt$ sudo apt-get update - On édite le fichier de source de PPA:
1xavier@server:/opt$ sudo nano /etc/apt/sources.list.d/nginx-stable-trusty.list
Et l’on ajoute les lignes suivantes:
12deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty maindeb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main
Et on lance un update de apt-get:
1xavier@server:/opt$ sudo apt-get update - On peut maintenant obtenir le paquet source Nginx, le configurer, le compiler et l’installer:
12345678910# Installation des outils de création de paquetsxavier@server:/opt$ sudo apt-get install -y dpkg-devxavier@server:/opt$ sudo mkdir /temp/rebuildnginxxavier@server:/opt$ cd /temp/rebuildnginx# Obtenir les sources Nginx (ppa:nginx/stable)xavier@server:/opt/rebuidnginx$ sudo apt-get source nginx# Installer les dépendancesxavier@server:/opt/rebuidnginx$ sudo apt-get build-dep nginx - Pour installer un nouveau module, on ouvre le fichier /opt/rebuildnginx/nginx-1.10.1/debian/rules et l’on ajoute le module dans full_configure_flags:
123456789101112131415161718full_configure_flags := \$(common_configure_flags) \--with-http_addition_module \--with-http_dav_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_image_filter_module \--with-http_spdy_module \--with-http_sub_module \--with-http_xslt_module \--with-mail \--with-mail_ssl_module \--add-module=$(MODULESDIR)/nginx-auth-pam \--add-module=$(MODULESDIR)/nginx-dav-ext-module \--add-module=$(MODULESDIR)/nginx-echo \--add-module=$(MODULESDIR)/nginx-upstream-fair \--add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \--with-http_geoip_module - On sauve et on construit le paquet:
12xavier@server:/opt/rebuidnginx$ cd /opt/rebuildnginx/nginx-1.10.2/xavier@server:/opt/rebuidnginx$ sudo dpkg-buildpackage -uc -b - Installer Nginx:
À partir de maintenant, on trouve un tas de fichier .deb dans le répertoire /opt/rebuildnginx/:
123456789xavier@server:/opt/rebuidnginx$ lsnginx-1.10.2 nginx-doc_1.10.2-1+trusty0_all.debnginx_1.10.2-1+trusty0_all.deb nginx-extras_1.10.2-1+trusty0_amd64.debnginx_1.10.2-1+trusty0_amd64.changes nginx-extras-dbg_1.10.2-1+trusty0_amd64.debnginx_1.10.2-1+trusty0.debian.tar.gz nginx-full_1.10.2-1+trusty0_amd64.debnginx_1.10.2-1+trusty0.dsc nginx-full-dbg_1.10.2-1+trusty0_amd64.debnginx_1.10.2.orig.tar.gz nginx-light_1.10.2-1+trusty0_amd64.debnginx-common_1.10.2-1+trusty0_all.deb nginx-light-dbg_1.10.2-1+trusty0_amd64.deb
1xavier@server:/opt/rebuidnginx$ sudo dpkg -i nginx-full_1.8.1-1+trusty0_amd64.deb
Pour que le tableau $_SERVER contiennent les variables GeoIP, on les ajoute aux paramètres fastcgi.
1 |
xavier@server:/opt/rebuidnginx$ sudo vi /etc/nginx/fastcgi_params |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[...] ### SET GEOIP Variables ### fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code; fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3; fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name; fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code; fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3; fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name; fastcgi_param GEOIP_REGION $geoip_region; fastcgi_param GEOIP_CITY $geoip_city; fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code; fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code; fastcgi_param GEOIP_LATITUDE $geoip_latitude; fastcgi_param GEOIP_LONGITUDE $geoip_longitude; |
On relance Nginx et php7.0-fpm: systemctl restart nginx et systemctl restart php7.0-fpm .
Et hop, on intègre Geoip à Nginx. On peut faire de même pour intégrer n’importe quel module. On le télécharge, et l’on recompile Nginx en ajoutant –add-module={$chemin}.