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.