PHPFlowPHP, MySQL, Laravel и JavaScript

Ошибка 500 Internal Server Error: что значит и как исправить на своём сайте

Обновлено:

Коротко

Ошибка 500 (Internal Server Error) значит, что сайт сломался при обработке запроса, а не что у посетителя плохой интернет. Владельцу сайта первым делом нужно открыть лог ошибок: там написаны точная причина, файл и строка. Чаще всего ошибку 500 вызывают опечатка в .htaccess, фатальная ошибка PHP после обновления, нехватка памяти и неправильные права на файлы.

Содержание
  1. Что означает ошибка 500 на сайте
  2. Чем 500 отличается от 502, 503 и 504
  3. Шаг 1. Найдите причину в логах
  4. Шаг 2. Проверьте .htaccess
  5. Шаг 3. Ошибки PHP и смена версии
  6. Шаг 4. Права на файлы и владелец
  7. Ошибка 500 в WordPress и Laravel
  8. Как не допустить ошибку 500 снова

Что означает ошибка 500 на сайте

Код 500 Internal Server Error - "внутренняя ошибка сервера". Сервер получил запрос, начал его обрабатывать и сломался, но не может сказать посетителю, что именно пошло не так. Это не проблема интернета или браузера: ошибка возникает на стороне сайта. Поэтому браузер показывает лишь общий текст вроде "HTTP ERROR 500", "Произошла ошибка, код 500" или "Ошибка сервера, код состояния 500", а настоящая причина записана в логах сервера.

Страница 500 Internal Server Error в браузере
Стандартная страница Apache с ошибкой 500: сервер прямо указывает, что подробности записаны в журнал ошибок

Если вы посетитель (ошибка 500 на сайте госуслуг, банка, СФР, электронного дневника), исправить её со своей стороны нельзя. Обновите страницу через минуту клавишей F5, попробуйте открыть сайт в режиме инкогнито или с другого устройства. Если ошибка держится долго - сайт сломан или перегружен, остаётся подождать или написать в поддержку сервиса.

Если вы владелец сайта, дальше пошаговая диагностика: от самой частой причины к редким.

ПричинаКак понятьКак исправить
Ошибка в .htaccessВ логе Apache "Invalid command" или "RewriteRule: bad flag"Переименовать файл, исправить строку
Фатальная ошибка PHPВ логе PHP "PHP Fatal error"Исправить код или откатить обновление
Не хватает памяти"Allowed memory size ... exhausted"Поднять memory_limit, найти утечку
Неверные права на файлы"Permission denied", "is writable by group"Каталоги 755, файлы 644
Несовместимая версия PHP"Call to undefined function", ошибки после смены версииВернуть прежнюю версию, обновить CMS и плагины
Сломанный плагин или модуль CMSОшибка появилась после установки или обновленияОтключить плагин, переименовав его папку

Чем 500 отличается от 502, 503 и 504

Коды 5xx похожи, но причины у них разные, и путать их - значит искать проблему не там.

КодЧто произошлоГде искать
500 Internal Server ErrorСайт упал при обработке запросаЛоги PHP и веб-сервера, код, .htaccess
502 Bad GatewayNginx не получил ответа от PHP-FPM или бэкендаЗапущен ли PHP-FPM, лог Nginx
503 Service UnavailableСервер перегружен или в режиме обслуживанияНагрузка, лимиты хостинга, режим обслуживания CMS
504 Gateway TimeoutСкрипт работает дольше, чем ждёт проксиМедленные запросы к базе, внешние API

Сообщение 500 Internal Server Error nginx внизу страницы значит, что ответ отдал Nginx: чаще всего PHP-FPM вернул ошибку или в конфиге Nginx есть цикл перенаправлений внутри сервера. Смотрите лог Nginx и лог PHP-FPM.

Шаг 1. Найдите причину в логах

Лог ошибок - самый быстрый способ узнать, почему сайт отдаёт 500. Гадать без него можно часами. Где лежат логи:

  • Виртуальный хостинг - в панели управления раздел "Логи" или "Журналы", либо папка logs рядом с папкой сайта. Нужен файл error.log или error_log.
  • VPS с Apache - /var/log/apache2/error.log (Ubuntu, Debian) или /var/log/httpd/error_log (CentOS, AlmaLinux).
  • VPS с Nginx и PHP-FPM - /var/log/nginx/error.log и /var/log/php8.4-fpm.log (номер версии ваш).
  • Локальный сервер - в XAMPP C:\xampp\apache\logs\error.log, в Open Server - папка logs панели.

Откройте страницу с ошибкой ещё раз и сразу посмотрите последние строки лога:

