GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come utilizzare GeoIP con Nginx su Ubuntu 16.04

Questo tutorial spiega come utilizzare il modulo GeoIP con nginx su Ubuntu 16.04 per scoprire da dove provengono i tuoi visitatori. Il modulo GeoIP imposta più variabili come $geoip_country_name, $geoip_country_code, $geoip_city, ecc. che puoi utilizzare nei tuoi script PHP o direttamente nella tua configurazione nginx, ad esempio per servire contenuti in diverse lingue in base al paese dell'utente.

1 Nota preliminare

Sto utilizzando il sito Web www.example.com qui con la radice del documento /var/www/www.example.com/web/ e il file di configurazione di Nginx vhost /etc/nginx/sites-enabled/www.example.com. vhost. Userò questo tutorial per la configurazione di base di Ubuntu-Nginx. https://www.howtoforge.com/tutorial/installing-nginx-with-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp/

Questo tutorial è compatibile anche con le configurazioni nginx di ISPConfig.

Una nota per gli utenti di Ubuntu:

Poiché dobbiamo eseguire tutti i passaggi di questo tutorial con i privilegi di root, possiamo anteporre tutti i comandi in questo tutorial con la stringa sudo, oppure diventare root in questo momento digitando

sudo -s

2 Scopri se Nginx supporta GeoIP

Prima di iniziare dobbiamo scoprire se il modulo GeoIP è integrato nel nostro server 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 Scarica i database GeoIP

Su Debian e Ubuntu c'è il pacchetto geoip-database che può essere installato tramite apt, ma è un po' datato e contiene solo GeoIP.dat (database paese), non GeoLiteCity.dat (database città). Pertanto non installiamo quel pacchetto, ma scarichiamo nuove copie dal sito Web GeoIP nella directory /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 Configura Nginx

Ora configuriamo nginx. Apri /etc/nginx/nginx.conf...

nano /etc/nginx/nginx.conf

... e aggiungi le direttive geoip_country e geoip_city al contenitore 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 direttiva geoip_country rende disponibili le seguenti variabili:

  • $geoip_country_code - codice paese di due lettere, ad esempio RU, USA.
  • $geoip_country_code3 - codice paese di tre lettere, ad esempio RUS, USA.
  • $geoip_country_name - il nome (verboso) del paese, ad esempio Federazione Russa, Stati Uniti, ecc.

La direttiva geoip_city fornisce le seguenti variabili:

  • $geoip_city_country_code - codice paese di due lettere, ad esempio RU, USA.
  • $geoip_city_country_code3 - codice paese di tre lettere, ad esempio RUS, USA.
  • $geoip_city_country_name - il nome del paese, ad esempio Federazione Russa, Stati Uniti - se disponibile.
  • $geoip_region - il nome della regione (provincia, regione, stato, provincia, territorio federale e simili), ad esempio Moscow City, DC - se disponibile.
  • $geoip_city - il nome della città, ad esempio Mosca, Washington, Lisbona, ecc. - se disponibile.
  • $geoip_postal_code - codice postale o codice postale - se disponibile.
  • $geoip_city_continent_code - se disponibile.
  • $geoip_latitude - latitude - se disponibile.
  • $geoip_longitude - longitude - se disponibile.

Per rendere queste variabili disponibili anche per i tuoi script PHP, dobbiamo impostare alcune direttive fastcgi_param. È meglio farlo nel file /etc/nginx/fastcgi_params dove sono le altre direttive 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;

(Assicurati di avere la riga include /etc/nginx/fastcgi_params; nella tua posizione ~ \.php$ {} container nella tua configurazione vhost, perché altrimenti, la configurazione sopra è inutile per il tuo vhost.)

Se usi nginx come proxy inverso e vuoi passare le variabili GeoIP al backend, dovresti creare/modificare il file /etc/nginx/proxy.conf...

nano /etc/nginx/proxy.conf

... e aggiungi le seguenti righe:

[...]
### 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;

(Assicurati di utilizzare la riga include /etc/nginx/proxy.conf; nella configurazione del proxy nginx perché altrimenti il ​​backend non può utilizzare le variabili GeoIP.)

Ora ricarica nginx...

systemctl reload nginx.service

... affinché le modifiche abbiano effetto.

Riavvia PHP-FPM come segue:

systemctl restart php7.0-fpm.service

5 Un breve test

Per vedere se il modulo GeoIP funziona correttamente, possiamo creare un piccolo file PHP nel nostro spazio web www.example.com (es. /var/www/www.example.com/web):

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

Possiamo accedere alle variabili GeoIP come segue:

$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);

O così:

$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>

Chiama quel file in un browser (http://www.example.com/geoiptest.php) e dovresti vedere GeoIP al lavoro (assicurati di chiamare il file da un indirizzo IP pubblico, non locale) :

È anche possibile utilizzare le variabili GeoIP direttamente nella configurazione di nginx, ad es. come segue:

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

In questo esempio, se un visitatore proviene dalla Germania (codice paese:DE) ed esiste il file index_DE.html, questo file viene servito, altrimenti viene servito il file index.html predefinito.

Può essere utilizzato per offrire contenuti in diverse lingue, in base all'origine dell'utente.

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


Ubuntu
  1. Come installare WordPress con Nginx su Ubuntu 18.04

  2. Come installare phpMyAdmin con Nginx su Ubuntu 18.04

  3. Come installare MediaWiki con Nginx su Ubuntu 16.04

  4. Come installare Grav CMS con Nginx su Ubuntu 16.04

  5. Come proteggere Nginx con Letsencrypt su Ubuntu 20.04

Come installare Nginx con ModSecurity su Ubuntu 15.04

Come installare TYPO3 7 su Nginx (LEMP) su Ubuntu 15.10

Come installare TYPO3 8.1 con Nginx (LEMP) su Ubuntu 16.04

Come installare WordPress 5.x con Nginx su Ubuntu 18.04 / Ubuntu 16.04

Come installare WordPress con Nginx su Ubuntu

Come installare Nextcloud 13 su Ubuntu 16.04 con Nginx