Главная » Администрирование Linux и FreeBSD » Сервер перестал отвечать: как узнать, когда и почему

Сервер перестал отвечать: как узнать, когда и почему

Сайт не открывался, по SSH не подключиться, а через несколько минут всё заработало само. Или сервер пришлось перезагружать из панели провайдера, и теперь непонятно, что это было. Первый вопрос в такой ситуации — не «как починить», а «что произошло»: сервер завис, его выключили, его перезагрузил провайдер или он всё это время работал, но до него не доходила сеть. От ответа зависит, что делать дальше.

Коротко: время и характер сбоя восстанавливаются по трём источникам — записям о загрузках (last -x, journalctl --list-boots), журналу предыдущей загрузки (journalctl -b -1) и логу веб-сервера. Если штатного выключения не было, а в журнале ядра нет ни OOM, ни ошибок дисков, — почти всегда это внешняя причина: жёсткий сброс виртуальной машины или проблема на стороне провайдера.

Что проверить в первую минуту

Сначала убедитесь, была ли вообще перезагрузка. Если сервер не перезапускался, искать надо в сети, а не внутри системы.

uptime -s
who -b
2026-11-04 12:16:03
         system boot  2026-11-04 12:16

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

Затем список прошлых загрузок с полными датами:

last -x -F reboot shutdown
reboot   system boot  6.1.0-27-amd64   Wed Nov  4 12:16:03 2026   still running
reboot   system boot  6.1.0-27-amd64   Mon Oct 19 03:12:44 2026 - crash                    (16+09:03)
shutdown system down  6.1.0-27-amd64   Mon Oct 19 03:12:30 2026 - Mon Oct 19 03:12:44 2026  (00:00)

Здесь важно слово crash: так last помечает загрузку, после которой не было записи о штатном выключении (shutdown system down). Система не завершала работу сама — её сбросили, у неё пропало питание или она зависла и была перезапущена. Строка shutdown перед загрузкой, наоборот, говорит о нормальном выключении или перезагрузке.

В Debian 13 команд last и lastb больше нет: по примечаниям к выпуску их заменяет wtmpdb last из пакета wtmpdb (нужен и libpam-wtmpdb). Ключи -x и -F там те же. В Debian 12, Ubuntu 22.04/24.04 и AlmaLinux 9 last на месте. Если ни того ни другого нет, хватит журнала systemd — он даже точнее.

Журнал systemd: когда сервер перестал писать логи

Я обычно начинаю с этой команды — она сразу показывает время последней записи перед сбоем:

journalctl --list-boots
IDX BOOT ID                          FIRST ENTRY                 LAST ENTRY
 -1 5c1e0a7d9b2f4e6a8c3d1f0b7e9a2c45 Mon 2026-10-19 03:12:44 MSK Wed 2026-11-04 12:07:28 MSK
  0 b84f2d6e1a9c4c07a5e3f8d2c6b1e490 Wed 2026-11-04 12:16:03 MSK Sat 2026-11-07 10:41:12 MSK

Колонка LAST ENTRY у загрузки -1 — последняя строка, которую система успела записать. Между ней и FIRST ENTRY текущей загрузки и лежит окно сбоя. Если в списке только одна строка, журнал не сохраняется между перезагрузками: при Storage=auto он пишется на диск, только если существует каталог /var/log/journal. Включите хранение заранее (об этом ниже), иначе в следующий раз смотреть будет нечего.

Дальше — последние строки предыдущей загрузки:

journalctl -b -1 -n 50 --no-pager

При штатной перезагрузке хвост выглядит узнаваемо:

Oct 19 03:12:30 web1 systemd[1]: Reached target reboot.target - System Reboot.
Oct 19 03:12:30 web1 systemd[1]: Shutting down.
Oct 19 03:12:30 web1 systemd-shutdown[1]: Syncing filesystems and block devices.
Oct 19 03:12:30 web1 systemd-shutdown[1]: Sending SIGTERM to remaining processes...
Oct 19 03:12:30 web1 systemd-journald[312]: Received SIGTERM from PID 1 (systemd-shutdow).
Oct 19 03:12:30 web1 systemd-journald[312]: Journal stopped