# Последние 30 строк лога Apache
sudo tail -n 30 /var/log/apache2/error.log
# Следить за логом в реальном времени, пока обновляете страницу
sudo tail -f /var/log/nginx/error.log
# Найти фатальные ошибки PHP за сегодня
sudo grep "PHP Fatal" /var/log/php8.4-fpm.log | tail -n 20
Просмотр лога ошибок Apache командой tail
Последние строки лога Apache показывают точную причину ошибки 500: файл, строку и текст ошибки

В строке лога есть всё нужное: тип ошибки, текст, файл и номер строки. Например, PHP Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/site/db.php:12 сразу говорит, что старый код использует удалённые в PHP 7 функции, а /var/www/site/.htaccess: Invalid command 'php_value' - что в .htaccess есть директива, которую сервер не поддерживает.

Ошибка 500 на сервере с Nginx

Nginx не читает .htaccess, поэтому на таких серверах причина обычно в конфиге сайта или в PHP-FPM. Сообщение rewrite or internal redirection cycle while internally redirecting to "/index.php" в логе Nginx означает, что директива try_files ссылается на файл, которого нет, и запрос ходит по кругу. Проверьте путь в root и наличие index.php. После любой правки конфига проверяйте синтаксис и только потом перезагружайте сервер:

sudo nginx -t && sudo systemctl reload nginx
# Состояние PHP-FPM (номер версии ваш)
systemctl status php8.4-fpm --no-pager

Если доступа к логам нет

Временно включите запись ошибок в свой файл. Добавьте в начало index.php:

<?php
// Временно: пишем все ошибки в файл рядом с сайтом
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', __DIR__ . '/php-errors.log');
error_reporting(E_ALL);

Ошибки появятся в php-errors.log, а посетители их не увидят. Показывать ошибки прямо на странице (display_errors = 1) можно только на тестовой копии сайта: в тексте ошибки видны пути к файлам и куски кода. Все способы включить отображение ошибок собраны в статье как включить вывод ошибок PHP.

После исправления удалите эти строки и файл php-errors.log: он доступен из браузера, и в нём может оказаться служебная информация.

Шаг 2. Проверьте .htaccess

Одна опечатка в .htaccess - и весь сайт отдаёт 500, причём на всех страницах сразу, включая картинки. Это первое, что стоит проверить, если ошибка появилась после правки редиректов или установки плагина.

  1. Подключитесь к сайту по FTP/SFTP или откройте файловый менеджер хостинга.
  2. Включите показ скрытых файлов: имя .htaccess начинается с точки.
  3. Переименуйте .htaccess в .htaccess_off.
  4. Обновите сайт. Если главная открылась - причина в файле.
  5. Верните имя и комментируйте подозрительные строки знаком # по одной, пока не найдёте виновную.
Переименование .htaccess в файловом менеджере хостинга
Быстрая проверка .htaccess: переименуйте файл в файловом менеджере хостинга и обновите сайт

Типичные виновники:

  • php_value и php_flag - работают только при PHP в виде модуля Apache. На хостинге с PHP-FPM или CGI они вызывают 500. Перенесите настройки в php.ini или .user.ini.
  • Директивы модулей, которые не подключены: Header без mod_headers, ExpiresActive без mod_expires. Оберните их в <IfModule mod_headers.c>.
  • Опечатки во флагах: [R=301,L] пишется без пробелов.
  • Бесконечная внутренняя переадресация - в логе "Request exceeded the limit of 10 internal redirects".

Правильный синтаксис редиректов, ЧПУ и кеширования разобран в статье файл .htaccess: редиректы и настройки.

Шаг 3. Ошибки PHP и смена версии

Фатальная ошибка PHP при выключенном выводе ошибок превращается в пустую страницу или код 500. Частые случаи:

  • Синтаксическая ошибка после правки - PHP Parse error: syntax error, unexpected .... Проверьте файл командой php -l файл.php.
  • Смена версии PHP на хостинге - старая CMS или плагин используют функции, удалённые в PHP 8: each(), create_function(), mysql_*. Верните прежнюю версию в панели хостинга, затем обновите движок и расширения.
  • Нет расширения - Call to undefined function mb_strlen() или Class "PDO" not found. Включите mbstring, pdo_mysql, intl в настройках PHP.
  • Ошибка подключения к базе без обработки исключения - в логе SQLSTATE[HY000] [1045] Access denied. Проверьте логин, пароль и хост базы в конфиге.
# Проверить синтаксис всех PHP-файлов проекта
find /var/www/site -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"
# Какая версия PHP работает в консоли
php -v

Учтите, что версия PHP в консоли и у сайта на хостинге может отличаться. Как узнать именно ту, что обрабатывает страницы, - в статье как узнать версию PHP.

Не хватает памяти или времени

Сообщение Allowed memory size of 134217728 bytes exhausted означает, что скрипт упёрся в memory_limit (здесь 128 МБ). Поднимите лимит в php.ini или .user.ini в корне сайта:

; .user.ini - для хостинга с PHP-FPM
memory_limit = 256M
max_execution_time = 120

