GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment utiliser GeoIP avec Nginx sur Ubuntu 16.04

Ce tutoriel explique comment utiliser le module GeoIP avec nginx sur Ubuntu 16.04 pour savoir d'où viennent vos visiteurs. Le module GeoIP définit plusieurs variables telles que $geoip_country_name, $geoip_country_code, $geoip_city, etc. que vous pouvez utiliser dans vos scripts PHP ou directement dans votre configuration nginx, par exemple pour diffuser du contenu dans différentes langues en fonction du pays de l'utilisateur.

1 Remarque préliminaire

J'utilise le site Web www.example.com ici avec la racine du document /var/www/www.example.com/web/ et le fichier de configuration Nginx vhost /etc/nginx/sites-enabled/www.example.com. vhost. J'utiliserai ce tutoriel pour la configuration de base d'Ubuntu-Nginx. https://www.howtoforge.com/tutorial/installing-nginx-with-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp/

Ce tutoriel est également compatible avec les configurations ISPConfig nginx.

Remarque pour les utilisateurs d'Ubuntu :

Étant donné que nous devons exécuter toutes les étapes de ce didacticiel avec les privilèges root, nous pouvons soit ajouter la chaîne sudo à toutes les commandes de ce didacticiel, soit nous devenons root dès maintenant en tapant

sudo -s

2 Découvrez si Nginx prend en charge GeoIP

Avant de commencer, nous devons savoir si le module GeoIP est intégré à notre serveur nginx :

nginx -V
[email protected]:~# nginx -V
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g-fips 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads

3 Télécharger les bases de données GeoIP

Sur Debian et Ubuntu, il existe le paquet geoip-database qui peut être installé via apt, mais il est un peu obsolète et ne contient que GeoIP.dat (base de données de pays), pas GeoLiteCity.dat (base de données de villes). Par conséquent, nous n'installons pas ce package, mais téléchargeons de nouvelles copies du site Web GeoIP dans le répertoire /etc/nginx/geoip :

mkdir /etc/nginx/geoip
cd /etc/nginx/geoip
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz

4 Configurer Nginx

Maintenant, nous configurons nginx. Ouvrez /etc/nginx/nginx.conf...

nano /etc/nginx/nginx.conf

... et ajoutez les directives geoip_country et geoip_city au conteneur http {} :

