Si të konfiguroni formatet e aksesit të personalizuar dhe të regjistrit të gabimeve në Nginx


Serveri Nginx HTTP ka një strukturë fenomenale të prerjeve, e cila është shumë e personalizueshme. Në këtë artikull, ne do të shpjegojmë se si të konfiguroni formatet tuaja për hyrjen dhe regjistrat e gabimeve për Nginx në Linux.

Qëllimi i këtij udhëzuesi është t'ju ndihmojë të kuptoni se si krijohen regjistrat, në mënyrë që të konfiguroni formatet e personalizuara të regjistrave për qëllime të korrigjimit, zgjidhjes së problemeve ose analizës së asaj që shpaloset brenda serverit tuaj të uebit si dhe aplikacioneve të uebit (të tilla si kërkesat për gjurmimin).

Ky artikull përbëhet nga tre seksione të cilat do t'ju ndriçojnë rreth konfigurimit të regjistrave të aksesit/gabimeve dhe si të aktivizoni regjistrimin e kushtëzuar në Nginx.

Konfigurimi i regjistrave të aksesit në Nginx

Nën Nginx, të gjitha kërkesat e klientit për serverin regjistrohen në regjistrin e aksesit në një format të caktuar duke përdorur modulin ngx_http_log_module.

Skedari i paracaktuar i regjistrit është log/access.log (zakonisht /var/log/nginx/access_log në sistemet Linux) dhe formati i paracaktuar për regjistrimin është zakonisht formati i kombinuar ose kryesor (kjo mund të ndryshojë nga një shpërndarje në tjetrën).

Direktiva access_log (e aplikueshme në http, server, vendndodhje, nëse është në vendndodhje dhe limit përveç kontekstit) përdoret për të vendosur skedarin e regjistrit dhe direktiva log_format (e aplikueshme vetëm në kontekstin http) përdoret për të vendosur formatin e regjistrit. Formati i regjistrit përshkruhet nga ndryshore të zakonshme dhe variabla që krijohen vetëm në kohën kur shkruhet një regjistër.

Sintaksa për konfigurimin e një formati regjistri është:

log_format format_name 'set_of_variables_to_define_format';

dhe sintaksa për konfigurimin e regjistrit të aksesit është:

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

Më poshtë është një fragment nga skedari i paracaktuar i konfigurimit Nginx /etc/nginx/nginx.conf në 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;
}

Ky format i regjistrit jep hyrjen e mëposhtme të regjistrit.

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"

Më poshtë është një tjetër format i dobishëm regjistrimi që ne përdorim për gjurmimin e kërkesave në aplikacionet tona në ueb duke përdorur disa nga variablat e paracaktuar, më e rëndësishmja ka ID-në e kërkesës dhe regjistron detajet e vendndodhjes së klientit (shteti, kodi i vendit, rajoni dhe qyteti).

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

Mund ta përdorni si kjo:

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

Kjo do të prodhojë një hyrje në regjistër që duket si kjo.

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 

Ju mund të specifikoni disa regjistra duke përdorur direktivat access_log në të njëjtin nivel, këtu ne po përdorim më shumë se një skedar log në kontekstin 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;
}

Më poshtë janë shembuj më të avancuar të konfigurimeve të regjistrimit, të cilët janë të dobishëm për formatet e regjistrit që përmbajnë variabla të lidhura me kompresimin dhe për krijimin e skedarëve të ngjeshur të regjistrit:

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

Konfigurimi i regjistrave të gabimeve në Nginx

Në rast se Nginx përjeton ndonjë defekt, ai regjistron informacione në lidhje me to në regjistrin e gabimeve. Këto çështje bien nën nivele të ndryshme ashpërsie: korrigjimi, informacioni, njoftimi, paralajmërimi, gabimi (ky është niveli i paracaktuar dhe funksionon globalisht), crit, alarmi ose shfaqja.

Skedari i paracaktuar i regjistrit është log/error.log, por zakonisht ndodhet në /var/log/nginx/ në shpërndarjet Linux. Direktiva error_log përdoret për të specifikuar skedarin e regjistrit dhe mund të përdoret në kontekstin kryesor, http, mail, transmetim, server, vendndodhje (në atë renditje).

Ju gjithashtu duhet të vini re se:

  • Konfigurimet në kontekstin kryesor trashëgohen gjithmonë nga nivelet më të ulëta në rendin e mësipërm.
  • dhe konfigurimet në nivelet më të ulëta tejkalojnë konfigurimet e trashëguara nga nivelet më të larta.

Ju mund të konfiguroni regjistrimin e gabimeve duke përdorur sintaksën e mëposhtme:

error_log /path/to/log_file log_level;

Për shembull:

error_log /var/log/nginx/error_log warn; 

Kjo do të udhëzojë Nginx të regjistrojë të gjitha mesazhet e llojit paralajmërues dhe mesazhet më të rënda të nivelit të regjistrit, alarmin dhe mesazhet emerg.

Në shembullin tjetër, mesazhet e niveleve të crit, alarmit dhe shfaqjes do të regjistrohen.

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

Konsideroni konfigurimin më poshtë, këtu, ne kemi përcaktuar regjistrimin e gabimeve në nivele të ndryshme (në kontekstin http dhe server). Në rast gabimi, mesazhi shkruhet vetëm në një regjistër të gabimeve, ai më afër nivelit ku është shfaqur gabimi.

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

Nëse përdorni më shumë se një direktivë error_log si në konfigurimin më poshtë (në të njëjtin nivel), mesazhet shkruhen në të gjitha regjistrat e specifikuar.

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

Konfigurimi i regjistrimit të kushtëzuar në Nginx

Në disa raste, ne mund të dëshirojmë që Nginx të kryejë regjistrimin e kushtëzuar të mesazheve. Jo çdo mesazh duhet të regjistrohet nga Nginx, prandaj ne mund të injorojmë hyrjet e parëndësishme ose më pak të rëndësishme në regjistrat tanë të aksesit për raste të veçanta.

Ne mund të përdorim modulin ngx_http_map_module i cili krijon variabla vlerat e të cilave varen nga vlerat e variablave të tjerë. Parametrat brenda një blloku harte (i cili duhet të ekzistojë vetëm në përmbajtjen http) specifikojnë një hartë midis burimit dhe vlerave rezultuese.

Për këtë lloj cilësimi, një kërkesë nuk do të regjistrohet nëse kushti vlerësohet në \0” ose një varg bosh. Ky shembull përjashton kërkesat me kodet e statusit HTTP 2xx dhe 3xx.

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

Këtu është një shembull tjetër i dobishëm për korrigjimin e një aplikacioni ueb në një fazë zhvillimi. Kjo do të injorojë të gjitha mesazhet dhe do të regjistrojë vetëm informacionin e korrigjimit.

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

Mund të gjeni më shumë informacion, duke përfshirë regjistrimin në syslog këtu.

Kjo është e gjitha për tani! Në këtë udhëzues, ne shpjeguam se si të konfiguroni formatin e personalizuar të regjistrimit për regjistrat e aksesit dhe gabimeve në Nginx. Përdorni formularin e komenteve më poshtë për të bërë pyetje ose për të ndarë mendimet tuaja rreth këtij artikulli.