Jak nakonfigurovat vlastní přístup a formáty protokolu chyb v Nginx
Server Nginx HTTP má fenomenální protokolovací zařízení, které je vysoce přizpůsobitelné. V tomto článku vysvětlíme, jak nakonfigurovat vlastní formáty pro protokoly přístupu a chyb pro Nginx v Linuxu.
Cílem této příručky je pomoci vám porozumět tomu, jak se generují protokoly, abyste mohli nakonfigurovat vlastní formáty protokolů pro účely ladění, odstraňování problémů nebo analýzy toho, co se odehrává na vašem webovém serveru a webových aplikacích (jako jsou požadavky na sledování).
Přečtěte si také: 4 dobré nástroje pro monitorování a správu protokolů s otevřeným zdrojovým kódem pro Linux
Tento článek se skládá ze tří částí, které vám objasní konfiguraci protokolů přístupu/chyb a jak povolit podmíněné protokolování v Nginx.
Konfigurace protokolů přístupu v Nginx
Pod Nginx jsou všechny požadavky klientů na server zaznamenávány do logu přístupu v určeném formátu pomocí modulu ngx_http_log_module.
Výchozí soubor protokolu je log/access.log (v systémech Linux obvykle /var/log/nginx/access_log) a výchozí formát protokolování je obvykle kombinovaný nebo hlavní formát (to se může lišit od jednoho distra k druhému).
Direktiva access_log (použitelná v http, server, location, pokud je v umístění a limit kromě kontextu) se používá k nastavení souboru protokolu a direktivy log_format (použitelné podle pouze kontext http) se používá k nastavení formátu protokolu. Formát protokolu je popsán běžnými proměnnými a proměnnými, které se generují pouze v době, kdy je protokol zapsán.
Syntaxe pro konfiguraci formátu protokolu je:
log_format format_name 'set_of_variables_to_define_format';
a syntaxe pro konfiguraci protokolu přístupu je:
access_log /path/to/log_file format_name; #simplest form
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
Následuje výňatek z výchozího konfiguračního souboru Nginx /etc/nginx/nginx.conf na CentOS 7.
http {
#main log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log;
}
Tento formát protokolu poskytuje následující záznam protokolu.
127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
Následuje další užitečný formát protokolování, který používáme pro sledování požadavků na naše webové aplikace pomocí některých výchozích proměnných, především má ID požadavku a zaznamenává podrobnosti o umístění klienta (země, kód země, region a město).
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
Můžete jej použít takto:
access_log /var/log/nginx/access.log custom;
Tím se vytvoří záznam protokolu, který vypadá takto.
153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala
Pomocí direktiv access_log na stejné úrovni můžete zadat několik protokolů, zde používáme více než jeden soubor protokolu v kontextu http.
http{
##default log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##request tracing using custom format
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
##this uses the default log format
access_log /var/log/nginx/access.log;
##this uses the our custom log format
access_log /var/log/nginx/custom_log custom;
}
Následují příklady pokročilejších konfigurací protokolování, které jsou užitečné pro formáty protokolů, které obsahují proměnné související s kompresí, a pro vytváření komprimovaných souborů protokolu:
access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression gzip flush=5m;
Konfigurace protokolů chyb v Nginx
V případě, že Nginx zaznamená nějaké závady, zaznamená informace o nich do protokolu chyb. Tyto problémy spadají do různých úrovní závažnosti: ladit, informace, upozornění, varovat, chyba (toto je výchozí úroveň a funguje globálně), crit, alert nebo emerg.
Výchozí soubor protokolu je log/error.log, ale v distribucích Linuxu se normálně nachází v /var/log/nginx/. Direktiva error_log se používá k určení souboru protokolu a lze ji použít v kontextu main, http, mail, stream, server, umístění (v tomto pořadí).
Měli byste také poznamenat, že:
- Konfigurace v hlavním kontextu jsou vždy zděděny nižšími úrovněmi ve výše uvedeném pořadí.
- a konfigurace na nižších úrovních přepíší konfigurace zděděné z vyšších úrovní.
Protokolování chyb můžete nakonfigurovat pomocí následující syntaxe:
error_log /path/to/log_file log_level;
Například:
error_log /var/log/nginx/error_log warn;
To dá Nginx pokyn, aby protokoloval všechny zprávy typu warn a přísnější úrovně protokolu crit, alert a emerg zprávy.
V dalším příkladu budou protokolovány zprávy úrovní crit, alert a emerg.
error_log /var/www/example1.com/log/error_log crit;
Zvažte konfiguraci níže, zde jsme definovali protokolování chyb na různých úrovních (v kontextu http a serveru). V případě chyby je zpráva zapsána pouze do jednoho chybového protokolu, který je nejblíže úrovni, kde se chyba objevila.
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
error_log /var/log/nginx/error_log crit;
server {
listen 80;
server_name example1.com;
#this logs errors messages for example1.com only
error_log /var/log/nginx/example1.error_log warn;
…...
}
server {
listen 80;
server_name example2.com;
#this logs errors messages for example2.com only
error_log /var/log/nginx/example1.error_log;
…….
}
}
Pokud použijete více než jednu direktivu error_log jako v konfiguraci níže (stejná úroveň), zprávy se zapisují do všech specifikovaných protokolů.
server {
listen 80;
server_name example1.com;
error_log /var/www/example1.com/log/error_log warn;
error_log /var/log/nginx/example1.error_log crit;
…...
}
Konfigurace podmíněného přihlášení v Nginx
V některých případech můžeme chtít, aby Nginx prováděl podmíněné protokolování zpráv. Ne každá zpráva musí být protokolována Nginxem, proto můžeme ignorovat nevýznamné nebo méně důležité položky protokolu z našich protokolů přístupu pro konkrétní případy.
Můžeme použít modul ngx_http_map_module, který vytváří proměnné, jejichž hodnoty závisí na hodnotách jiných proměnných. Parametry uvnitř bloku mapy (který by měl existovat pouze v obsahu http) určují mapování mezi zdrojovými a výslednými hodnotami.
U tohoto typu nastavení se požadavek nezaznamená, pokud se podmínka vyhodnotí jako “0 “
nebo prázdný řetězec. Tento příklad vylučuje požadavky se stavovými kódy HTTP 2xx a 3xx.
http{
map $status $condition {
~^[23] 0;
default 1;
}
server{
access_log /path/to/access.log custom if=$condition;
}
}
Zde je další užitečný příklad pro ladění webové aplikace ve fázi vývoje. Tím budou ignorovány všechny zprávy a budou protokolovány pouze informace o ladění.
http{
map $info $debuggable {
default 0;
debug 1;
}
server{
……..
access_log /var/log/nginx/testapp_debug_access_log debug if=$debuggable;
#logs other requests
access_log /var/log/nginx/testapp_access.log main;
…….
}
}
Více informací včetně přihlášení do syslogu najdete zde.
To je prozatím vše! V této příručce jsme vysvětlili, jak nakonfigurovat vlastní formát protokolování pro protokoly přístupu a chyb v Nginx. Pomocí formuláře pro zpětnou vazbu níže můžete pokládat otázky nebo sdílet své myšlenky na tento článek.