Error Log #
Error log mencatat masalah yang Nginx temui saat beroperasi — dari syntax error di konfigurasi, koneksi ke backend yang gagal, file yang tidak ditemukan, hingga peringatan internal. Berbeda dari access log yang mencatat semua request, error log hanya mencatat kondisi abnormal.
Level Severity #
Nginx menggunakan delapan level severity, dari yang paling kritis hingga paling verbose:
emerg → Sistem tidak bisa digunakan (sangat jarang, kondisi kritis)
alert → Perlu tindakan segera
crit → Kondisi kritis
error → Error yang menyebabkan request gagal
warn → Peringatan, tidak memblokir tapi perlu diperhatikan
notice → Kondisi normal tapi signifikan
info → Informasi umum
debug → Detail debugging (sangat verbose, jangan di production)
Saat kamu set level tertentu, Nginx juga mencatat semua level di atasnya. warn berarti: catat warn, error, crit, alert, dan emerg — tapi tidak notice, info, atau debug.
Konfigurasi error_log #
# Di level global (main context) — berlaku untuk semua
error_log /var/log/nginx/error.log warn;
http {
# Di level http — override untuk traffic HTTP
error_log /var/log/nginx/http-error.log warn;
server {
# Per virtual host
error_log /var/log/nginx/example.com-error.log warn;
}
}
Level yang disarankan untuk production adalah warn — cukup verbose untuk menangkap masalah nyata tanpa terlalu banyak noise dari pesan informasional.
Level debug hanya untuk debugging sementara karena sangat verbose dan berdampak signifikan pada performa. Nginx perlu dikompilasi dengan flag --with-debug untuk menggunakannya.
Anatomi Pesan Error #
2024/01/15 10:30:45 [error] 1234#1234: *42 connect() failed (111: Connection refused) while connecting to upstream, client: 203.0.113.42, server: example.com, request: "GET /api/users HTTP/1.1", upstream: "http://127.0.0.1:3000/api/users", host: "example.com"
Membaca pesan ini:
2024/01/15 10:30:45 → Waktu kejadian
[error] → Level severity
1234#1234 → PID worker # connection ID
*42 → ID request internal Nginx
connect() failed ... → Pesan error utama
client: ... → IP klien yang memicu error
server: ... → Virtual host yang terlibat
request: ... → Request yang menyebabkan error
upstream: ... → Backend yang gagal dihubungi
Pesan Error yang Umum dan Artinya #
connect() failed (111: Connection refused)
Backend tidak bisa dihubungi. Kemungkinan: proses aplikasi tidak berjalan, salah port, atau firewall memblokir.
no live upstreams while connecting to upstream
Semua server dalam upstream group ditandai sebagai down. Cek apakah semua backend hidup.
upstream timed out (110: Connection timed out)
Backend tidak merespons dalam proxy_read_timeout. Mungkin backend lambat atau terjebak.
(13: Permission denied) while reading response header from upstream
SELinux memblokir Nginx mengakses socket atau port. Cek ausearch -c nginx.
open() "/var/www/html/missing.html" failed (2: No such file or directory)
File yang diminta tidak ada. Bisa 404 normal, atau root/alias yang dikonfigurasi salah.
client intended to send too large body
Request body melebihi client_max_body_size. Naikkan nilainya jika legitimate.
SSL_do_handshake() failed
Masalah TLS handshake. Cek sertifikat, versi TLS, dan cipher yang dikonfigurasi.
Debug Satu Request Tanpa Banjiri Log #
Untuk debugging tanpa mengaktifkan debug logging global (yang sangat verbose), kamu bisa mengaktifkan debug hanya untuk IP tertentu:
error_log /var/log/nginx/error.log;
events {
# Debug hanya untuk IP ini — sangat berguna untuk debugging production
debug_connection 203.0.113.42;
debug_connection 10.0.0.0/24;
}
Dengan ini, Nginx mencatat debug log hanya untuk koneksi dari IP yang ditentukan. Log untuk IP lain tetap menggunakan level normal.
Cek Error Log Secara Efektif #
# Ikuti error log secara real-time
sudo tail -f /var/log/nginx/error.log
# Filter hanya level error ke atas
sudo grep '\[error\]\|\[crit\]\|\[alert\]\|\[emerg\]' /var/log/nginx/error.log
# Lihat error dalam 1 jam terakhir
sudo awk -v d="$(date -d '1 hour ago' '+%Y/%m/%d %H:%M')" '$0 >= d' \
/var/log/nginx/error.log | grep '\[error\]'
# Hitung jenis error yang paling sering muncul
sudo grep '\[error\]' /var/log/nginx/error.log | \
grep -oP 'while \K[^,]+' | sort | uniq -c | sort -rn | head -10
Ringkasan #
- Gunakan level
warnuntuk production — tangkap masalah nyata tanpa terlalu banyak noise.- Level
debugsangat verbose dan berdampak performa — gunakan hanya sementara, atau gunakandebug_connectionuntuk debug per-IP.- Pesan error selalu menyertakan IP klien, server block, request, dan upstream terkait — baca seluruh baris, bukan hanya pesan utamanya.
connect() failed (111)= backend tidak jalan;timed out (110)= backend lambat;Permission denied (13)= SELinux.- Error log per virtual host memudahkan triage saat ada banyak site di satu server.