
Ошибка 500 (Internal Server Error, «внутренняя ошибка сервера») означает, что сервер получил запрос, но не смог его выполнить из-за сбоя на своей стороне: исключения в коде, ошибки в .htaccess, нехватки памяти PHP или неверных прав на файлы. Посетитель исправить её не может — только обновить страницу позже. Владельцу сайта нужно открыть лог ошибок веб-сервера и PHP: там записана точная причина.
Код 500 — серверная ошибка класса 5xx, которая говорит «что-то сломалось, но я не могу объяснить что». Это обобщённый (generic) код: сервер знает о проблеме, но не раскрывает детали клиенту из соображений безопасности. Для администратора 500 — красный флаг, требующий немедленного расследования через логи. Ниже — что означает этот код и как выглядит его текст в разных браузерах и программах, что делать посетителю, как владельцу найти причину в логах Apache, nginx и PHP-FPM и исправить её для WordPress, Laravel и Node.js, а также чем 500 отличается от 502, 503 и 504.
Что означает ошибка 500 и как переводится Internal Server Error
По RFC 9110 §15.6.1, код 500 указывает, что сервер столкнулся с непредвиденной ситуацией, которая помешала ему выполнить запрос. В отличие от 502 (bad gateway) или 503 (service unavailable), 500 обычно означает исключение в прикладном коде или проблему с интерпретатором. Проще говоря, запрос дошёл до сайта, сайт начал его обрабатывать — и «упал» на полпути.
Перевод Internal Server Error — «внутренняя ошибка сервера». Слово «внутренняя» здесь важно: сбой произошёл внутри сервера, а не в сети, не в браузере и не на компьютере пользователя. Фраза An internal server error has occurred переводится как «произошла внутренняя ошибка сервера» — это тот же код 500, только сформулированный самим приложением.
Как выглядит текст ошибки
Статус один, а надпись на экране зависит от того, кто её показывает: браузер, веб-сервер, CMS или клиентская библиотека.
| Текст на экране | Где встречается | Что это значит |
|---|---|---|
| Страница не работает (в старых версиях — «Страница недоступна»)… HTTP ERROR 500 | Google Chrome и другие браузеры на Chromium, если сервер не прислал своей страницы | Сервер вернул 500 и не прислал своей страницы ошибки |
| 500 Internal Server Error | Стандартная страница nginx или Apache | Сбой в конфигурации сервера или в приложении за ним |
| Internal Server Error. The server encountered an internal error or misconfiguration and was unable to complete your request. | Apache | Чаще всего ошибка в .htaccess или падение PHP-скрипта |
| На сайте возникла критическая ошибка | WordPress 5.2 и новее | Фатальная ошибка PHP в плагине или теме; подробности уходят письмом администратору |
| Request failed with status code 500 | JavaScript-приложения на axios | API вернул 500; причину нужно искать в логе бэкенда |
| An internal server error has occurred / Произошла ошибка | Веб-приложения, личные кабинеты, мобильные приложения | Приложение перехватило исключение и показало общую заглушку |
Короткие коды вида «1:500:7» или «4:500» в лаунчерах и мобильных приложениях — внутренние коды самих программ, а не HTTP-статус; их расшифровывает поддержка конкретного сервиса.
Выдаёт ошибку 500 на сайте: что делать посетителю
Если вы просто открываете чужой сайт или входите в личный кабинет, а видите «500» или «ошибка входа 500», проблема почти наверняка на стороне сервиса. Что можно сделать:
- Обновить страницу через 1–2 минуты (F5 или Ctrl+R, на macOS — Cmd+R). Часть сбоев кратковременна: перезапуск процесса, выкладка новой версии.
- Не отправлять форму повторно при оплате или оформлении заказа — сначала проверьте почту и личный кабинет, иначе можно получить дубль платежа.
- Очистить cookies этого сайта — иногда сервер падает на повреждённой сессии. В Chrome: значок слева от адреса → «Настройки сайтов» → «Удалить данные».
- Открыть сайт в другом браузере или в режиме инкогнито (Ctrl+Shift+N) — так исключаются расширения и старая сессия.
- Проверить, недоступен ли сайт у всех, — через внешнюю проверку HTTP-ответа (ссылки в разделе «Как проверить» ниже).
- Написать в поддержку, указав адрес страницы, время и что вы делали перед ошибкой. Для администратора это ключ к нужной строке лога.
Смена DNS, перезагрузка роутера или переустановка браузера при 500 не помогают: запрос доходит до сервера, ошибка возникает уже там.
500 ошибка сервера: 10 частых причин
- Фатальная ошибка в PHP/Python/Node.js — unhandled exception, синтаксическая ошибка, out of memory.
- Неправильные права на файлы (.htaccess, скрипты) — chmod 644 для файлов, 755 для директорий.
- Ошибка подключения к базе данных — неправильные credentials, MySQL упал, max_connections исчерпан.
- Превышен memory_limit в PHP (
php.ini) или heap size в Node.js. - Бесконечный цикл или рекурсия — скрипт завис, превышен
max_execution_time. - Сломанная директива в .htaccess или nginx config — опечатка в модуле, отсутствующий модуль.
- Отсутствующая зависимость — не установлен composer-пакет, npm-модуль, Python library.
- Проблема с кэшем framework — устаревший Laravel config cache, Symfony
var/cache. - Несовместимая версия PHP — после обновления PHP на хостинге старый плагин или библиотека вызывает функцию, которой больше нет.
- Закончилось место или inode на диске — приложение не может записать сессию, кэш или лог.
Отдельно стоит отметить недавние изменения: в большинстве случаев 500 появляется сразу после обновления плагина, выкладки кода, правки .htaccess или смены версии PHP. Первый вопрос при разборе — «что меняли последним?».
Где искать логи: Apache, nginx, PHP-FPM
Первый шаг при 500 — прочитать логи. Никогда не гадайте, всегда смотрите stack trace. Пути зависят от дистрибутива: в Debian и Ubuntu Apache пишет в /var/log/apache2/, в RHEL, AlmaLinux и CentOS — в /var/log/httpd/.
# PHP-FPM error log
tail -100 /var/log/php-fpm/error.log
tail -100 /var/log/php8.4-fpm.log
# nginx
tail -100 /var/log/nginx/error.log
# Apache
tail -100 /var/log/apache2/error.log # Debian/Ubuntu
tail -100 /var/log/httpd/error_log # RHEL/AlmaLinux
# Laravel
tail -100 storage/logs/laravel.log
# Node.js (pm2)
pm2 logs --lines 100Удобнее всего воспроизвести ошибку и смотреть лог в реальном времени:
# следить за логом, пока открываете страницу в браузере
tail -f /var/log/nginx/error.log
# искать фатальные ошибки PHP
grep -i "fatal" /var/log/php8.4-fpm.log | tail -20
# сообщения службы за последние 10 минут
journalctl -u php8.4-fpm --since "10 min ago"
# проверить синтаксис конфигурации до перезапуска
sudo nginx -t
sudo apachectl configtest
# свободное место и inode
df -h
df -iНа виртуальном хостинге без SSH логи ошибок обычно доступны в панели управления (раздел с журналами сайта) или лежат в каталоге logs рядом с корнем сайта. Подробнее о формате записей nginx и ротации — в статье про логи nginx.
Типичные строки в логе и что они значат
| Строка в логе | Причина | Что делать |
|---|---|---|
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted | Скрипту не хватило memory_limit (здесь 128 МБ) | Поднять лимит или найти утечку памяти в плагине |
PHP Fatal error: Uncaught Error: Call to undefined function … | Несовместимость с версией PHP или не установлено расширение | Вернуть прежнюю версию PHP или обновить код, установить расширение |
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration | В .htaccess директива модуля, который не включён (здесь mod_rewrite) | a2enmod rewrite и перезапуск Apache |
Invalid command 'php_value'… | Директива php_value в .htaccess, а PHP работает через FPM, не mod_php | Убрать строку, перенести настройку в .user.ini или пул FPM |
Request exceeded the limit of 10 internal redirects due to probable configuration error | Зациклились правила RewriteRule | Добавить условия RewriteCond, проверить правила |
rewrite or internal redirection cycle while internally redirecting to "/index.php" | Цикл в try_files nginx: файла index.php нет или неверен root | Проверить root и наличие файла |
SQLSTATE[HY000] [2002] Connection refused | База данных не запущена или неверный хост | systemctl status mysql (или mariadb), проверить настройки подключения |
No space left on device | Кончился диск | Почистить логи и кэш, настроить ротацию |
Как исправить ошибку 500 владельцу сайта
Порядок действий, который закрывает большинство случаев: прочитать лог → откатить последнее изменение → устранить конкретную причину → проверить ответ сервера снаружи.
Проверьте .htaccess
Переименуйте файл и откройте сайт снова: если 500 исчезла, ошибка в одной из директив.
mv .htaccess .htaccess.bakЗатем возвращайте правила блоками и смотрите, на каком ошибка появляется снова. Частые виновники — директивы php_value/php_flag на сервере с PHP-FPM, правила модулей, которые не включены, и зацикленные редиректы. Синтаксис и примеры правил разобраны в руководстве по .htaccess.
Исправьте права на файлы и владельца
Стандарт для большинства сайтов на PHP — 755 для каталогов и 644 для файлов, владелец — пользователь, от которого работает PHP. Права 777 не «чинят» ошибку, а открывают сайт для записи кому угодно; на части хостингов с suEXEC скрипт с правами на запись для группы или всех вообще не запустится.
find /var/www/site -type d -exec chmod 755 {} \;
find /var/www/site -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/site # пользователь зависит от системыПоднимите лимит памяти PHP
Если в логе Allowed memory size … exhausted, увеличьте memory_limit — в php.ini или в пуле PHP-FPM:
# php.ini
memory_limit = 256M
max_execution_time = 60
# или в пуле FPM, например /etc/php/8.4/fpm/pool.d/www.conf
php_admin_value[memory_limit] = 256M
# применить
sudo systemctl reload php8.4-fpmУчтите, что php -i | grep memory_limit показывает настройки консольного PHP (CLI), а сайт работает через FPM со своим php.ini. Проверять действующее значение надёжнее через phpinfo() во временном файле, который потом нужно удалить. Если лимит приходится поднимать снова и снова, дело не в лимите, а в коде, который расходует память без меры.
WordPress
- Переименуйте plugins/ → определите, какой плагин сломался. По SSH:
mv wp-content/plugins wp-content/plugins.off, затем верните имя и отключайте плагины по одному. - Через WP-CLI:
wp plugin deactivate --all, затемwp plugin activate имя-плагинапо одному. - Проверьте тему — переименуйте каталог активной темы в
wp-content/themes/, WordPress переключится на стандартную, если она установлена. - Увеличьте memory_limit в
wp-config.php:define('WP_MEMORY_LIMIT', '256M'); - Включите debug:
define('WP_DEBUG', true);+define('WP_DEBUG_LOG', true);— ошибки пишутся вwp-content/debug.log. Добавьтеdefine('WP_DEBUG_DISPLAY', false);, чтобы посетители не видели сообщения. - Проверьте .htaccess — переименуйте и зайдите в Настройки → Постоянные ссылки для регенерации.
- Письмо о критической ошибке — WordPress отправляет его на адрес администратора со ссылкой на режим восстановления, где проблемный плагин можно отключить без SSH.
Laravel
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cacheЕсли после выкладки не выполнен composer install или не создан файл .env, Laravel тоже отдаст 500 — подробности будут в storage/logs/laravel.log.
Node.js / Express
// Global error handler
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
ok: false,
error: process.env.NODE_ENV === 'production' ? 'Internal Server Error' : err.message
});
});nginx + PHP-FPM
Если PHP-FPM не успевает ответить или присылает слишком большие заголовки, nginx обычно отдаёт не 500, а 504 (upstream timed out в логе) или 502 (upstream sent too big header). Для этих случаев помогают настройки:
fastcgi_read_timeout 60s;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
# increase in case of FastCGI timeout / buffer overflowПосле правки — sudo nginx -t и sudo systemctl reload nginx. Сама 500 от связки nginx + PHP-FPM почти всегда означает фатальную ошибку PHP: её текст смотрите в логе FPM.
База данных
Проверьте, запущена ли СУБД (systemctl status mysql или systemctl status mariadb), совпадают ли логин, пароль и имя базы в конфиге сайта и не исчерпан ли лимит соединений. WordPress при сбое подключения показывает «Ошибка установки соединения с базой данных» и отдаёт код 500.
Чем 500 отличается от 502, 503 и 504
Все четыре кода — серверные, но указывают на разные места поломки. От этого зависит, куда смотреть в первую очередь.
| Код | Название и перевод | Где сбой | Типичная причина | Что проверить |
|---|---|---|---|---|
| 500 | Internal Server Error — внутренняя ошибка сервера | В самом приложении или конфигурации сервера | Исключение в коде, .htaccess, память, права | Лог PHP / приложения, последние изменения |
| 502 | Bad Gateway — ошибочный шлюз | Между прокси (nginx, CDN) и бэкендом | PHP-FPM или Node.js не запущен, упал процесс | Статус бэкенда, лог nginx |
| 503 | Service Unavailable — сервис недоступен | Сервер временно не принимает запросы | Перегрузка, режим обслуживания, лимиты | Нагрузку, режим maintenance, заголовок Retry-After |
| 504 | Gateway Timeout — шлюз не дождался ответа | Прокси не дождался бэкенда | Долгий запрос к БД, медленный внешний API | Таймауты прокси, медленные запросы |
Подробные разборы соседних кодов: 502 Bad Gateway, 503 Service Unavailable и 504 Gateway Timeout.
Ошибка запроса 500 в API: request failed with status code 500
Сообщение Request failed with status code 500 генерирует HTTP-клиент axios, когда API вернул код 500. Сам клиент в этом не виноват: ответ сформировал сервер. Чтобы понять причину:
- Повторите запрос через curl и посмотрите тело ответа — API часто присылает описание ошибки в JSON:
curl -i -X POST https://api.example.com/v1/orders -H "Content-Type: application/json" -d '{"id":1}'. - В браузере откройте DevTools (F12) → вкладка Network → нужный запрос → Response.
- Если вы разработчик API — найдите запрос в логе по времени или по идентификатору запроса из заголовков ответа.
- Автоматически повторяйте только идемпотентные запросы (GET, PUT, DELETE) и с паузой; повтор POST может создать дубль заказа или платежа.
Если 500 приходит только на определённые входные данные, почти всегда это необработанный случай в коде: пустое поле, неожиданный тип, отсутствующая запись в базе. Правильное поведение API — отвечать на ошибку клиента кодом 4xx (например, 400 или 422), а 500 оставлять для настоящих сбоев сервера.
Как проверить, отдаёт ли сайт 500
Быстро узнать код ответа можно из терминала:
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/
curl -I https://example.com/Для быстрой диагностики снаружи используйте HTTP Header Checker и Security Scanner от Enterno.io — они покажут, как отвечает сервер и утекает ли информация через заголовки. Проверка извне полезна и посетителю: если внешний сервис тоже получает 500, сайт недоступен у всех, а не только у вас. Чтобы не узнавать о сбое от клиентов, поставьте страницу на мониторинг доступности с ожидаемым кодом 200.
Безопасность: не раскрывайте stack trace в production
Никогда не показывайте полный stack trace в production — OWASP относит это к категории Security Misconfiguration. Атакующий получает информацию о структуре кода, версиях фреймворка, путях на файловой системе.
# php.ini (production)
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
expose_php = OffВ Laravel: APP_DEBUG=false в .env. В Symfony: APP_ENV=prod. Вместо стандартной страницы сервера сделайте собственную страницу ошибки 500 без технических деталей: в nginx — директивой error_page 500 /500.html;, в Apache — ErrorDocument 500 /500.html.
Профилактика 500 ошибок
- Мониторинг uptime — настройте Enterno.io Monitors с expected_code=200 на ключевые URL.
- APM / error tracking — Sentry, New Relic, DataDog ловят исключения до того, как пользователь увидит 500.
- Staging-окружение идентичное production: та же версия PHP, те же модули.
- Ротация логов через logrotate — забитый диск = 500.
- Регулярные бэкапы БД и dependency-lock файлы в git (
composer.lock,package-lock.json). - Обновления по одному — плагины и зависимости обновляйте поочерёдно, чтобы сразу видеть, после чего сломалось.
500 — серверная проблема, и лечится только на сервере. Всегда начинайте с логов, никогда не показывайте детали ошибок пользователю, настраивайте мониторинг и APM. Для быстрой внешней диагностики используйте HTTP Header Checker от Enterno.io.
Частые вопросы
Что значит код 500 простыми словами?
Сайт получил ваш запрос, но при его обработке у него что-то сломалось: упал скрипт, не хватило памяти, не ответила база данных. Проблема на сервере, а не у вас.
Как исправить ошибку 500, если это не мой сайт?
Никак, кроме ожидания: обновите страницу через несколько минут, попробуйте другой браузер или режим инкогнито, очистите cookies сайта. Если не помогает — сообщите в поддержку сервиса время и адрес страницы.
Чем отличается 500 от 502 и 503?
500 — исключение в приложении. 502 — proxy не смог получить ответ от upstream. 503 — сервис временно недоступен (перегрузка, maintenance).
Влияет ли 500 на SEO?
Да. Частые 500 снижают частоту обхода, а если страница отдаёт 500 долго, поисковые роботы могут исключить её из индекса. Короткий сбой на несколько минут обычно проходит без последствий, но дольше тянуть с исправлением не стоит.
Как предупредить 500 до жалобы пользователя?
Мониторинг. Enterno.io шлёт алерт в Telegram/Email сразу после неудачной проверки.
Почему 500 появляется только иногда?
Плавающая 500 обычно связана с ресурсами: памяти или соединений с базой не хватает в пиковые моменты, отдельные тяжёлые страницы упираются в лимит времени, один из нескольких серверов за балансировщиком работает на старой версии кода. Ищите в логе время ошибок и сопоставляйте с нагрузкой.