Почему сайт получает ошибки 500 и как их исправить
Практическое руководство по первичной диагностике ошибок 500: как отличить причину, проверить логи и найти сбой.

Почему сайт получает ошибки 500 и как их исправить: практическое руководство по первичной диагностике
Ошибка 500 — это проблема, из-за которой сайт выглядит сломанным, но не объясняет почему. Браузер показывает одно сухое сообщение, посетитель упирается в тупик, а настоящая причина чаще всего скрыта в другом месте. Поэтому вопрос о том, почему сайт получает ошибки 500 и как их исправить, превращается не в угадайку, а в пошаговую диагностику, где важно сразу понять ошибка 500 как исправить без лишних кругов поиска.
Начните с одного правила: не считайте каждую некрасивую страницу ошибки настоящей серверной ошибкой 500. 502, 503, таймаут шлюза или фирменная страница Cloudflare от прокси могут выглядеть настолько похоже, что запутают даже опытную команду. Неправильная метка легко отнимает час, а в реальности нужно сначала определить 500 internal server error причины, а уже потом выбирать решение.
1. Убедитесь, что это действительно серверная ошибка 500
Откройте страницу в приватном окне и запишите точную формулировку. Простая ошибка на стороне источника обычно пишет «500 Internal Server Error» или что-то столь же общее, тогда как прокси-слой может показывать собственный код, ID запроса или сообщение о вышестоящем сервере. Эта небольшая разница важна, потому что 502 обычно указывает на неверный ответ шлюза, а 503 — на временную недоступность сервиса.
Проверьте ответ хотя бы двумя способами: в браузере и через запрос из командной строки, если такой вариант есть. Если браузер показывает 500, а сервер на границе на самом деле возвращает 502, вы можете искать не в той системе. От источника зависит и решение.
Cloudflare, Fastly, nginx, Apache и ваше приложение могут по-разному отмечать сбой. Один сайт покажет аккуратную страницу CDN с меткой 5xx, а другой — пустой белый экран и короткую строку в HTML-основе. Симптом один, источник разный, поэтому сначала важно как найти причину ошибки 500 на сайте, а уже потом переходить к правкам.
2. Воспроизведите ошибку в контролируемых условиях
Проверяйте точный URL, который ломается, а не только главную страницу. Ошибка 500 на /checkout может быть вызвана одним полем формы, одним хуком плагина или одним правилом маршрутизации, в то время как главная страница работает нормально. Если проблема появляется только на одном URL, круг поиска сразу сужается.
Повторите запрос по трем параметрам: браузер, устройство и время. Если в Chrome на компьютере ошибка есть, а на мобильном Safari её нет, возможно, вы столкнулись со специфическим путём выполнения скрипта или с редким случаем кеша. Если сбой появляется только после импорта рассылки или в 2 часа ночи, сам момент тоже является подсказкой.
Делайте тест максимально простым. Один запрос, одно изменение, один результат. Затем попробуйте тот же URL в другом состоянии входа, потому что авторизованные пользователи иногда попадают в такие ветки кода, до которых гости вообще не доходят. Особенно часто это встречается на сайтах с админ-панелями или личными кабинетами.
Ведите простой журнал: URL, время, действие и ответ. Четырех полей достаточно. Когда у вас накопится 3–4 записи, начнут проявляться закономерности.
3. Проверьте журнал ошибок веб-сервера и найдите первую точку сбоя
Журнал ошибок обычно — первое место, куда стоит смотреть после того, как страница дважды упала. Сопоставьте время ошибки 500 с ближайшей записью в логе, а затем прочитайте строку до неё и строку после неё. Первая строка часто сообщает больше, чем любая страница ошибки.
Ищите имя скрипта, модуля, предупреждение о правах доступа или таймаут вышестоящего сервера. Фатальная ошибка PHP может прямо назвать файл. Ошибка веб-сервера может упоминать отсутствующий каталог, неверную цель rewrite или отказ в подключении к backend-процессу.
Полезная привычка: копируйте точную метку времени неудачного запроса и сверяйте её с access-логами и error-логами. Если сайт загружен, «ближайшее» событие может всё равно отличаться на несколько секунд, поэтому проверьте ещё и путь запроса, и код статуса. Один request ID, если ваш стек его добавляет, может сэкономить долгий поиск.
Если в логе указан плагин, библиотека или модуль, остановитесь на этом месте на минуту. Посмотрите на окружающий контекст. Строка про «allowed memory size exhausted» указывает на нехватку ресурсов, а строка «permission denied» — на проблемы с владельцем или режимом доступа, даже если наружу обе ошибки выглядят как 500.
4. Проверьте триггеры, связанные с лимитами ресурсов и таймаутами
Ошибки 500 часто появляются, когда серверу не хватает чего-то базового. Памяти — в первую очередь. Времени выполнения — во вторую. Количества рабочих процессов — в третью. Когда любой из этих ресурсов исчерпан, запрос может завершиться раньше, чем страница успеет собраться.
Классический пример — нехватка памяти PHP. Экспорт отчёта, изменение размера изображения или импорт товаров может потребовать больше памяти, чем доступно процессу, и результатом будет 500 вместо аккуратного предупреждения. Если сбой начинается на больших запросах и исчезает при снижении нагрузки, это сильный подозреваемый.
Проверьте и лимиты времени выполнения. Скрипт, который слишком долго крутится, может упереться в таймаут и оставить сервер разбираться с последствиями. Такое случается во время импорта, задач cron или при медленном обращении к API, которое ждёт другой сервис. Одной медленной зависимости достаточно.
Перегрузка worker-процессов или процессов выполнения заметнее всего ускользает от внимания, потому что при небольшой нагрузке сайт выглядит здоровым. Потом одновременно приходят 20 запросов, очередь заполняется, и новые запросы начинают падать. Некоторые тарифы хостинга ещё и вводят лимиты на уровне аккаунта — по CPU, входящим процессам или I/O — так что проблема может быть в самом плане, а не в коде.
Если у вас есть мониторинг, посмотрите, растёт ли число 500 вместе со всплесками трафика. Ошибка 500, которая появляется только во время кампании, релиза или окна бэкапа, часто оказывается проблемой нагрузки под другим названием. Здесь может помочь то, что изменилось в мониторинге сайта после, — это подскажет, какой тип оповещений понадобится дальше.
5. Проверьте права на файлы и папки вне CMS
Не каждая ошибка 500 исходит от приложения. Файлы могут оказаться в собственности не того пользователя после деплоя, синхронизации или миграции. Права на папки тоже могут сместиться. Один изменённый режим каталога может заблокировать запись в кэш, логи или загрузки и вызвать сбой в момент запроса.
В первую очередь проверьте те места, о которых обычно забывают: uploads, временные файлы, конфигурации, артефакты деплоя и каталоги логов. Если один из этих путей недоступен для записи пользователю веб-сервера, сайт может упасть в тот момент, когда попытается записать session-файл или создать запись кэша. Маленькая проблема с громким результатом.
Проблемы с владельцем особенно часто встречаются после миграции с одного хоста на другой. У файла могут быть правильные биты прав, но неправильный владелец, и это всё равно блокирует процесс. Именно такие детали заставляют 500 выглядеть иррационально, пока вы не посмотрите за пределы CMS и не изучите серверный слой напрямую.
Не пытайтесь «починить» права, открыв всё подряд. Быстрый chmod 777 может скрыть проблему, но одновременно создаст дыры в безопасности и обычно маскирует настоящий конфликт владения. Если после изменений вам нужен безопасный ориентир для сервера, полезно держать под рукой более общие рекомендации по безопасности сайта, пока вы тестируете.
6. Проверьте недавние изменения на сервере или в деплое
Оглянитесь назад на 1 деплой, 1 изменение хоста или 1 правку конфигурации. Ошибки 500 часто начинаются сразу после смены версии PHP, правила переписывания на веб-сервере, нового redirect-правила или обновления cron-задачи. Если проблема началась после миграции, триггером может быть сама миграция.
Переход на другую версию PHP может вскрыть старый код, который раньше проходил незаметно. Модуль, работавший в одной версии, может сломаться в другой. То же относится и к директивам веб-сервера: вчера они принимались, а сегодня вызывают ошибку при чтении конфига. Одной строки бывает достаточно.
Правила безопасности — ещё одна частая причина. Правило WAF, новая условие firewall или ужесточение настроек сервера могут заблокировать запрос, который выглядит подозрительно, хотя он вполне легитимный. Именно здесь журнал изменений полезнее памяти, потому что люди часто забывают про «мелкое» обновление, которое сломало маршрут.
Если участвовал деплой, сравните последнюю рабочую версию с текущей. Сначала проверьте три вещи: конфигурационные файлы, правила маршрутизации и любую новую фоновую задачу. Проблема часто не в той функции, которую вы выкатили, а в побочном эффекте, который пришёл вместе с ней.
7. Восстановите работу с помощью самого маленького безопасного отката
Откат должен быть точечным. Сначала отключите самое новое серверное изменение, а не всю систему целиком. Откатывайте по одному конфигу, одному правилу или одному шагу деплоя за раз, чтобы понять, какое действие вернуло сайт к жизни. Если убрать всё сразу, подсказка исчезнет.
Начните с самого безопасного элемента, который изменился последним. Если новое правило перенаправления появилось за 20 минут до сбоя, закомментируйте его и проверьте снова. Если был изменён PHP-параметр, верните только его прежнее значение и повторите тест. Цель — восстановить сервис, а не устроить показательное «уборочное» мероприятие.
Для кодовых релизов держите под рукой безопасную копию и откатывайте только затронутый выпуск. Для серверной конфигурации сохраняйте текущий файл перед правкой, чтобы можно было сравнить построчно. Это звучит банально, потому что так и есть, а банальные вещи предотвращают самые долгие простои.
Иногда самый маленький безопасный откат вообще не технический. Если cron-задача перегружает сервер каждые 5 минут, приостановите её и понаблюдайте за сайтом. Если backup-скрипт съедает ресурсы, сначала сдвиньте расписание, а уже потом трогайте приложение. Сайту всё равно, почему сервер устал.
8. Не допустите повторения той же ошибки 500
Настройте мониторинг логов так, чтобы первая повторяющаяся ошибка 500 была видна ещё до жалоб клиентов. Одна отдельная ошибка — это одно. Пять подряд на одном и том же маршруте — уже закономерность. В уведомлении должны быть маршрут, время и текст ошибки.
Проверяйте деплой сначала на staging-окружении. Копия для тестирования ловит плохие правки конфигурации и несовпадения версий до того, как они ударят по живому трафику. Держите стек как можно ближе к production, потому что настройка сервера, которая кажется безобидной на тестовой машине, на реальной может упасть.
Фиксируйте изменения в одном месте. Сюда относятся правки конфигов, обновления плагинов, смена версии PHP, корректировки cron и изменения правил безопасности. Если вы уже ведёте карту изменений сайта, в блоге ostohlo есть связанные материалы в блоге ostohlo studio, и они могут пригодиться, когда нужен не ответ из памяти, а запись.
Оповещения особенно важны, когда они повторяются. Если один и тот же ответ 500 возвращается после каждого деплоя или каждого всплеска трафика, повышайте приоритет проверки и ведите короткую заметку об инциденте с тремя фактами: что изменилось, где сломалось и что помогло. Эта заметка станет самым быстрым ответом в следующий раз, особенно если следующий сбой придёт во время окна деплоя, которого вы не ожидали.