Перейти к содержимому

Журналы сервера - где лежат, что смотреть, ротация

Разбираемся с журналами веб-окружения: где лежат логи веб-сервера, PHP и базы, как найти в них конкретную ошибку сайта и как не дать журналам занять весь диск.

Что нужно знать заранее

Журналов на сервере несколько, и каждый отвечает за свой слой работы сайта. Ошибку покупателя видно в журнале веб-сервера, причину сбоя кода - в журнале PHP, а медленный отчёт - в журнале базы данных.

Пути к журналам задаются конфигурацией сервера, а не догадками по чужой документации. В веб-окружении у каждого сайта пула свой конфиг, и путь журнала прописан именно в нём.

Ошибку ищут сразу по двум признакам: по времени запроса и по его адресу. Совпадение секунды и адреса превращает три журнала в одну связную историю: запрос пришёл, обработчик упал, пользователь увидел ошибку.

Шаги

  1. Найти в конфигурации веб-сервера реальные пути журналов доступа и журналов ошибок.
  2. Посмотреть последние записи журнала ошибок и запомнить точное время нужного сбоя.
  3. Связать запись с журналом PHP по времени и по адресу того же запроса.
  4. Включить журналы медленных запросов PHP и базы, если сайт стал тормозить.
  5. Проверить ротацию журналов и посмотреть, сколько места они занимают на диске.

Решение

Находим настоящие пути журналов:

Окно терминала
grep -rn 'access_log\|error_log' /etc/nginx/ | grep -v '#' | head
ls -lh /var/log/nginx/ /var/log/php-fpm/ 2>/dev/null
# в веб-окружении у каждого сайта пула свой конфиг и свой журнал

Список конфигов важнее общего каталога журналов. Сайт из пула часто пишет в отдельный файл, и разбор чужого журнала уводит на полчаса в сторону.

Смотрим ошибки веб-сервера за последние минуты:

Окно терминала
tail -n 200 /var/log/nginx/error.log
grep -c ' 502 ' /var/log/nginx/access.log # сколько раз упал обработчик PHP
awk '$9 >= 500 {print $4, $7, $9}' /var/log/nginx/access.log | tail -20
# четвёртое и седьмое поля - это время запроса и его адрес

Ответы с кодом 502 и 504 почти всегда указывают не на веб-сервер. Первый означает упавший обработчик PHP, второй - обработчик, не уложившийся в отведённое время.

Связываем ошибку сайта с журналом PHP:

Окно терминала
systemctl list-units --type=service | grep -i php # точное имя службы в окружении
journalctl -u bx-php-fpm --since '30 min ago' | tail -40
grep -F '25/Aug/2026:22:15' /var/log/php-fpm/*.log
# ошибку ищут по той же минуте, что и запись веб-сервера

Имя службы обработчика в окружении отличается от привычного. Поэтому его сначала уточняют списком служб, а уже потом читают журнал через системный сборщик сообщений.

Включаем журнал медленных запросов PHP:

; в конфигурации пула, например /etc/php-fpm.d/bx.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s ; сохранять стек запросов дольше пяти секунд

Журнал медленных запросов пишет стек вызовов, а не только адрес. Это единственный способ увидеть, в какой строке кода сайт проводит свои пять секунд.

Смотрим медленные запросы базы:

SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';
-- разбор накопленного журнала: mysqldumpslow -s t -t 20 <файл>

Проверяем ротацию и размер журналов:

Окно терминала
du -sh /var/log/nginx /var/log/php-fpm /var/log/mysql 2>/dev/null
logrotate -d /etc/logrotate.d/nginx # проверка правил без выполнения
find /var/log -type f -size +500M -printf '%s %p\n' | sort -rn | head
# журнал без ротации растёт до конца диска и роняет сайт целиком

Типичные проблемы

В журнале нет ни одной записи о сбое.

Сайт пишет в собственный журнал пула, а читается общий журнал веб-сервера. Путь берут из конфига конкретного сайта, а не из каталога по умолчанию.

Ошибка 502 есть, а причины в журнале не видно.

Причина отказа лежит в журнале обработчика PHP, а не в журнале веб-сервера. Записи связывают по времени: веб-сервер пишет отказ, обработчик - упавший процесс.

Место на диске кончилось за одну ночь.

Журнал вырос без ротации после всплеска ошибок или сканирования сайта ботами. Ротацию настраивают заранее и ограничивают в ней и размер файла, и число копий.

Журнал медленных запросов пуст, а сайт тормозит.

Порог записи выше реального времени ответа либо журнал не включён вовсе. Порог ставят около секунды и обязательно перезапускают службу после правки её конфигурации.

Записи журнала обрываются на середине дня.

Ротация выполнилась, а служба продолжила писать в уже переименованный ею старый файл. В правилах ротации не хватает перезагрузки службы после смены файла.

Частые вопросы

Где лежат журналы сайта в веб-окружении?

Путь прописан в конфиге конкретного сайта пула, а не в общем каталоге журналов. Его находят поиском директив журнала в каталоге конфигурации веб-сервера.

Чем 502 отличается от 504?

Первый означает упавший обработчик PHP, второй - обработчик, не уложившийся в отведённое время. Причину в обоих случаях ищут в журнале обработчика, а не веб-сервера.

Как поймать медленную страницу?

Журналом медленных запросов PHP с порогом в несколько секунд: он пишет стек вызовов. Адрес из журнала веб-сервера показывает только страницу, но не место в коде.

Сколько хранить журналы?

Обычно две-четыре недели: этого хватает для разбора и не занимает диск. Точный срок задают в правилах ротации вместе с ограничением числа файлов.

Куда писать журнал своего кода?

В отдельный файл проекта, а не в общий журнал сервера. Тогда его ротация настраивается своим правилом и не мешает разбору системных ошибок.

Смежное

Первоисточник