Kaip sukonfigūruoti tinkintą prieigą ir klaidų žurnalo formatus „Nginx“.


Nginx HTTP serveris turi fenomenalią registravimo funkciją, kurią galima lengvai pritaikyti. Šiame straipsnyje paaiškinsime, kaip sukonfigūruoti savo „Nginx“ prieigos ir klaidų žurnalų formatus sistemoje „Linux“.

Šio vadovo tikslas – padėti suprasti, kaip generuojami žurnalai, kad būtų galima sukonfigūruoti pasirinktinius žurnalų formatus, kad būtų galima derinti, šalinti triktis arba analizuoti, kas vyksta jūsų žiniatinklio serveryje ir žiniatinklio programose (pvz., sekimo užklausose).

Taip pat skaitykite: 4 geri atvirojo kodo žurnalų stebėjimo ir valdymo įrankiai, skirti Linux

Šį straipsnį sudaro trys skyriai, kuriuose bus paaiškinta, kaip konfigūruoti prieigos/klaidų žurnalus ir kaip įgalinti sąlyginį registravimą „Nginx“.

Prieigos žurnalų konfigūravimas Nginx

Dalyje Nginx visos klientų užklausos serveriui įrašomos į prieigos žurnalą nurodytu formatu, naudojant ngx_http_log_module modulį.

Numatytasis žurnalo failas yra log/access.log (paprastai /var/log/nginx/access_log Linux sistemose), o numatytasis registravimo formatas paprastai yra kombinuotas arba pagrindinis formatu (tai gali skirtis priklausomai nuo platinimo).

Direktyva access_log (taikoma http, serveryje, vietoje, jei yra vietoje ir ribose, išskyrus kontekstą) naudojama žurnalo failui ir log_format direktyvai (taikoma pagal tik kontekste http) naudojamas žurnalo formatui nustatyti. Žurnalo formatas apibūdinamas įprastais kintamaisiais ir kintamaisiais, kurie generuojami tik tuo metu, kai rašomas žurnalas.

Žurnalo formato konfigūravimo sintaksė yra tokia:

log_format format_name 'set_of_variables_to_define_format';

ir prieigos žurnalo konfigūravimo sintaksė yra tokia:

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

Toliau pateikiama ištrauka iš numatytojo Nginx konfigūracijos failo /etc/nginx/nginx.conf sistemoje 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;
}

Šis žurnalo formatas pateikia tokį žurnalo įrašą.

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"

Toliau pateikiamas kitas naudingas registravimo formatas, kurį naudojame savo žiniatinklio programų užklausoms sekti naudodami kai kuriuos numatytuosius kintamuosius. Svarbiausia, kad jis turi užklausos ID ir registruoja kliento vietos informaciją (šalį, šalies kodą, regioną ir miestą).

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

Galite naudoti taip:

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

Bus sukurtas žurnalo įrašas, kuris atrodys taip.

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 

Galite nurodyti kelis žurnalus naudodami access_log direktyvas tame pačiame lygyje, čia mes naudojame daugiau nei vieną žurnalo failą http kontekste.

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

Toliau pateikiami sudėtingesnių registravimo konfigūracijų pavyzdžiai, naudingi žurnalo formatams, kuriuose yra su glaudinimu susijusių kintamųjų, ir kuriant suglaudintus žurnalo failus:

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

Klaidų žurnalų konfigūravimas Nginx

Jei Nginx patiria kokių nors trikdžių, ji įrašo su jais susijusią informaciją klaidų žurnale. Šios problemos priklauso nuo skirtingų sunkumo lygių: derinimas, informacija, pranešimas, perspėjimas, klaida (tai numatytasis lygis ir veikia visame pasaulyje), crit, alert arba emerg.

Numatytasis žurnalo failas yra log/error.log, bet paprastai jis yra /var/log/nginx/ „Linux“ paskirstyme. Direktyva error_log naudojama nurodyti žurnalo failą ir gali būti naudojama pagrindiniame, http, pašto, srauto, serverio, vietos kontekste (tokia tvarka).

Taip pat turėtumėte atkreipti dėmesį, kad:

  • Konfigūracijas pagrindiniame kontekste visada paveldi žemesni lygiai aukščiau nurodyta tvarka.
  • o konfigūracijos žemesniuose lygiuose nepaiso konfigūracijų, paveldėtų iš aukštesnių lygių.

Klaidų registravimą galite konfigūruoti naudodami šią sintaksę:

error_log /path/to/log_file log_level;

Pavyzdžiui:

error_log /var/log/nginx/error_log warn; 

Tai nurodys „Nginx“ registruoti visus pranešimus, kurių tipas yra warn ir sunkesnis žurnalo lygis kritinis, alert ir emerg. žinutes.

Kitame pavyzdyje bus registruojami pranešimai apie kritinį, alert ir eerg lygį.

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

Apsvarstykite toliau pateiktą konfigūraciją, čia apibrėžėme klaidų registravimą skirtingais lygiais (http ir serverio kontekste). Klaidos atveju pranešimas įrašomas tik į vieną klaidų žurnalą, esantį arčiausiai to lygio, kuriame įvyko klaida.

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

Jei naudojate daugiau nei vieną error_log direktyvą, kaip nurodyta toliau pateiktoje konfigūracijoje (to paties lygio), pranešimai įrašomi į visus nurodytus žurnalus.

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

Sąlyginio registravimo konfigūravimas „Nginx“.

Kai kuriais atvejais galime norėti, kad „Nginx“ atliktų sąlyginį pranešimų registravimą. Ne kiekvienas pranešimas turi būti registruojamas Nginx, todėl tam tikrais atvejais galime nepaisyti nereikšmingų ar mažiau svarbių žurnalo įrašų iš mūsų prieigos žurnalų.

Galime naudoti ngx_http_map_module modulį, kuris sukuria kintamuosius, kurių reikšmės priklauso nuo kitų kintamųjų verčių. Žemėlapio bloko parametrai (kurie turėtų būti tik http turinyje) nurodo šaltinio ir gautų verčių susiejimą.

Taikant tokį nustatymą, užklausa nebus registruojama, jei sąlygos įvertinimas yra „0 ” arba tuščia eilutė. Į šį pavyzdį neįtrauktos užklausos su HTTP būsenos kodais 2xx ir 3xx.

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

Štai dar vienas naudingas pavyzdys, kaip derinti žiniatinklio programą kūrimo etape. Taip bus nepaisoma visų pranešimų ir tik registruojama derinimo informacija.

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

Daugiau informacijos, įskaitant prisijungimą prie syslog, galite sužinoti čia.

Tai kol kas viskas! Šiame vadove paaiškinome, kaip sukonfigūruoti pasirinktinį registravimo formatą prieigai ir klaidų žurnalams Nginx. Norėdami užduoti klausimų arba pasidalinti mintimis apie šį straipsnį, naudokite toliau pateiktą atsiliepimų formą.