Изменения .user.ini подхватываются не сразу, а через несколько минут (параметр user_ini.cache_ttl). Если памяти не хватает даже с 512 МБ, увеличивать лимит дальше бессмысленно - ищите тяжёлый код: выборку всей таблицы в массив, генерацию огромного файла целиком, бесконечную рекурсию. Где искать главный конфиг, описано в статье php.ini: где находится.

Шаг 4. Права на файлы и владелец

Многие хостинги запускают PHP от имени пользователя аккаунта и отказываются выполнять файлы с опасными правами. Если на скрипт или папку стоит 777 или запись разрешена группе, сервер вернёт 500, а в логе будет что-то вроде "is writable by others" или "Permission denied".

ОбъектПраваПример
Каталоги755public_html, wp-content
Обычные файлы644index.php, .htaccess
Файлы с паролями600 или 640wp-config.php, .env

Исправить права на VPS для папки, куда вы только что залили сайт:

cd /var/www/site
# Каталоги - 755, файлы - 644
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 640 .env

Не ставьте 777 "чтобы точно заработало": это не лечит 500, а открывает сайт для заражения. Если файлы залиты от root, поменяйте владельца на пользователя сайта, а не права на всех.

Ошибка 500 в WordPress и Laravel

WordPress

  1. Включите журнал отладки: в wp-config.php задайте define('WP_DEBUG', true);, define('WP_DEBUG_LOG', true); и define('WP_DEBUG_DISPLAY', false);.
  2. Откройте сайт и посмотрите файл wp-content/debug.log: в нём будет путь к сломанному плагину или теме.
  3. Если в админку не попасть, переименуйте папку wp-content/plugins в plugins_off - все плагины отключатся.
  4. Верните имя папки и включайте плагины по одному, пока ошибка не вернётся.
  5. Если виновата тема, переименуйте её папку в wp-content/themes - WordPress переключится на стандартную.

Laravel

В Laravel 12 и 13 подробности ошибки пишутся в storage/logs/laravel.log. Частые причины 500 после выкладки: нет файла .env или ключа APP_KEY, у веб-сервера нет прав на запись в storage и bootstrap/cache, устаревший кеш конфигурации.

tail -n 50 storage/logs/laravel.log
# Сгенерировать ключ, если APP_KEY пустой
php artisan key:generate
# Сбросить кеши после выкладки
php artisan optimize:clear
# Права на запись для пользователя веб-сервера
sudo chown -R www-data:www-data storage bootstrap/cache

Не включайте APP_DEBUG=true на рабочем сайте: страница ошибки покажет переменные окружения, включая пароли от базы.

Порядок диагностики ошибки 500
Порядок поиска причины ошибки 500: от лога к самым частым виновникам

Как не допустить ошибку 500 снова

  • Проверяйте обновления CMS, плагинов и версии PHP сначала на копии сайта - локально в XAMPP или на тестовом поддомене.
  • Перед правкой .htaccess и конфигов сохраняйте копию файла, чтобы откатиться за секунду.
  • Держите display_errors выключенным, а log_errors - включённым: ошибки будут в логе, а не на экране посетителей.
  • Настройте уведомления о недоступности сайта (мониторинг, Яндекс Вебмастер), чтобы узнавать о 500 раньше посетителей.
  • Сделайте свою страницу ошибки: в Apache директива ErrorDocument 500 /500.html покажет понятное сообщение вместо стандартного.

Короткая ошибка 500, которая пропала через минуту, почти не влияет на позиции в поиске. Но если робот Яндекса несколько дней подряд получает код 500, страницы начнут выпадать из индекса, поэтому чинить сайт стоит сразу.

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

Что означает ошибка 500 на сайте?

Это внутренняя ошибка сервера: сайт получил запрос, но упал при его обработке. Причина на стороне сайта - в коде, настройках или сервере, а не у посетителя.

Что делать посетителю, если сайт выдаёт ошибку 500?

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

Чем ошибка 500 отличается от 502 и 503?

500 - сбой при выполнении кода сайта. 502 - прокси (обычно Nginx) не получил ответа от PHP-FPM, 503 - сервер перегружен или закрыт на обслуживание.

Может ли .htaccess вызвать ошибку 500?

Да, это одна из самых частых причин. Неподдерживаемая директива вроде php_value или опечатка во флагах ломает весь сайт. Переименуйте файл и проверьте, открылся ли сайт.

Как исправить ошибку 500 из-за нехватки памяти?

Увеличьте memory_limit в php.ini или .user.ini, например до 256M. Если не хватает и 512M, ищите тяжёлый код: выборку всей таблицы, большой экспорт или рекурсию.

Влияет ли ошибка 500 на поисковую выдачу?

Кратковременная - почти нет. Если робот несколько дней получает код 500, страницы начинают выпадать из индекса, поэтому чинить сайт нужно сразу.