[...]
http {

##
# Basic Settings
##

geoip_country /etc/nginx/geoip/GeoIP.dat; # the country IP database
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # the city IP database [...]

La directive geoip_country rend disponibles les variables suivantes :

  • $geoip_country_code :code de pays à deux lettres, par exemple, RU, US.
  • $geoip_country_code3 :code de pays à trois lettres, par exemple, RUS, USA.
  • $geoip_country_name - le nom (verbeux) du pays, par exemple, Fédération de Russie, États-Unis, etc.

La directive geoip_city fournit les variables suivantes :

  • $geoip_city_country_code :code de pays à deux lettres, par exemple, RU, US.
  • $geoip_city_country_code3 :code de pays à trois lettres, par exemple, RUS, USA.
  • $geoip_city_country_name - le nom du pays, par exemple, Fédération de Russie, États-Unis - si disponible.
  • $geoip_region - le nom de la région (province, région, état, province, territoire fédéral, etc.), par exemple, Moscow City, DC - si disponible.
  • $geoip_city - le nom de la ville, par exemple, Moscou, Washington, Lisbonne, etc. - si disponible.
  • $geoip_postal_code - code postal ou code postal - si disponible.
  • $geoip_city_continent_code - si disponible.
  • $geoip_latitude - latitude - si disponible.
  • $geoip_longitude - longitude - si disponible.

Afin de rendre ces variables également disponibles pour vos scripts PHP, nous devons définir quelques directives fastcgi_param. Il est préférable de le faire dans le fichier /etc/nginx/fastcgi_params où se trouvent les autres directives fastcgi_param :

nano /etc/nginx/fastcgi_params
[...]
### 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;

(Assurez-vous d'avoir la ligne include /etc/nginx/fastcgi_params; dans votre emplacement ~ conteneur \.php$ {} dans votre configuration vhost, car sinon, la configuration ci-dessus est inutile pour votre vhost.)

Si vous utilisez nginx comme proxy inverse et souhaitez transmettre les variables GeoIP au backend, vous devez créer/modifier le fichier /etc/nginx/proxy.conf...

nano /etc/nginx/proxy.conf

... et ajoutez-y les lignes suivantes :

[...]
### SET GEOIP Variables ###
proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code;
proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;

proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
proxy_set_header GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
proxy_set_header GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
proxy_set_header GEOIP_REGION $geoip_region;
proxy_set_header GEOIP_CITY $geoip_city;
proxy_set_header GEOIP_POSTAL_CODE $geoip_postal_code;
proxy_set_header GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
proxy_set_header GEOIP_LATITUDE $geoip_latitude;
proxy_set_header GEOIP_LONGITUDE $geoip_longitude;

(Assurez-vous d'utiliser la ligne include /etc/nginx/proxy.conf ; dans votre configuration de proxy nginx car sinon, le backend ne peut pas utiliser les variables GeoIP.)

Maintenant, rechargez nginx...

systemctl reload nginx.service

... pour que les modifications prennent effet.

Redémarrez PHP-FPM comme suit :

systemctl restart php7.0-fpm.service

5 Un petit test

Pour voir si le module GeoIP fonctionne correctement, nous pouvons créer un petit fichier PHP dans notre espace web www.example.com (par exemple /var/www/www.example.com/web) :

nano /var/www/www.example.com/web/geoiptest.php

Nous pouvons accéder aux variables GeoIP comme suit :

$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);

Ou comme ceci :

$geoip_country_code = $_SERVER['GEOIP_COUNTRY_CODE'];
<html>
<body>
<?php

$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);
/*
$geoip_country_code = $_SERVER['GEOIP_COUNTRY_CODE']; // works as well
*/
$geoip_country_code3 = getenv(GEOIP_COUNTRY_CODE3);
$geoip_country_name = getenv(GEOIP_COUNTRY_NAME);

$geoip_city_country_code = getenv(GEOIP_CITY_COUNTRY_CODE);
$geoip_city_country_code3 = getenv(GEOIP_CITY_COUNTRY_CODE3);
$geoip_city_country_name = getenv(GEOIP_CITY_COUNTRY_NAME);
$geoip_region = getenv(GEOIP_REGION);
$geoip_city = getenv(GEOIP_CITY);
$geoip_postal_code = getenv(GEOIP_POSTAL_CODE);
$geoip_city_continent_code = getenv(GEOIP_CITY_CONTINENT_CODE);
$geoip_latitude = getenv(GEOIP_LATITUDE);
$geoip_longitude = getenv(GEOIP_LONGITUDE);

echo 'country_code: '.$geoip_country_code.'<br>';
echo 'country_code3: '.$geoip_country_code3.'<br>';
echo 'country_name: '.$geoip_country_name.'<br>';

echo 'city_country_code: '.$geoip_city_country_code.'<br>';
echo 'city_country_code3: '.$geoip_city_country_code3.'<br>';
echo 'city_country_name: '.$geoip_city_country_name.'<br>';
echo 'region: '.$geoip_region.'<br>';
echo 'city: '.$geoip_city.'<br>';
echo 'postal_code: '.$geoip_postal_code.'<br>';
echo 'city_continent_code: '.$geoip_city_continent_code.'<br>';
echo 'latitude: '.$geoip_latitude.'<br>';
echo 'longitude: '.$geoip_longitude.'<br>';

?>
</body>
</html>

Appelez ce fichier dans un navigateur (http://www.example.com/geoiptest.php), et vous devriez voir GeoIP au travail (assurez-vous que vous appelez le fichier à partir d'une adresse IP publique, pas locale) :

Il est également possible d'utiliser des variables GeoIP directement dans la configuration nginx, par ex. comme suit :

nano /etc/nginx/sites-enabled/www.example.com.vhost
[...]
        location / {
            index index.html index.php;
            try_files /index_$geoip_country_code.html /index.html;
        }
[...]
systemctl reload nginx.service

Dans cet exemple, si un visiteur vient d'Allemagne (code pays :DE), et que le fichier index_DE.html existe, alors ce fichier est servi, sinon le fichier index.html par défaut est servi.

Cela peut être utilisé pour diffuser du contenu dans différentes langues, en fonction de l'origine de l'utilisateur.

  • nginx :http://nginx.org/
  • Wiki de nginx :http://wiki.nginx.org/
  • Ubuntu :http://www.ubuntu.com/


Ubuntu
  1. Comment installer WordPress avec Nginx sur Ubuntu 18.04

  2. Comment installer phpMyAdmin avec Nginx sur Ubuntu 18.04

  3. Comment installer MediaWiki avec Nginx sur Ubuntu 16.04

  4. Comment installer Grav CMS avec Nginx sur Ubuntu 16.04

  5. Comment sécuriser Nginx avec Letsencrypt sur Ubuntu 20.04

Comment installer Nginx avec ModSecurity sur Ubuntu 15.04

Comment installer TYPO3 7 sur Nginx (LEMP) sur Ubuntu 15.10

Comment installer TYPO3 8.1 avec Nginx (LEMP) sur Ubuntu 16.04

Comment installer WordPress 5.x avec Nginx sur Ubuntu 18.04 / Ubuntu 16.04

Comment installer WordPress avec Nginx sur Ubuntu

Comment installer Nextcloud 13 sur Ubuntu 16.04 avec Nginx