Когда на VPS что-то ломается, проблема почти всегда оставляет след в логах. Журналирование подсказывает, что именно произошло, когда и на каком компоненте: ядро, сервисы systemd, веб-сервер, приложение, база данных, контейнеры. Задача в том, чтобы быстро собрать нужные фрагменты и не утонуть в шуме.
Ниже — практичная схема, где искать ошибки и сбои на типичном Linux-VPS, как фильтровать по времени и почему иногда “ничего не видно”.
Какие логи на VPS вообще бывают
На большинстве VPS встречаются несколько уровней журналов.
- Журналы самого хоста: systemd journal, syslog/rsyslog, kern.log, сообщения ядра.
- Журналы сервисов: nginx/apache, php-fpm, postgresql/mysql, redis, memcached, sshd.
- Журналы планировщика и сервисов поддержки: cron/systemd timers, logrotate, certbot/renewal.
- Логи приложений: файлы в директориях проекта или stdout/stderr контейнера/сервиса.
- Логи окружения: Docker/Podman (обычно через journal или отдельные механизмы), иногда — логи сетевого уровня.
Если вы знаете, какой компонент затронут (например, “не открывается сайт”), вы почти всегда начнёте с его логов. Если причина неизвестна, начинают с общих системных журналов и статуса сервисов.
systemd journal: главный источник для ошибок и падений сервисов
На многих VPS используется systemd, а значит основная точка входа — journalctl. Даже если сервис пишет в файлы, systemd часто фиксирует события старта/остановки, падения и коды ошибок.
Где смотреть journal и какие команды базовые
Основной командный инструмент — journalctl. Типовые сценарии:
- Просмотр логов текущей загрузки системы:
- journalctl -b
- Просмотр только ошибок и предупреждений:
- journalctl -b -p err
- journalctl -b -p warning
- Поиск по конкретному сервису:
- journalctl -u nginx —since «1 hour ago»
- journalctl -u php-fpm —since «today»
- Фильтрация по времени:
- journalctl —since «2026-05-25 10:00» —until «2026-05-25 10:30»
- Следить в реальном времени:
- journalctl -f -u nginx
Если вы ищете “сбой” (crash, restart, exit code), почти всегда полезно посмотреть историю перезапусков и выходов процесса.
Что делать, когда журнал огромный
Журнал может быстро разрастаться. Чтобы не тратить время на лишнее:
- ограничивайте период через —since/—until;
- фильтруйте по приоритету: err, warning, emerg;
- фильтруйте по unit: -u имя сервиса;
- используйте поиск по строке:
- — journalctl -u nginx —since «today»: grep -i «error»
Небольшая практика: сначала сужайте выборку по времени (когда начался сбой), потом — по сервису, и только затем углубляйтесь в детали.
Частые проблемы: нет логов, потому что они не пишутся
Иногда “логов нет” по простой причине: сервис не настроен на вывод в stdout/stderr или в systemd unit отсутствует запись. Для проверки смотрят настройки сервиса:
- systemctl status nginx
- systemctl cat nginx
Если падение происходит до старта логирования, единственным следом могут быть только события systemd (exit code, status=1). Поэтому полезно смотреть journal именно по unit.
Классические файлы логов: /var/log, syslog и kern.log
Даже если systemd доминирует, на многих VPS остаются традиционные логи в /var/log. Это бывает и потому, что некоторые компоненты пишут напрямую в файлы, и потому, что сохраняется привычная схема через rsyslog.
Где искать базовые системные сообщения
Чаще всего используют следующие пути:
- /var/log/syslog или /var/log/messages (зависит от дистрибутива)
- /var/log/kern.log (ядро, аппаратные сообщения)
- /var/log/auth.log (аутентификация, sudo, ssh)
- /var/log/daemon.log (разные системные демоны)
- /var/log/cron.log (cron)
Примеры поиска:
- Ошибки за сегодня:
- grep -i «error» /var/log/syslog
- Ошибки авторизации:
- grep -i «authentication failure» /var/log/auth.log
- Сообщения ядра:
- grep -i «error» /var/log/kern.log
Если вы не знаете, что именно за сервис пишет в файлы, проще начать с journalctl по unit и посмотреть, есть ли ссылка на путь логов в конфиге.
Как не попасть в ловушку с ротацией логов
Ротация (logrotate) может переносить старые файлы в .1, .2.gz и т.д. Тогда “ранние ошибки” не найдутся в текущем файле.
Признаки проблемы:
- вы ищете нужную дату, а в текущем лог-файле её нет;
- есть только свежие записи.
Решение:
- проверить наличие архивов: ls -lah /var/log/nginx
- искать по архивам с zgrep:
- zgrep -i «error» /var/log/nginx/error.log.1.gz
Ошибки веб-сервера: nginx и Apache
Для сайтов типичный сценарий выглядит так: браузер показывает ошибку, а сервер фиксирует её в access/error логах. На VPS это один из самых быстрых способов найти причину.
nginx: где искать ошибки и причины 4xx/5xx
Обычно в nginx есть два ключевых файла:
- access.log: запросы (статусы, время, адрес)
- error.log: ошибки (включая конфиги, upstream, таймауты)
Типовые действия:
- Посмотреть последние ошибки:
- tail -n 200 /var/log/nginx/error.log
- Найти ошибку по времени (если знаете примерный интервал):
- grep «2026/05/25» /var/log/nginx/error.log
- Проверить, что было с конкретным upstream:
- grep -i «upstream» /var/log/nginx/error.log
Для разборов проблем с php часто важны сообщения про fastcgi_pass и таймауты.
nginx: полезно смотреть конфиги и уровень логирования
Если error.log пустой, причина может быть в уровне логирования в конфиге nginx. Обычно это настраивается директивой error_log.
Смотрите, что реально используется:
- — nginx -T: grep -n «error_log»
Если конфиг менялся перед сбоем, проверьте, не переключили ли уровень на “слишком тихий”.
Apache: где смотреть error_log и что добавить для диагностики
В Apache аналогично: есть errorlog и accesslog. Пути зависят от дистрибутива и конфигурации, но обычно это /var/log/apache2/error.log или /var/log/httpd/error_log.
Практика:
- Последние ошибки:
- tail -n 200 /var/log/apache2/error.log
- Быстро найти строки про конкретный модуль:
- grep -i «php» /var/log/apache2/error.log
- Для проблем конфигурации полезны строки вида syntax error, unknown directive, module not found.
Если сбой случился сразу после деплоя, часто там же будут следы: неверный конфиг, не найден include, проблемы с правами на файлы.
php-fpm и приложения на PHP: журналировать так, чтобы было видно сбои
Когда сайт на PHP падает, nginx и systemd покажут симптомы, но истинная причина чаще в php-fpm. Там бывают таймауты, нехватка процессов, ошибки конфигурации и падения воркеров.
Где обычно смотреть логи php-fpm
Точки зависят от версии и сборки, но часто используются:
- /var/log/php8.x-fpm.log
- либо journalctl -u php-fpm
Практика с systemd (удобно, если сервис единый):
- — journalctl -u php8.2-fpm —since «today»: tail -n 200
- journalctl -u php-fpm —since «1 hour ago»
Что искать в ошибках php-fpm
Паттерны, которые помогают быстро ориентироваться:
- timeout / upstream timed out
- primary script unknown / file not found (ошибки путей)
- child exited / pool has reached max children (исчерпание процессов)
- permission denied (права на директории, сокеты, файлы)
Если у вас есть только общий nginx error.log, но нет php-fpm логов, полезно проверить, включён ли вывод ошибок в php-fpm и не “глушится” ли журналирование.
Журналы баз данных: PostgreSQL, MySQL, MariaDB, Redis
При сбоях в базе симптомы часто выглядят одинаково на уровне приложения: таймауты, 5xx, долгие ответы. Но первопричина обычно читается в логах самой БД.
PostgreSQL: что обычно важно
Для PostgreSQL логов несколько сценариев: конфигурация может писать в файл или через systemd/journald. Обычно ищут в:
- каталоги с log в настройках PostgreSQL
- либо journalctl -u postgresql
Практика:
- — journalctl -u postgresql —since «today»: tail -n 200
- если есть файлы, то смотреть последние error/warning.
Важные признаки:
- deadlock detected (если проблема с конкурентностью)
- timeout / terminating connection due to statement timeout
- connection problems и ошибки WAL/репликации (если настроены)
MySQL/MariaDB: где смотреть ошибки соединения и запросов
Для MySQL/MariaDB также бывает сочетание файла и journald. В первую очередь ищут:
- ошибки сервера (ошибки диска, повреждение, нехватка ресурсов)
- проблемы соединений (max connections, handshake, auth plugin)
- slow query log (если включён)
Если приложение начинает “тормозить”, slow query log часто даёт больше пользы, чем просто error.log.
Redis: ошибки памяти и сетевые проблемы
Redis чаще всего сообщает:
- OOM / out of memory
- connection errors
- maxmemory policy / eviction
Ищут через:
- journalctl -u redis-server —since «today»
- или файлы, указанные в конфиге redis.
Отдельный практический момент: когда Redis начинает сбрасывать ключи из-за политики памяти, на уровне приложения это может выглядеть как “случайные ошибки”, хотя причина одна.
sshd, auth и доступ: когда “сбои” на самом деле проблемы доступа
Не каждый сбой — это падение сервисов. Иногда система работает, но вы не можете войти, не работает деплой, не доступны репозитории или ключи. Тогда в ход идут журналы аутентификации.
Где смотреть попытки входа и сбои
Типовые файлы:
- /var/log/auth.log
- иногда /var/log/secure
Примеры поиска:
- неудачные входы:
- grep -i «Failed password» /var/log/auth.log
- grep -i «authentication failure» /var/log/auth.log
- успешные входы:
- grep -i «Accepted» /var/log/auth.log
- события sudo:
- grep -i «sudo» /var/log/auth.log
Почему sudo и ключи могут “внезапно сломаться”
Частые причины:
- права на home и .ssh/authorized_keys стали неправильными;
- поменялись пользователи/группы;
- обновление конфигов sshd изменило политику (например, запрет паролей);
- закончились ключи деплоя или изменились строки authorized_keys.
Слои ошибок обычно видно в auth.log раньше, чем вы успеете заметить “просто не работает”.
Cron, systemd timers и фоновые задачи
Если у вас периодические задания (обновления, бэкапы, очистка очередей), сбой может происходить не постоянно, а “пачками”. В таком случае ключ к диагностике — найти конкретный тайминг.
Где искать cron-ошибки
Пути зависят от системы, но часто:
- /var/log/cron.log
- /var/log/syslog (cron сообщения там тоже бывают)
Поиск:
- grep CRON /var/log/syslog
- grep -i «error» /var/log/cron.log
systemd timers: что смотреть
Если вместо cron используются systemd timers, удобно смотреть:
- systemctl list-timers —all
- — journalctl —since «today»: grep -i «timer» (или по unit конкретного задания)
Ещё один полезный ход: если задания вызывают скрипт, их ошибки чаще всего печатаются в stderr/stdout. Тогда они попадают в journal и их можно фильтровать.
Сеть, firewall и маршрутизация: логи, которые объясняют “похоже, что не работает”
Иногда сайт “не открывается” из-за сетевых ограничений: firewall, неправильные правила, блокировки по стране/диапазону, лимиты на уровне провайдера. В таких случаях полезны сетевые логи.
Где искать события firewall
Если используется UFW:
- — journalctl —since «today»: grep -i «ufw»
Если nftables/iptables напрямую:
- — journalctl —since «today»: grep -i «nft»
- либо смотрят kern.log и сообщения ядра (зависит от настройки)
Если вам нужно “быстро понять” — смотрите записи, где есть действие блок/accept и источник/назначение. Точные пути и названия зависят от того, как именно настроен VPS, но ядро и system journal обычно дадут направление.
Типичные сетевые симптомы в логах
- connection refused (порт не слушает или firewall блокирует)
- timeout (маршрут/фильтрация/ресурсные проблемы)
- reset by peer (часто конкретный сервис закрывает соединение)
- слишком много rejections (правила применяются слишком широко)
Сопоставляйте время с тем, когда вы наблюдали проблему. Если “в 12:05 всё упало”, лог должен показать изменения примерно в этот интервал.
Ядро и аппаратные ошибки: dmesg и kern.log
Когда проблема серьёзнее обычной ошибки приложения, это может быть диск, память, сетевой интерфейс или подсистема хранения. Ядро фиксирует такие события.
Где смотреть kernel messages
- dmesg (показывает текущую кольцевую буферизацию ядра)
- /var/log/kern.log (если настроено)
Практика:
- — dmesg: grep -i «error»
- tail -n 200 /var/log/kern.log
Если система перезагружалась, dmesg может не сохранить исторические записи до полной перезаписи буфера. Тогда более надёжно смотреть journald и kern.log, если журнал сохраняется.
На что обращать внимание
- ошибки I/O (диск, файловая система)
- сообщения про OOM killer (убийство процессов из-за памяти)
- ошибки драйверов (сетевые карты, блочные устройства)
- watchdog reset (если есть перезапуск из-за зависаний)
Это как раз те случаи, когда приложение “вроде бы ни при чём”, но перезапуски повторяются и падают один за другим.
Контейнеры и логи Docker/Podman: где искать, когда процессы живут не на “голом” хосте
Если на VPS используются контейнеры, “где смотреть ошибки” меняется. Часть логов остаётся в journald, часть — в Docker logs, часть — внутри контейнера.
Быстрый старт: логи контейнера
Обычно используют:
- docker ps
- docker logs <containeridor_name> (с опциями времени, если доступны в вашей версии)
Если контейнер перезапускается, полезно посмотреть последние строки и понять, почему он падает:
- docker logs —tail 200 <container>
Как связать логи контейнера с сервисом на хосте
Иногда контейнер запускается через systemd unit или compose. Тогда вы снова приходите к systemd journal:
- journalctl -u <unit> —since «today»
Часто именно там видно цепочку: “контейнер не поднялся → сервис перезапускается → приложение не отвечает”.
Типичные ошибки в контейнерных логах
- логирование отключено в приложении, а контейнер пишет пусто;
- приложение пишет в файл внутри контейнера, но вы не монтировали volume, поэтому файлы исчезают при пересоздании;
- коды ошибок есть, но в логах не настроены уровни и нет понятных строк (например, нет traceback).
Если вы проектируете запуск контейнера, удобно заранее настроить вывод ошибок в stderr, чтобы они попадали в docker/journal.
Как искать причину: рабочий порядок действий при “сбой начался сейчас”
Когда инцидент происходит, важна последовательность. Иначе вы будете смотреть всё подряд и ничего не найдёте.
Шаг 1. Зафиксируйте интервал
Сначала оцените, когда началось: по наблюдению пользователей, метрикам, событиям мониторинга. Затем используйте временные фильтры в journalctl и grep.
Примеры:
- journalctl —since «15 minutes ago» -p err
- — grep -i «error» /var/log/nginx/error.log: tail
Шаг 2. Определите затронутый компонент
Если сайт не отвечает — nginx + php-fpm + приложение. Если отвечает, но выдаёт ошибки — часто приложение и база. Если не можете войти — auth/ssh.
Это экономит много времени: один час чтения лога “в целом” почти всегда хуже, чем 10 минут по конкретному сервису.
Шаг 3. Снимите “верхушку” проблем
Для быстрых выводов:
- посмотрите последние ошибки (tail)
- отфильтруйте по err
- проверьте exit code и перезапуски (systemd unit)
Шаг 4. Ищите связующие строки
Чтобы связать симптомы и причину, ищите уникальные маркеры:
- request id / correlation id (если приложение поддерживает)
- upstream name и upstream timeout
- конкретные пути файлов и имена модулей
- номера версий/коммитов, если деплой пишет в лог
Если корреляции нет, её можно наладить позже, но для текущего инцидента иногда достаточно совпадения по времени и общей фразы.
Полезные приёмы: grep, journalctl, tail и “чтение без паники”
Логи — это текст. Значит, вам нужны инструменты, которые позволяют не терять контекст.
Сочетание journalctl и grep
- — journalctl -u nginx —since «today»: grep -i «upstream timed out»
- — journalctl -p err —since «today»: grep -i «fatal»
Если grep сработал, выпишите 2-3 строки вокруг находки (не только одну). Так обычно видно цепочку: сначала warning, потом error.
tail -f для живого следа
Когда вы воспроизводите проблему (например, отправляете запрос), запускайте:
- tail -f /var/log/nginx/error.log
или
- journalctl -f -u php-fpm
Это помогает поймать момент, когда ошибка возникает, и не поднимать архивы.
Ошибка: искать по “error” слишком буквально
Проблемы бывают с другой формулировкой: fatal, panic, crash, refused, timeout, segfault. Слепой grep по error может дать ложное ощущение “всё чисто”.
Лучше составить несколько поисковых слов под ваш стек:
- для веба: 502, timeout, upstream, connect() failed
- для PHP: PHP Fatal, child exited, max children
- для БД: deadlock, timeout, terminating connection
- для системы: OOM, killed process, segfault, watchdog
Почему “ошибки есть”, но вы их не видите
Иногда в момент сбоя логов нет не потому, что всё хорошо, а потому что журналирование настроено неудачно.
Типичные причины
- неверный путь к логам (смотрите не тот файл, либо он не обновляется);
- лог-файл не существует, потому что нет прав на запись;
- логирование направлено в stdout/stderr, но вы смотрите только файлы;
- включена слишком строгая фильтрация по уровню (например, error_log на слишком низком уровне);
- ротация быстро “выносит” нужные записи;
- приложение пишет в файл внутри контейнера без volume, и при перезапуске всё пропадает.
Если вы подозреваете такую ситуацию, начните с systemd status и unit конфигов, а затем сверяйте, куда направлены выводы.
Настройка журналирования: как сделать так, чтобы потом не искать вслепую
После того как инцидент закрыт, полезно сделать настройку логирования более удобной. Цель не в “написать больше”, а в “писать так, чтобы быстро найти причину”.
Что можно улучшить на уровне сервисов
- убедитесь, что systemd unit получает stdout/stderr приложения;
- настройте разумные уровни логов для nginx/php-fpm;
- включите корреляцию request id в приложении (если оно поддерживает);
- настройте ротацию логов так, чтобы не потерять ключевой период.
Частая ошибка: хранить бесконечно и не утилизировать
Если не настроена ротация или ограничения, диск может закончиться. Тогда вы получите новый инцидент: система перестанет писать логировать и даже сервисы могут упасть из-за нехватки места.
Поэтому ориентир простой: ротация должна быть, а размер логов — ограничен.
Чек-лист: где смотреть ошибки и сбои на VPS (быстро по приоритету)
Если нужно действовать быстро, держите порядок.
- systemd journal:
- journalctl -b -p err
- journalctl -u <сервис> —since «<интервал>»
- веб-слой:
- nginx: /var/log/nginx/error.log и access.log
- apache: /var/log/apache2/error.log (или аналог)
- php-fpm:
- journalctl -u php-fpm (или php8.x-fpm)
- база данных:
- journalctl -u postgresql/mysql/redis (в зависимости от стека) или файлы логов БД
- доступ/ssh:
- /var/log/auth.log или /var/log/secure
- фоновые задачи:
- /var/log/cron.log или journalctl по unit timers
- ядро/диск/память:
- /var/log/kern.log и dmesg для OOM, I/O error, перезапусков
- контейнеры:
- docker logs + journalctl по unit, через который они запускаются
Если вы делаете всё по этому списку и не находит причину, значит проблема может быть “на границе”: в лимитах (CPU/IO), в конфигурации (не тот порт/сокет), или в отсутствии логирования внутри приложения.
Как сформировать запрос “посмотрите логи” так, чтобы вам реально помогли
Если вы работаете в команде или отдаёте проблему специалисту, формат имеет значение. Полезный пакет обычно содержит:
- интервал времени сбоя (например, “с 12:05 до 12:20 МСК”);
- затронутый сервис/endpoint (например, “/login на сайте”);
- последние N строк error логов (nginx/apache/php-fpm/БД);
- фрагмент journalctl по unit с —since/—until;
- признак воспроизводимости (падает постоянно или раз в день/по расписанию).
Так вы ускоряете диагностику и избегаете ситуации, когда в ответ приходит вопрос “а где это смотреть”.
Заключение
Чтобы находить ошибки и сбои на VPS, важно знать не один “правильный файл”, а несколько источников и порядок, в котором их проверять. Начинайте с systemd journal по времени и unit — это чаще всего даёт точный контекст падений. Затем переходите к логам веб-сервера, php-fpm, базы и доступа, а при признаках нестабильности системы — к ядру и kern.log.
Соберите для своего VPS небольшой персональный сценарий: какие unit у вас есть, где лежат nginx/apache/php-fpm логи, и как быстро отфильтровать записи по интервалу. В следующий раз, когда “вдруг перестало работать”, вы будете разбирать проблему не часами, а минутами.

