Ce face access_log / error_log
Nginx scrie în două tipuri de jurnale: access_log înregistrează fiecare cerere HTTP procesată (IP-ul clientului, data, metoda, URI-ul, codul de stare, numărul de octeți, Referer și User-Agent), iar error_log înregistrează problemele întâlnite la pornire sau în timpul procesării cererilor (fișiere lipsă, conexiuni eșuate către PHP-FPM sau backend, erori SSL, limite depășite).
Pe Debian/Ubuntu jurnalele globale sunt în /var/log/nginx/access.log și /var/log/nginx/error.log (rotite automat de logrotate), dar în producție este mult mai ușor de depanat dacă fiecare bloc server își are propriile fișiere de jurnal.
Pentru rutele apelate foarte des și fără valoare de audit (verificări /healthz, imagini, favicon), access_log off; în acel bloc location oprește scrierea în jurnalul de acces și reduce operațiile pe disc.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
Context: http, server, location |
error_log poate apărea și la nivelul rădăcină (main) din nginx.conf. |
access_log off |
Dezactivează complet înregistrarea în jurnalul de acces pentru contextul curent. |
buffer=64k flush=5s |
Adună liniile de jurnal în memorie și le scrie pe disc în calupuri (util pe site-uri cu trafic foarte mare). |
if=$variabilă |
Jurnalizare condiționată: înregistrează cererea doar dacă variabila nu este goală și nu este "0". |
Niveluri error_log |
De la cel mai detaliat la cel mai grav: debug, info, notice, warn, error (implicit), crit, alert, emerg. |
syslog:server=... |
Trimite jurnalele către un server syslog sau către stderr/stdout (în Docker). |
Exemple
Exemplul 1: Jurnale dedicate pentru un site și excluderea rutelor de zgomot
Cererile pentru /healthz și /favicon.ico nu poluează access.log:
server {
listen 80;
server_name example.com;
root /var/www/example.com/public;
access_log /var/log/nginx/example.com.access.log combined buffer=32k flush=5s;
error_log /var/log/nginx/example.com.error.log warn;
location = /healthz {
access_log off;
return 200 "ok\n";
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
}
Exemplul 2: Înregistrarea în access_log doar a cererilor cu eroare (4xx și 5xx)
Folosind map pe variabila $status și parametrul if= din access_log:
# În contextul http:
map $status $loggable_error {
~^[23] 0;
default 1;
}
# În contextul server:
access_log /var/log/nginx/errors-only.access.log combined if=$loggable_error;
Exemplul 3: Urmărirea în timp real a jurnalelor și găsirea celor mai frecvente erori
Comenzi uzuale la depanare:
sudo tail -f /var/log/nginx/example.com.error.log
awk '{print $9}' /var/log/nginx/example.com.access.log | sort | uniq -c | sort -rn | head -5
Ieșire în terminal
18420 200
1204 304
312 301
48 404
3 502
Greșeli frecvente
- A încerca să dezactivezi jurnalul de erori cu
error_log off;: spre deosebire deaccess_log, pentruerror_logcuvântuloffnu este cuvânt-cheie, ci creează un fișier numit literaloffîn directorul Nginx! Dacă vrei să-l dezactivezi, scrieerror_log /dev/null crit;. - Lăsarea nivelului
debugactivat pe un server de producție: generează cantități uriașe de text pentru fiecare cerere și poate umple discul în câteva minute.
Comenzi înrudite
log_format: Definește structura unei linii din access_log (timpi de răspuns din backend, stare cache, format JSON pentru ELK/Loki).nginx -s reload: Trimite un semnal procesului master Nginx: reload, stop, quit sau reopen.server: Definește un server virtual (un site) cu porturile, numele de domeniu și regulile sale.nginx.conf și sites-available: Cum sunt organizate fișierele de configurare: nginx.conf, include, conf.d, sites-available și sites-enabled.