Tento tutoriál vysvětluje, jak používat modul GeoIP s nginx na Ubuntu 16.04, abyste zjistili, odkud vaši návštěvníci pocházejí. Modul GeoIP nastavuje několik proměnných jako $geoip_country_name, $geoip_country_code, $geoip_city atd., které můžete použít ve svých skriptech PHP nebo přímo v konfiguraci nginx, například k poskytování obsahu v různých jazycích podle země uživatele.
1 předběžná poznámka
Zde používám web www.example.com s kořenem dokumentu /var/www/www.example.com/web/ a konfiguračním souborem Nginx vhost /etc/nginx/sites-enabled/www.example.com. vhost. Tento návod použiji pro základní nastavení Ubuntu-Nginx. https://www.howtoforge.com/tutorial/installing-nginx-with-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp/
Tento návod je také kompatibilní s nastavením ISPConfig nginx.
Poznámka pro uživatele Ubuntu:
Protože musíme všechny kroky z tohoto tutoriálu spustit s právy root, můžeme buď před všechny příkazy v tomto tutoriálu přidat řetězec sudo, nebo se staneme rootem hned teď zadáním
sudo -s
2 Zjistěte, zda Nginx podporuje GeoIP
Než začneme, musíme zjistit, zda je modul GeoIP zabudován do našeho serveru nginx:
nginx -V
[chráněno e-mailem]:~# nginx -V
verze nginx:nginx/1.10.0 (Ubuntu)
vytvořeno s OpenSSL 1.0.2g-fips 1. března 2016
Podpora TLS SNI povoleno
konfigurovat argumenty:--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 mail --with-mail_ssl_module --with-threads
3 Stáhnout databáze GeoIP
Na Debianu a Ubuntu existuje balíček geoip-database, který lze nainstalovat přes apt, ale je trochu zastaralý a obsahuje pouze GeoIP.dat (databáze zemí), nikoli GeoLiteCity.dat (databáze měst). Proto tento balíček neinstalujeme, ale stahujeme nové kopie z webu GeoIP do adresáře /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 Konfigurace Nginx
Nyní nakonfigurujeme nginx. Otevřete /etc/nginx/nginx.conf...
nano /etc/nginx/nginx.conf
... a přidejte direktivy geoip_country a geoip_city do kontejneru http {}:
[...]http {
##
# Základní nastavení
##
geoip_country /etc/nginx/geoip/GeoIP .dat; # databáze IP zemí
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # databáze IP města[...]
Direktiva geoip_country zpřístupňuje následující proměnné:
- $geoip_country_code – dvoupísmenný kód země, například RU, USA.
- $geoip_country_code3 – třípísmenný kód země, například RUS, USA.
- $geoip_country_name – (úplný) název země, například Ruská federace, Spojené státy atd.
Direktiva geoip_city poskytuje následující proměnné:
- $geoip_city_country_code – dvoupísmenný kód země, například RU, USA.
- $geoip_city_country_code3 – třípísmenný kód země, například RUS, USA.
- $geoip_city_country_name – název země, například Ruská federace, Spojené státy – pokud je k dispozici.
- $geoip_region – název regionu (provincie, region, stát, provincie, federální země a podobně), například Moskva City, DC – je-li k dispozici.
- $geoip_city – název města, například Moskva, Washington, Lisabon atd. – pokud je k dispozici.
- $geoip_postal_code – PSČ nebo poštovní směrovací číslo – je-li k dispozici.
- $geoip_city_continent_code – pokud je k dispozici.
- $geoip_latitude – zeměpisná šířka – pokud je k dispozici.
- $geoip_longitude – zeměpisná délka – pokud je k dispozici.
Abychom tyto proměnné zpřístupnili i vašim PHP skriptům, musíme nastavit několik direktiv fastcgi_param. Nejlepší je to udělat v souboru /etc/nginx/fastcgi_params, kde jsou ostatní direktivy fastcgi_param:
nano /etc/nginx/fastcgi_params
[...] ### SET GeoIP proměnných ### 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_itude;fastcgi_param $_ipgeoIP_LAIPTI_long_lg $_ipgeoIP_LAIPTI_long GEOIP;ip_LAIPTI_long GEOIP;(Ujistěte se, že řádek obsahuje /etc/nginx/fastcgi_params; ve vaší lokalitě ~ \.php$ {} kontejner v konfiguraci vhost, protože jinak je výše uvedená konfigurace pro váš vhost k ničemu.)
Pokud používáte nginx jako reverzní proxy a chcete předávat proměnné GeoIP do backendu, měli byste vytvořit/upravit soubor /etc/nginx/proxy.conf...
nano /etc/nginx/proxy.conf... a přidejte k němu následující řádky:
[...] ### SET GeoIP proměnných ### 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 $pregeoIP_LATI_longat $pregeoIP_LA_header GEOIPeroIP_LATI_longset $preip_LATI_longset(Ujistěte se, že používáte řádek včetně /etc/nginx/proxy.conf; ve vaší konfiguraci proxy nginx, protože jinak backend nemůže používat proměnné GeoIP.)
Nyní znovu načtěte nginx...
systemctl znovu načtěte nginx.service... aby se změny projevily.
Restartujte PHP-FPM následovně:
systemctl restart php7.0-fpm.service
5 Krátký test
Abychom zjistili, zda modul GeoIP funguje správně, můžeme vytvořit malý soubor PHP v našem webovém prostoru www.example.com (např. /var/www/www.example.com/web):
nano /var/www/www.example.com/web/geoiptest.phpK proměnným GeoIP můžeme přistupovat následovně:
$geoip_country_code =getenv(GEOIP_COUNTRY_CODE);Nebo takto:
$geoip_country_code =$_SERVER['GEOIP_COUNTRY_CODE'];';echo 'country_code3:'.$geoip_country_code3.'
';echo 'country_name:'.$geoip_country_name.'
';echo 'city_country_code:'.$geoip_city_country_code.'
';echo 'city_country_code3:'.$geoip_city_country_code3.'
';echo 'city_country_name:'.$geoip_city_country_name.'
';echo 'region:'.$geoip_region.'
'; echo 'city:'.$geoip_city.'
';echo 'postal_code:'.$geoip_postal_code.'
';echo 'city_continent_code:'.$geoip_city_continent_code.'
';echo 'zeměpisná šířka:'.$geoip_latitude.'
';echo 'longitude:'.$geoip_longitude.'
'; ?>Zavolejte ten soubor v prohlížeči (http://www.example.com/geoiptest.php) a měli byste vidět GeoIP v práci (ujistěte se, že soubor voláte z veřejné IP adresy, ne z místní) :
Je také možné použít proměnné GeoIP přímo v konfiguraci nginx, např. takto:
nano /etc/nginx/sites-enabled/www.example.com.vhost[...] umístění / { index index.html index.php; try_files /index_$geoip_country_code.html /index.html; [...]]systemctl znovu načtěte nginx.serviceV tomto příkladu, pokud návštěvník pochází z Německa (kód země:DE) a soubor index_DE.html existuje, bude poskytnut tento soubor, v opačném případě bude poskytnut výchozí soubor index.html.
To lze použít k poskytování obsahu v různých jazycích na základě původu uživatele.
6 odkazů
- nginx:http://nginx.org/
- nginx Wiki:http://wiki.nginx.org/
- Ubuntu:http://www.ubuntu.com/