Kako konfigurirati oblike dostopa po meri in zapise napak v Nginxu


Strežnik Nginx HTTP ima fenomenalen način beleženja, ki ga je mogoče zelo prilagoditi. V tem članku bomo razložili, kako konfigurirate lastne formate za dostop in dnevnike napak za Nginx v Linuxu.

Namen tega priročnika je, da vam pomaga razumeti, kako se dnevniki ustvarjajo, in konfigurirati oblike dnevnikov po meri za odpravljanje napak, odpravljanje težav ali analizo tega, kar se odvija v vašem spletnem strežniku, pa tudi v spletnih aplikacijah (kot so zahteve za sledenje).

Ta članek je sestavljen iz treh razdelkov, ki vam bodo predstavili konfiguracijo dnevnikov dostopa/napak in kako omogočiti pogojno beleženje v Nginxu.

Konfiguriranje dnevnikov dostopa v Nginxu

V Nginxu se vse zahteve odjemalcev do strežnika v modulu ngx_http_log_module povrnejo v dnevnik dostopa v določeni obliki.

Privzeta datoteka dnevnika je log/access.log (običajno/var/log/nginx/access_log v sistemih Linux), privzeta oblika zapisovanja pa je običajno kombinirana ali glavna oblika (ta se lahko razlikuje od enega do drugega distronta).

Za nastavitev datoteke dnevnika se uporablja direktiva access_log (velja za http, strežnik, lokacijo, če je na lokaciji in v omejitvi, razen v kontekstu), za nastavitev oblike dnevnika pa se uporablja direktiva log_format (velja samo v kontekstu http). Oblika dnevnika je opisana s skupnimi spremenljivkami in spremenljivkami, ki so nastale le v času, ko je zapisan.

Sintaksa za konfiguracijo oblike dnevnika je:

log_format format_name 'set_of_variables_to_define_format';

in skladnja za konfiguracijo dnevnika dostopa 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]];

V nadaljevanju je izvleček iz privzete konfiguracijske datoteke 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;
}

Ta oblika dnevnika prinaša naslednji vnos v dnevnik.

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"

Sledi še ena uporabna oblika zapisovanja, ki jo uporabljamo za sledenje zahtevam do naših spletnih aplikacij z uporabo nekaterih privzetih spremenljivk, najpomembneje pa je, da ima ID zahteve in beleži podatke o lokaciji odjemalca (država, koda države, regija in mesto).

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 ';

Uporabite ga lahko tako:

access_log  /var/log/nginx/access.log custom;

To bo ustvarilo vnos v dnevnik, ki je videti tako.

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 

Z uporabo direktiv access_log na isti ravni lahko podate več dnevnikov, tukaj uporabljamo več kot eno datoteko dnevnika v kontekstu 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;
}

V nadaljevanju so predstavljeni primeri naprednejših konfiguracij beleženja, ki so uporabni za zapise dnevnikov, ki vsebujejo spremenljivke, povezane s stiskanjem, in za ustvarjanje stisnjenih datotek dnevnika:

access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression  gzip  flush=5m;

Konfiguriranje dnevnikov napak v Nginxu

V primeru, da Nginx doživi kakršne koli napake, podatke v zvezi z njimi zabeleži v dnevnik napak. Te težave spadajo pod različne stopnje resnosti: odpravljanje napak, informacije, obvestilo, opozorilo, napaka (to je privzeta raven in deluje globalno), kritika, opozorilo ali pojav.

Privzeta datoteka dnevnika je log/error.log, vendar se običajno nahaja v/var/log/nginx/v distribucijah Linuxa. Direktiva error_log se uporablja za podajanje datoteke dnevnika in jo je mogoče uporabiti v glavnem, http, pošti, toku, strežniku, kontekstu lokacije (v tem vrstnem redu).

Upoštevati morate tudi, da:

  • Konfiguracije v glavnem kontekstu vedno podedujejo nižje ravni v zgornjem vrstnem redu.
  • in konfiguracije na nižjih ravneh preglasijo konfiguracije, podedovane od višjih ravni.

Zapisovanje napak lahko konfigurirate z naslednjo skladnjo:

error_log /path/to/log_file log_level;

Na primer:

error_log /var/log/nginx/error_log warn; 

To bo naročilo Nginxu, da zabeleži vsa sporočila, ki opozarjajo na vrsto in sporočila o kritičnih stopnjah dnevnika, opozorila in pojavna sporočila.

V naslednjem primeru bodo zabeležena sporočila kritičnih, opozorilnih in pojavnih ravni.

error_log /var/www/example1.com/log/error_log crit;

Upoštevajte spodnjo konfiguracijo, tukaj smo definirali beleženje napak na različnih ravneh (v kontekstu http in strežnika). V primeru napake se sporočilo zapiše samo v en dnevnik napak, najbližje ravni, kjer se je napaka pojavila.

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;
        		…….
    	}
}

Če uporabljate več direktiv error_log kot v spodnji konfiguraciji (ista raven), se sporočila zapišejo v vse podane dnevnike.

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;
            	…...
	}

Konfiguriranje pogojnega beleženja v Nginxu

V nekaterih primerih bomo morda želeli, da Nginx izvede pogojno beleženje sporočil. Nginx ne beleži vsakega sporočila, zato lahko zanemarimo nepomembne ali manj pomembne vnose dnevnika iz dnevnikov dostopa za določene primere.

Uporabljamo lahko modul ngx_http_map_module, ki ustvarja spremenljivke, katerih vrednosti so odvisne od vrednosti drugih spremenljivk. Parametri znotraj bloka zemljevida (ki bi morali obstajati samo v vsebini http) podajajo preslikavo med izvornimi in posledičnimi vrednostmi.

Za tovrstno nastavitev zahteva ne bo zabeležena, če je pogoj ocenjen na \"0" ali prazen niz. Ta primer izključuje zahteve s kodami stanja HTTP 2xx in 3xx.

http{
	map $status $condition {
		~^[23] 0;
    		default 1;
	}
	server{
		access_log  /path/to/access.log  custom if=$condition;
	}
}

Tu je še en uporaben primer za odpravljanje napak spletne aplikacije v razvojni fazi. S tem boste prezrli vsa sporočila in samo podatke o odpravljanju napak v dnevniku.

 
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; 
		…….
	}
}

Več informacij, vključno s prijavo v syslog, lahko najdete tukaj.

To je vse za zdaj! V tem priročniku smo razložili, kako konfigurirati obliko zapisovanja po meri za dnevnike dostopa in napake v Nginxu. Uporabite spodnji obrazec za povratne informacije, da postavite vprašanja ali delite svoje misli o tem članku.