Если провайдер «нажал кнопку питания» мягко (ACPI), перед этим будет строка systemd-logind[…]: Power key pressed short. Если же журнал обрывается на обычной рабочей записи — cron, PHP-FPM, что угодно — значит, система до выключения не дошла.

Ядро: OOM, зависания, ошибки дисков

Сообщения ядра предыдущей загрузки отдельно, с фильтром по типичным признакам беды:

journalctl -b -1 -k --no-pager | grep -Ei 'out of memory|oom|panic|blocked for more than|soft lockup|i/o error|hardware error'
Oct 28 21:48:42 web1 kernel: Out of memory: Killed process 2143 (mysqld) total-vm:2849532kB, anon-rss:1203448kB, file-rss:0kB, shmem-rss:0kB, UID:110 pgtables:3120kB oom_score_adj:0
Oct 28 21:53:10 web1 kernel: INFO: task php-fpm8.2:3391 blocked for more than 120 seconds.
  • Out of memory: Killed process — кончилась память, ядро убило процесс. Сам по себе OOM сервер обычно не роняет, но перед ним система может долго «молотить» и не отвечать.
  • blocked for more than N seconds — процесс не дождался диска. На виртуалке это часто проблемы хранилища у провайдера.
  • soft lockup — процессор долго не получал управления; на VDS бывает при перегрузке хоста.
  • I/O error — ошибки чтения или записи на диск.

Пустой результат — тоже результат. Учтите только, что при панике ядра или полном зависании запись на диск прекращается, и последних сообщений в журнале может не быть вовсе. Если сервер висел с паникой, видно это обычно только в консоли провайдера. О разборе одной из таких паник — в статье Kernel panic — not syncing: Attempted to kill init.

Кто выключал

Если выключение было штатным, проверьте, кто был в системе и кто запускал команды через sudo:

last -F | head -20
journalctl -b -1 _COMM=sudo --no-pager | tail -20

Лог nginx: когда перестали приходить запросы

Журнал системы показывает, когда сервер замолчал, а лог веб-сервера — когда перестали приходить посетители. Число запросов по минутам хорошо показывает разрыв:

awk '{print $4}' /var/log/nginx/access.log | cut -c2-18 | uniq -c | tail -20
     38 04/Nov/2026:12:05
     41 04/Nov/2026:12:06
     22 04/Nov/2026:12:07
      9 04/Nov/2026:12:16
     35 04/Nov/2026:12:17

Если сбой был давно, лог мог уйти в ротацию — смотрите access.log.1 или сжатые файлы через zcat. Сравнивая логи, проверьте, что часы на сервере идут верно: при расхождении времени выводы будут ложными (см. синхронизация времени в виртуальных машинах).

Как различить: завис, выключили, перезагрузил провайдер, пропала сеть

Что видно Что это значит Что делать
Время загрузки не менялось, журнал за время недоступности непрерывный, в access.log провал Сервер работал, пропала сеть: у провайдера, в маршрутизации или из-за фаервола Проверить фаервол и сетевые сообщения в журнале, написать провайдеру с точным временем
Перед загрузкой — Reached target reboot.target, Journal stopped, в last есть shutdown Штатная перезагрузка или выключение Искать, кто или что её запустило: sudo, автообновления, панель
Есть Power key pressed short. Выключение «кнопкой» из панели провайдера Проверить журнал действий в панели и уведомления провайдера
Журнал обрывается на обычной записи, crash в last, ошибок ядра нет Жёсткий сброс: провайдер, сбой хоста, пропало питание Запрос в поддержку с точным временем последней записи и загрузки
Перед обрывом — OOM, blocked for more than, soft lockup, I/O error Система зависла от нехватки памяти или проблем с диском Разбирать память и диски; при ошибках хранилища на VDS — к провайдеру

Полезная проверка после жёсткого сброса — не изменились ли ресурсы машины. Строка ядра Memory: пишется при каждой загрузке:

journalctl -b -1 -k --no-pager | grep -m1 'Memory:'
journalctl -b 0 -k --no-pager | grep -m1 'Memory:'
nproc

Если памяти или процессоров стало больше, провайдер менял тариф, а для этого машину часто перезапускают.

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

Самое ценное — проверить сервер в момент проблемы, пока его никто не перезагрузил. С другой машины, например со второго сервера:

