
Ошибка 500 Internal Server Error: как найти причину на сайте
Пошагово ищем причину HTTP 500: фиксируем запрос, читаем журналы Nginx и приложения, проверяем недавние изменения, PHP-FPM, права и повторный ответ.
Содержание
500 Internal Server Error означает, что сервер не смог обработать запрос из-за внутреннего сбоя. Это общий ответ: он не различает ошибку программы, неверную конфигурацию, недоступную базу данных или отказ в доступе к файлу.
Исправление начинается не с перезагрузки VPS, а с одного воспроизводимого URL и записи в журнале за то же время. Код 500 сообщает, где искать — на стороне сайта, — но конкретную причину показывает только компонент, который завершил запрос.
Сначала определите масштаб сбоя
Откройте главную страницу, проблемный адрес и один заведомо простой статический файл, например логотип. Результаты сразу разделят несколько случаев:
- 500 возвращает только один URL — вероятна ошибка маршрута или данных этой страницы;
- все динамические страницы не работают, а изображения открываются — проверяйте приложение, PHP-FPM или базу данных;
- 500 получают все запросы — возможна ошибка конфигурации веб-сервера;
- проблема возникает только после отправки формы — важны метод запроса, входные данные и обработчик формы.
Запишите точное время, адрес и действие, после которого появилась ошибка. Не повторяйте запрос десятки раз: один-два запроса проще найти в журнале и они не создают лишнюю нагрузку.
Проверьте фактический статус ответа
На локальном компьютере выполните один запрос к проблемной странице, заменив URL на свой. Команда не изменяет сайт и не выводит содержимое ответа:
curl -sS -D - -o /dev/null https://example.com/account/
-D - выводит заголовки, а -o /dev/null не печатает тело страницы. В первой строке ожидается 500. Запомните заголовки server, date и идентификатор запроса, если приложение его добавляет. Они помогают понять, какой узел ответил и какую запись искать.
Если curl получает 200, а браузер показывает ошибку, проверьте другой URL, авторизацию, cookie и запросы в инструментах разработчика. Возможно, падает не HTML-страница, а отдельный API-запрос.
Найдите компонент, который сформировал 500
Типичный сайт состоит из Nginx, приложения или PHP-FPM и базы данных. Nginx может вернуть 500 сам либо передать такой статус от приложения. На VPS сначала посмотрите активные журналы Nginx:
sudo nginx -T 2>/dev/null | grep -E 'error_log|access_log|fastcgi_pass|proxy_pass'
sudo tail -n 100 /var/log/nginx/error.log
Первая команда читает собранную конфигурацию и показывает фактические пути журналов и способ передачи запроса. Вторая читает стандартный error log. Не публикуйте полный вывод nginx -T: в конфигурации могут быть внутренние адреса и другие служебные данные.
Ищите запись с тем же временем и URL. Сообщение Nginx может указывать на цикл внутренних перенаправлений, неверную директиву, отказ доступа или ошибку FastCGI. Если Nginx лишь передал ответ 500, переходите к журналу приложения.
Проверьте службу приложения до перезапуска
Если приложение запущено как systemd-служба, подставьте настоящее имя вместо myapp.service:
systemctl status myapp.service --no-pager
sudo journalctl -u myapp.service --since "15 minutes ago" --no-pager
systemctl status показывает, работает ли процесс и не перезапускается ли он. journalctl раскрывает исключение, отсутствующую переменную окружения, ошибку подключения к базе или другую причину. Скопируйте несколько строк до и после сбоя, скрыв секреты.
Если приложение слушает локальный HTTP-порт, запросите его напрямую с VPS:
curl -v --max-time 5 http://127.0.0.1:3000/health
Замените порт и путь на значения из proxy_pass. Локальный 500 подтверждает проблему внутри приложения или его зависимостей. Локальный успешный ответ при внешнем 500 возвращает внимание к Nginx, заголовкам и отличиям публичного маршрута.
Сопоставьте ошибку с последним изменением
Вспомните, что менялось непосредственно перед сбоем:
- новый релиз приложения;
- конфигурация Nginx или PHP;
- переменные окружения;
- схема базы данных;
- версия плагина или темы;
- владелец и права файлов;
- свободное место на диске.
Не меняйте всё сразу. Если 500 появился сразу после релиза, безопаснее вернуть предыдущую известную рабочую версию и проверить ответ. Затем воспроизведите проблему на тестовой среде. Такой откат восстанавливает сервис и сохраняет одну понятную гипотезу.
Для конфигурации Nginx проверка обязательна до применения:
sudo nginx -t
Успешная проверка синтаксиса не гарантирует работу приложения, но исключает часть ошибок веб-сервера. При неуспехе не выполняйте reload: исправьте указанную строку или восстановите сохранённый файл.
Если сайт работает через PHP-FPM
Nginx передаёт PHP-файл отдельной службе PHP-FPM по TCP-порту или Unix-сокету. Уточните имя установленной службы, затем посмотрите её состояние и журнал. Например, для конкретной установленной версии команда может выглядеть так:
systemctl list-units --type=service 'php*-fpm.service'
sudo journalctl -u php8.3-fpm.service --since "15 minutes ago" --no-pager
php8.3-fpm.service здесь пример — используйте имя из первой команды. Ищите фатальную ошибку PHP, исчерпание памяти, недоступный файл, отказ базы данных или слишком долгий запрос.
В production подробности исключения не должны выводиться посетителю: они раскрывают пути и устройство приложения. Записывайте их в закрытый журнал, а пользователю отдавайте нейтральную страницу ошибки.
Не используйте права 777 как универсальное лечение
Если журнал содержит Permission denied, проверьте владельца файла и возможность пройти по каталогам:
namei -l /var/www/example/current/public/index.php
Команда ничего не меняет. Она показывает права каждого участка пути. Для чтения файла процессу нужны права чтения на сам файл и прохода по каталогам. Для загрузок WordPress запись обычно нужна только выделенному каталогу, а не всему коду сайта. Сначала определите пользователя процесса и требуемую операцию; только затем меняйте владельца или режим.
Проверьте ресурсы и внешние зависимости
Если журнал говорит об отсутствии места, памяти или соединения с базой, подтвердите именно этот симптом:
df -h
free -h
sudo ss -ltnp
df показывает заполнение файловых систем, free — память, ss — слушающие TCP-порты. Сами по себе высокие числа не доказывают причину 500; они должны совпасть со временем и текстом ошибки приложения.
Не удаляйте журналы и кеш вслепую ради освобождения места. Сначала найдите растущий каталог, сохраните нужные данные и настройте ротацию. Если приложение не соединяется с базой, проверьте состояние базы и учётные данные из окружения, не выводя пароль в командную строку или журнал.
Подтвердите исправление и сохраните возможность отката
После одного целевого изменения повторите с локального компьютера тот же запрос, который давал 500. Не меняйте одновременно URL и входные данные, иначе сравнение потеряет смысл:
curl -sS -D - -o /dev/null https://example.com/account/
Успех — это ожидаемый статус, отсутствие новой ошибки в журнале и работа соседнего сценария. Для формы выполните тест с безопасными данными; для страницы с базой проверьте чтение, а не только статический health endpoint.
Если ошибка осталась, верните последнее изменение и переходите к следующей подтверждённой гипотезе. При схеме с Nginx и приложением полезно отдельно понимать путь запроса через reverse proxy и уметь читать журналы Nginx. Если вместо 500 появился 502, используйте отдельную диагностику Bad Gateway.
Источники
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Что означает ошибка 500 Internal Server Error?
Сервер столкнулся с непредвиденной ситуацией и не смог завершить запрос. Код не называет причину: её ищут в журнале компонента, который сформировал ответ.
Поможет ли перезапуск сервера при ошибке 500?
Иногда он временно убирает симптом, но может скрыть состояние сбойного процесса. Сначала запишите время и URL ошибки, сохраните журналы и проверьте недавние изменения.
Можно ли исправлять 500 выдачей прав 777?
Нет. Режим 777 открывает запись всем локальным пользователям и не устраняет ошибки кода, конфигурации или базы данных. Права меняют только после подтверждённого отказа доступа и с понятной моделью владельца.


