Wie man GeoIP mit Nginx unter Ubuntu 16.04 verwendet

Dieses Tutorial erklärt, wie Sie das GeoIP-Modul mit nginx auf Ubuntu 16.04 verwenden, um herauszufinden, woher Ihre Besucher kommen. Das GeoIP-Modul setzt mehrere Variablen wie $geoip_country_name, $geoip_country_code, $geoip_city, etc., die Sie in Ihren PHP-Skripten oder direkt in Ihrer nginx-Konfiguration verwenden können, z.B. um Inhalte in verschiedenen Sprachen je nach Land des Benutzers bereitzustellen.

1 Vorbemerkung

Ich benutze hier die Website www.example.com mit dem Dokumentenstamm /var/www/www.example.com/web/ und der Nginx vhost Konfigurationsdatei /etc/nginx/sites-enabled/www.example.com.vhost. Ich werde dieses Tutorial für das grundlegende Ubuntu-Nginx-Setup verwenden. https://www.howtoforge.com/tutorial/installing-nginx-with-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp/

Dieses Tutorial ist auch mit ISPConfig nginx-Setups kompatibel.

Ein Hinweis für Ubuntu-Benutzer:

Da wir alle Schritte dieses Tutorials mit root-Rechten ausführen müssen, können wir entweder alle Befehle in diesem Tutorial mit der Zeichenkette sudo voranstellen, oder wir werden jetzt root, indem wir Folgendes eingeben

sudo -s

2 Finden Sie heraus, ob Nginx Unterstützung für GeoIP hat

Bevor wir anfangen, müssen wir herausfinden, ob das GeoIP-Modul in unseren nginx-Server integriert ist:

nginx -V
root@server1:~# 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 Laden Sie die GeoIP-Datenbanken herunter

Unter Debian und Ubuntu gibt es das Paket geoip-database, das über apt installiert werden kann, aber es ist etwas veraltet und enthält nur GeoIP.dat (Länderdatenbank), nicht GeoLiteCity.dat (Stadtdatenbank). Daher installieren wir dieses Paket nicht, sondern laden neue Kopien von der GeoIP-Website in das Verzeichnis /etc/nginx/geoip herunter:

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 Nginx konfigurieren

Nun konfigurieren wir nginx. Öffnen Sie /etc/nginx/nginx/nginx.conf…..

nano /etc/nginx/nginx.conf

…. und fügen Sie die Direktiven geoip_country und geoip_city dem Container http {} hinzu:

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

Die geoip_country-Direktive stellt die folgenden Variablen zur Verfügung:

  • $geoip_country_code – zweistelliger Ländercode, z.B. RU, US.
  • $geoip_country_code3 – Ländercode mit drei Buchstaben, z.B. RUS, USA.
  • $geoip_country_name – der (ausführliche) Name des Landes, z.B. Russische Föderation, Vereinigte Staaten, etc.

Die geoip_city-Direktive stellt die folgenden Variablen zur Verfügung:

  • $geoip_city_country_code – zweistelliger Ländercode, z.B. RU, US.
  • $geoip_city_country_code3 – Ländercode mit drei Buchstaben, z.B. RUS, USA.
  • $geoip_city_country_name – der Name des Landes, z.B. Russische Föderation, Vereinigte Staaten – falls vorhanden.
  • $geoip_region – der Name der Region (Provinz, Region, Staat, Provinz, Bundesland, und dergleichen), z.B. Moscow City, DC – falls vorhanden.
  • $geoip_city – der Name der Stadt, z.B. Moskau, Washington, Lissabon, etc. – falls vorhanden.
  • $geoip_postal_code – Postleitzahl oder Postleitzahl – falls vorhanden.
  • $geoip_city_continent_code – falls vorhanden.
  • $geoip_latitude – Latitude – Latitude – falls vorhanden.
  • $geoip_longitude – Längengrad – falls vorhanden.

Um diese Variablen auch für Ihre PHP-Skripte verfügbar zu machen, müssen wir einige fastcgi_param-Direktiven setzen. Am besten in der Datei /etc/nginx/fastcgi_params, wo sich die anderen fastcgi_param Direktiven befinden:

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;

(Stellen Sie sicher, dass Sie die Zeile /etc/nginx/fastcgi_params enthalten haben; an Ihrem Standort ~ \.php$ {} Container in Ihrer Vhost-Konfiguration, da sonst die obige Konfiguration für Ihren Vhost nutzlos ist.)

Wenn Sie nginx als Reverse-Proxy verwenden und die GeoIP-Variablen an das Backend übergeben wollen, sollten Sie die Datei /etc/nginx/proxy.conf…. erstellen/bearbeiten.

nano /etc/nginx/proxy.conf

…. und fügen Sie die folgenden Zeilen hinzu:

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

(Stellen Sie sicher, dass Sie die Zeile include /etc/nginx/proxy.conf; in Ihrer nginx-Proxy-Konfiguration verwenden, da das Backend sonst die GeoIP-Variablen nicht verwenden kann.)

Jetzt nginx neu laden……

systemctl reload nginx.service

…. damit die Änderungen wirksam werden.

Starten Sie PHP-FPM wie folgt neu:

systemctl restart php7.0-fpm.service

5 Ein kurzer Test

Um zu sehen, ob das GeoIP-Modul korrekt funktioniert, können wir in unserem Webspace www.example.com eine kleine PHP-Datei erstellen (z.B. /var/wwww/www.example.com/web):

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

Wir können wie folgt auf die GeoIP-Variablen zugreifen:

$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);

Oder so:

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

Rufen Sie diese Datei in einem Browser auf (http://www.example.com/geoiptest.php), und Sie sollten GeoIP bei der Arbeit sehen (stellen Sie sicher, dass Sie die Datei von einer öffentlichen IP-Adresse aus aufrufen, nicht von einer lokalen):

GeoIP-Test

Es ist auch möglich, GeoIP-Variablen direkt in der nginx-Konfiguration zu verwenden, z.B. wie folgt:

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

Wenn in diesem Beispiel ein Besucher aus Deutschland kommt (Ländercode: DE) und die Datei index_DE.html existiert, dann wird diese Datei bedient, ansonsten die Standarddatei index.html.

Auf diese Weise können Inhalte in verschiedenen Sprachen, je nach Herkunft des Benutzers, bereitgestellt werden.

6 Links

Das könnte dich auch interessieren …