ping -c 4 178.72.152.47
nc -vz -w 3 178.72.152.47 22
nc -vz -w 3 178.72.152.47 443
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' --max-time 10 https://www.example.com/
Connection to 178.72.152.47 22 port [tcp/ssh] succeeded!

Если порты отвечают, а сайт нет — проблема в веб-сервере или PHP, сервер жив. Если не отвечает ничего, проверьте из нескольких мест: сервисы проверки доступности (например, check-host.net) делают ping и TCP-проверку из десятка стран. Сервер недоступен отовсюду — проблема в нём или в сети провайдера. Недоступен только из части мест — дело в маршрутах или фильтрации по пути.

Если у Вас есть другой сервер в той же подсети, у того же провайдера, можно проверить ещё глубже — ответ на ARP:

ping -c 2 178.72.152.47
ip neigh show 178.72.152.47
178.72.152.47 dev eth0 FAILED

Состояние FAILED значит, что машина не ответила даже на ARP-запрос. Фаервол на ARP не влияет, поэтому это не закрытый порт, а выключенная или зависшая машина или оборванный канал до неё. REACHABLE или STALE с MAC-адресом при молчащем ping указывает на фильтрацию. Оговорка: метод работает, только если машины действительно в одном сегменте сети; в некоторых облаках на ARP отвечает сама сеть провайдера.

Случай из практики

VDS с сайтами стал недоступен из всех точек проверки примерно на девять минут, затем заработал сам. В журнале systemd последняя запись предыдущей загрузки — 12:07:28, последний запрос в access.log nginx — 12:07:31, новая загрузка — 12:16. Записей штатного выключения нет, last -x показал crash. Ни OOM, ни зависших задач, ни ошибок ввода-вывода в журнале ядра не было: система работала нормально и просто оборвалась.

Ответ нашёлся в строке Memory:: после загрузки у машины оказалось вдвое больше памяти — 4 ГБ вместо 2. Провайдер менял тариф и сделал это с жёсткой перезагрузкой, без корректного выключения гостевой системы. Вывод из таких данных — это гипотеза, и её надо подтвердить: в журнале действий панели или вопросом в поддержку с точным временем.

Как не гадать в следующий раз

  • Внешний мониторинг доступности. Проверка ping, порта 443 и страницы сайта раз в минуту с другой машины или из стороннего сервиса. Тогда момент падения и восстановления известен точно, а не по логам задним числом.
  • Сохраняемый журнал. Создайте /var/log/journal или задайте Storage=persistent в файле в /etc/systemd/journald.conf.d/, затем systemctl restart systemd-journald. Подробности — в man journalctl и journald.conf.
  • Поведение при панике. Проверьте sysctl kernel.panic: значение 0 значит, что после паники машина будет висеть до ручного сброса. Для сбора дампа при панике есть kdump (пакет kdump-tools в Debian и Ubuntu, служба kdump в AlmaLinux).
  • Запас по памяти. Если причиной был OOM, ограничьте потребителей: число процессов PHP-FPM и буферы базы данных (см. оптимизация MySQL 8 и MariaDB).
  • Уведомления провайдера. Включите письма о плановых работах и изменениях тарифа, проверьте, на какой адрес они приходят.

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

Почему journalctl —list-boots показывает только одну загрузку?

Журнал хранится в памяти (/run/log/journal) и пропадает при перезагрузке. При настройке Storage=auto он пишется на диск, только если есть каталог /var/log/journal. Включите постоянное хранение — прошлый сбой это не вернёт, но следующий будет виден.

Что значит crash в выводе last?

Для загрузки нет парной записи о штатном выключении: система не завершала работу сама. Причины бывают разные — жёсткий сброс, отключение питания, зависание с последующим перезапуском. Сам crash не говорит, какая именно; это видно по журналу ядра и данным провайдера.

Сервер не перезагружался, но был недоступен. Где искать?

Сравните журнал и access.log за это время. Если журнал писался непрерывно, а запросов не было, проблема была в сети: проверьте сообщения о сетевом интерфейсе в journalctl -k, правила фаервола и спросите провайдера, не было ли работ или атаки на сеть.

Можно ли узнать причину, если в журнале ничего нет?

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