До основного вмісту

Логи Nginx: формат access_log, ротація і розбір помилок

Nginx · 29.09.2026

Навіщо розбиратися в логах Nginx

Логи Nginx — перше місце, куди варто дивитися за будь-якої проблеми: повільний сайт, помилка 502, підозрілий сплеск трафіку. За замовчуванням сервер пише два файли: /var/log/nginx/access.log із кожним запитом і /var/log/nginx/error.log із помилками воркерів і бекенду.

Без налаштування формату та ротації логи швидко перетворюються на марне звалище: диск заповнюється, а знайти потрібний рядок серед мільйонів записів неможливо.

Формат access_log: що означають поля

Стандартний формат combined заданий у nginx.conf, але його варто розширити полем часу відповіді:

log_format extended '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'rt=$request_time uct=$upstream_connect_time urt=$upstream_response_time';

access_log /var/log/nginx/access.log extended;
ЗміннаЩо містить
$remote_addrIP-адреса клієнта
$statusКод відповіді: 200, 404, 502 і так далі
$request_timeПовний час обробки запиту Nginx
$upstream_response_timeЧас відповіді PHP-FPM або іншого бекенду

Поле rt — найкорисніше для діагностики: якщо request_time великий, а upstream_response_time малий, гальмує сам Nginx чи мережа, а не застосунок.

Як налаштувати ротацію логів

На Ubuntu та Debian ротацію логів Nginx зазвичай виконує logrotate через конфігурацію /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Сигнал USR1 змушує Nginx переоткрити файли логів без перезапуску воркерів — інакше після перейменування файлу запис триватиме у видалений inode, а новий файл залишиться порожнім.

Як швидко знайти потрібне в access.log

Часті запити для розбору логів — без спеціальних інструментів, лише grep і awk:

  • усі запити з кодом 502 за сьогодні: grep " 502 " access.log
  • топ-10 IP-адрес за кількістю запитів: awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
  • запити довші за 2 секунди: awk '$NF+0 > 2 {print}' access.log
  • кількість запитів за кодами відповіді: awk '{print $9}' access.log | sort | uniq -c

Що шукати в error.log

Файл error.log пише проблеми воркерів: помилки конфігурації, обриви з'єднань із бекендом, перевищення таймаутів. Рівень логування задає директива error_log /var/log/nginx/error.log warn; — для продакшену рівня warn достатньо, debug вмикають лише на час діагностики: він створює величезний обсяг записів.

Рядки виду upstream timed out і connect() failed вказують на проблему бекенду, а не самого Nginx — це привід перевірити PHP-FPM чи проксі-сервер.

Зберігання та аналіз у масштабі

Якщо сайтів і серверів декілька, ручний розбір логів через ssh перестає працювати. Логи варто надсилати в централізоване сховище: syslog, Loki чи Elasticsearch, — а на самому сервері зберігати лише останні 14 днів, щоб не забивати диск.

Підсумок

Чек-лист щодо логів Nginx:

  • розширити log_format полями request_time та upstream_response_time
  • налаштувати logrotate із сигналом USR1 для переоткриття файлів
  • тримати error_log на рівні warn у продакшені
  • шукати повільні та помилкові запити через awk і grep, перш ніж кликати розробника

Якщо в логах регулярно трапляються коди 502 і 504, розберіть окремо причини у статті діагностика 502 Bad Gateway та 504 Gateway Timeout, а для зв'язки з PHP подивіться налаштування Nginx і PHP-FPM.

← Назад до бази знань Поставити питання підтримці