Mukautettujen käyttöoikeuksien ja virhelokimuotojen määrittäminen Nginxissä


Nginx HTTP -palvelimessa on ilmiömäinen kirjausominaisuus, joka on erittäin muokattavissa. Tässä artikkelissa kerromme, kuinka voit määrittää omistamasi muodot Nginxin käyttöoikeuksia ja virhelokeja varten Linuxissa.

Tämän oppaan tarkoituksena on auttaa sinua ymmärtämään, miten lokit luodaan, jotta voit määrittää mukautetut lokimuodot virheenkorjausta, vianetsintää tai Web-palvelimen sisällä tapahtuvan sisällön analysointia varten sekä verkkosovelluksia (kuten jäljityspyyntöjä) varten.

Tämä artikkeli koostuu kolmesta osiosta, jotka kertovat käyttö-/virhelokien määrittämisestä ja ehdollisen kirjaamisen käyttöönotosta Nginxissä.

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

Nginx-kohdassa kaikki palvelimelle lähetetyt asiakaspyynnöt kirjataan pääsylokiin määritetyssä muodossa käyttämällä moduulia ngx_http_log_module.

Oletusarvoinen lokitiedosto on log/access.log (yleensä/var/log/nginx/access_log Linux-järjestelmissä) ja kirjaamisen oletusmuoto on yleensä yhdistetty tai päämuoto (tämä voi vaihdella levystä toiseen).

Access_log-direktiiviä (jota sovelletaan http:ssä, palvelimessa, sijainnissa, jos se on sijaintia ja rajoitusta lukuun ottamatta kontekstia) käytetään lokitiedoston asettamiseen ja lokin muoto -direktiiviä (sovellettavissa vain http-kontekstissa) käytetään lokimuodon asettamiseen. Lokimuoto kuvataan yleisillä muuttujilla ja muuttujilla, jotka luotiin vasta lokin kirjoittamisen aikana.

Lokimuodon määrittämisen syntaksi on:

log_format format_name 'set_of_variables_to_define_format';

ja pääsynäkymän 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]];

Seuraava on ote CentOS 7: n Nginx-oletusasetustiedostosta /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 antaa 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 kirjausmuoto, jota käytämme seuraamaan pyyntöjä verkkosovelluksillemme käyttämällä joitain oletusmuuttujia. Tärkeintä on, että sillä on pyynnön tunnus ja loki asiakkaan sijaintitiedot (maa, maatunnus, 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-direktiivejä samalla tasolla. Tässä yhteydessä käytämme useita lokitiedostoja 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 kehittyneempiä lokikokoonpanomäärityksiä, joista on hyötyä lokitiedostomuodoille, jotka sisältävät pakkaamiseen liittyviä muuttujia, ja pakattujen lokitiedostojen luomiselle:

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 kokee virheitä, se tallentaa niitä koskevat tiedot virhelokiin. Nämä ongelmat kuuluvat eri vakavuusasteisiin: virheenkorjaus, tieto, huomautus, varoitus, virhe (tämä on oletustaso ja toimii maailmanlaajuisesti), kriittinen, hälytys tai uusi.

Oletusarvoinen lokitiedosto on log/error.log, mutta se sijaitsee yleensä tiedostossa/var/log/nginx/Linux-jakelussa. Error_log-direktiiviä käytetään lokitiedoston määrittämiseen, ja sitä voidaan käyttää pää-, http-, posti-, virta-, palvelin-, sijaintikontekstissa (tässä järjestyksessä).

Huomaa myös, että:

  • Määritykset periytyvät pääkontekstissa aina alemmilla tasoilla yllä olevassa järjestyksessä.
  • ja alempien tasojen kokoonpanot ohittavat ylemmiltä tasoilta perityt kokoonpanot.

Voit määrittää virheen kirjaamisen seuraavalla syntaksilla:

error_log /path/to/log_file log_level;

Esimerkiksi:

error_log /var/log/nginx/error_log warn; 

Tämä kehottaa Nginxiä kirjaamaan kaikki tyypin varoitukset ja vakavammat lokitason kriittiset, hälytys- ja uudet viestit.

Seuraavassa esimerkissä kriittisen, hälytys- ja nousutason viestit kirjataan.

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

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

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-direktiiviä kuten alla olevassa määrityksessä (sama taso), 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 kirjaamisen määrittäminen Nginxissä

Joissakin tapauksissa saatamme haluta Nginxin suorittavan ehdollisen viestien kirjaamisen. Kaikkien viestien ei tarvitse olla Nginxin kirjaamia, joten voimme jättää huomiotta merkityksettömät tai vähemmän tärkeät lokimerkinnät pääsylokeistamme tietyille instansseille.

Voimme käyttää moduulia ngx_http_map_module, joka luo muuttujia, joiden arvot riippuvat muiden muuttujien arvoista. Karttalohkon parametrit (joiden pitäisi olla vain http-sisällössä) määrittelevät lähteen ja tuloksena olevien arvojen välisen kartoituksen.

Tällaista asetusta varten pyyntöä ei kirjata, jos ehdoksi arvioidaan “0” tai tyhjä merkkijono. Tämä esimerkki sulkee pois pyynnöt, joissa on HTTP-tilakoodi 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 kirjaa virheenkorjaustiedot.

 
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 kirjautumisen syslogiin.

Tässä kaikki tältä erää! Tässä oppaassa selitimme, kuinka mukautettu lokimuoto määritetään käyttö- ja virhelokeille Nginxissä. Käytä alla olevaa palautelomaketta kysyäksesi tai jakamalla ajatuksiasi tästä artikkelista.