Vyhledávání na webu

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.