Kuinka määrittää mukautetut käyttöoikeudet ja virhelokimuodot Nginxissä


Nginx HTTP -palvelimessa on ilmiömäinen lokitoiminto, joka on hyvin muokattavissa. Tässä artikkelissa selitämme, kuinka voit määrittää omat muodot Nginxin käyttö- ja virhelokeille Linuxissa.

Tämän oppaan tarkoituksena on auttaa sinua ymmärtämään, kuinka lokit luodaan, jotta voit määrittää mukautettuja lokimuotoja virheenkorjausta, vianetsintää tai verkkopalvelimessasi ja verkkosovelluksissa tapahtuvaa analysointia varten (kuten jäljityspyynnöt).

Lue myös: 4 hyvää avoimen lähdekoodin lokien seuranta- ja hallintatyökalua Linuxille

Tämä artikkeli koostuu kolmesta osasta, joissa kerrotaan käyttö-/virhelokien määrittämisestä ja ehdollisen kirjauksen ottamisesta käyttöön Nginxissä.

Käyttölokien määrittäminen Nginxissä

Kohdassa Nginx kaikki asiakaspyynnöt palvelimelle tallennetaan käyttölokiin määritetyssä muodossa ngx_http_log_module-moduulin avulla.

Oletuslokitiedosto on log/access.log (yleensä /var/log/nginx/access_log Linux-järjestelmissä) ja lokin oletusmuoto on yleensä yhdistetty tai pää muodossa (tämä voi vaihdella jakelusta toiseen).

access_log-direktiiviä (sovellettava http, palvelin, sijainti, jos sijainnissa ja raja paitsi konteksti) käytetään lokitiedoston ja log_format-direktiivin asettamiseen (sovellettava Vain http-yhteys) käytetään lokimuodon asettamiseen. Lokimuotoa kuvaavat yleiset muuttujat ja muuttujat, jotka luodaan vain lokia kirjoitettaessa.

Lokimuodon määrittämisen syntaksi on:

log_format format_name 'set_of_variables_to_define_format';

ja käyttölokin konfiguroinnin syntaksi on:

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

Seuraavassa on ote CentOS 7:n Nginx-oletusmääritystiedostosta /etc/nginx/nginx.conf.

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

Tämä lokimuoto tuottaa seuraavan lokimerkinnän.

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"

Seuraava on toinen hyödyllinen lokimuoto, jota käytämme verkkosovellustemme pyyntöjen jäljittämiseen käyttämällä joitakin oletusmuuttujia. Tärkeintä on, että siinä on pyyntötunnus ja se kirjaa asiakkaan sijaintitiedot (maa, maakoodi, alue ja kaupunki).

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

Voit käyttää sitä näin:

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

Tämä tuottaa lokimerkinnän, joka näyttää tältä.

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 

Voit määrittää useita lokeja käyttämällä access_log-komentoja samalla tasolla, tässä käytämme useampaa kuin yhtä lokitiedostoa http-kontekstissa.

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

Seuraavat ovat edistyneempiä lokimääritysesimerkkejä, jotka ovat hyödyllisiä pakkaukseen liittyviä muuttujia sisältäville lokimuodoille ja pakattujen lokitiedostojen luomiseen:

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

Virhelokien määrittäminen Nginxissä

Jos Nginx havaitsee häiriöitä, se tallentaa niitä koskevat tiedot virhelokiin. Nämä ongelmat kuuluvat eri vakavuustasoihin: virheenkorjaus, tiedot, ilmoitus, varoitus, virhe (tämä on oletustaso ja toimii maailmanlaajuisesti), crit, alert tai emerg.

Oletuslokitiedosto on log/error.log, mutta se sijaitsee tavallisesti hakemistossa /var/log/nginx/ Linux-jakeluissa. error_log-direktiiviä käytetään lokitiedoston määrittämiseen, ja sitä voidaan käyttää pää-, http-, sähköposti-, stream-, palvelin-, sijaintikontekstissa (tässä järjestyksessä).

Kannattaa myös huomioida, että:

  • Pääkontekstin konfiguraatiot periytyvät aina alemmilla tasoilla yllä olevassa järjestyksessä.
  • ja alempien tasojen konfiguraatiot ohittavat ylemmiltä tasoilta perityt konfiguraatiot.

Voit määrittää virhelokia käyttämällä seuraavaa syntaksia:

error_log /path/to/log_file log_level;

Esimerkiksi:

error_log /var/log/nginx/error_log warn; 

Tämä ohjeistaa Nginxiä kirjaamaan kaikki viestit, joiden tyyppi on warn ja vakavampi lokitason crit, alert ja emerg. viestejä.

Seuraavassa esimerkissä kritiikin-, hälytys- ja emerg-tason viestit kirjataan.

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

Harkitse alla olevaa kokoonpanoa, tässä olemme määrittäneet virheiden kirjaamisen eri tasoilla (http- ja palvelinkontekstissa). Virheen sattuessa viesti kirjoitetaan vain yhteen virhelokiin, joka on lähinnä sitä tasoa, jossa virhe on ilmennyt.

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

Jos käytät useampaa kuin yhtä error_log-komentoa alla olevan määrityksen mukaisesti (samalla tasolla), viestit kirjoitetaan kaikkiin määritettyihin lokeihin.

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

Ehdollisen kirjauksen määrittäminen Nginxissä

Joissakin tapauksissa saatamme haluta Nginxin suorittavan ehdollisen viestien kirjaamisen. Nginxin ei tarvitse kirjata jokaista viestiä, joten voimme jättää huomioimatta merkityksettömät tai vähemmän tärkeät lokimerkinnät pääsylokeistamme tietyissä tapauksissa.

Voimme käyttää ngx_http_map_module-moduulia, joka luo muuttujia, joiden arvot riippuvat muiden muuttujien arvoista. Karttalohkon sisällä olevat parametrit (jonka pitäisi olla vain http-sisällössä) määrittävät lähde- ja tuloksena olevien arvojen yhdistämisen.

Tällaisissa asetuksissa pyyntöä ei kirjata lokiin, jos ehdon arvo on "0 " tai tyhjä merkkijono. Tämä esimerkki sulkee pois pyynnöt, joiden HTTP-tilakoodit ovat 2xx ja 3xx.

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

Tässä on toinen hyödyllinen esimerkki verkkosovelluksen virheenkorjauksesta kehitysvaiheessa. Tämä ohittaa kaikki viestit ja vain lokivirheenkorjaustiedot.

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

Täältä löydät lisätietoja, mukaan lukien kirjautuminen syslogiin.

Tässä kaikki tältä erää! Tässä oppaassa selitimme, kuinka mukautettu lokimuoto määritetään pääsy- ja virhelokeille Nginxissä. Käytä alla olevaa palautelomaketta esittääksesi kysymyksiä tai jakaaksesi ajatuksiasi tästä artikkelista.