HTTP 500 значит: сервер споткнулся, браузеру деталей не дали. Белый экран при 200 часто тот же Fatal Error с выключенным display_errors. Гадать по фасаду бессмысленно — нужен лог.
После свежей установки тройка лидеров: неверная версия PHP, конфликт .htaccess, ошибка подключения к MySQL. Дальше — права и лимиты памяти.
Где смотреть лог
- Shared: раздел «ошибки»,
logs/в домашнем каталоге, иногдаerror_logв корне сайта. - Apache:
/var/log/apache2/error.logили лог виртуального хоста. - Nginx + PHP-FPM:
error.lognginx и лог пула FPM (путь в pool.d). - Локально MicroServer — лог Apache/PHP из панели/каталога логов сервера.
Ищите timestamp вашего запроса. Одна строка Fatal Error экономит час тыканья в админку.
Версия PHP и синтаксис
Скрипт под 8.x, на домене 7.4 — типичный Parse error / unexpected token. В панели переключите PHP на 8.1+. Требования: PHP и MySQL.
Не хватает расширения — Call to undefined function mysqli_connect() и подобные. Доставьте mysqli/mbstring/gd, не перезаливайте архив.
.htaccess и Nginx
На Apache кривой .htaccess даёт 500 сразу на всех URL. Частые причины: неизвестные директивы, php_value на CGI/FPM (запрещено), битый rewrite.
На Nginx .htaccess игнорируется. Правила ЧПУ нужно перенести в конфиг. Если после переноса с Apache на Nginx всё 404/500 — смотрите vhost, не PHP: Nginx + PHP-FPM.
Быстрый тест: временно переименовать .htaccess и открыть главную. Если заработало (пусть без ЧПУ) — копайте rewrite.
База данных
Access denied и connection refused при display_errors=Off выглядят как 500. В логе будет SQLSTATE 1045/2002. Чеклист: ошибка подключения. После переноса конфиг со старыми паролями — классика.
Права и запись
Не может создать файл сессии/кэша — Fatal или Warning с permission denied. Каталоги upload/cache writable, владелец совпадает с пулом PHP: chmod.
Память и лимиты
Allowed memory size exhausted — поднимите memory_limit для домена. Maximum execution time — на тяжёлом импорте. Большой upload режет upload_max_filesize / post_max_size или client_max_body_size в Nginx — иногда с иной ошибкой, не обязательно 500.
Как временно увидеть ошибку
На боевом лучше лог. На стенде можно:
ini_set('display_errors', '1');
error_reporting(E_ALL);
или в php.ini / панели. Не оставляйте display_errors=On на проде с реальными пользователями — светите пути и SQL.
Чеклист по порядку
- Открыть error_log по времени запроса.
- Сверить PHP 8.x и модули.
- Проверить коннект к MySQL теми же данными, что в конфиге.
- Проверить .htaccess / конфиг Nginx.
- Права на cache/upload.
- memory_limit.
Установка с нуля: установка. Перенос: перенос. Хостинг не тянет модули — выбор хостинга или VDS. В поддержку — текст из лога без паролей: поддержка.
Белый экран без кода 500
Иногда статус 200, body пустой. Для пользователя это то же самое. Причины те же Fatal Error / Parse Error. Включите лог, не гадайте. На shared положите временно ini_set в индекс только если нет доступа к логам — и уберите сразу после.
Пустой ответ ещё бывает при выводе до заголовков и сломанном gzip на уровне панели — реже. Сначала ищите PHP Fatal.
Конфликт модулей и ionCube
Если продукт или плагин требует ionCube/Zend Loader, а лоадера нет — будет 500 с понятной строкой в логе. Не путайте с «просто PHP 8». Документация комплекта скажет, нужен ли лоадер. Большинство наших чистых PHP-скриптов живут без него — но клиентский зоопарк плагинов бывает разный.
open_basedir и пути
На shared open_basedir режет доступ вне домашних каталогов. После переноса, если в конфиге остались абсолютные пути со старого сервера вида /home/u123/old, получите ошибки открытия файлов и 500. Обновите пути или перейдите на относительные, как заложено в продукте.
Локально на MicroServer open_basedir обычно не мешает: локальный сервер.
Сессии
Не может создать файл сессии — Warning/Fatal и «то логинит, то нет». Каталог session.save_path должен существовать и быть writable для пользователя PHP. На некоторых панелях после смены версии PHP путь сессий съезжает. Права в целом: chmod.
Как отличить проблему Nginx от PHP
- Ответ 502/504 и строка connect() failed в nginx — FPM, не скрипт.
- Ответ 500 и stack trace PHP в логе FPM — скрипт/модули/код.
- Ответ 404 на всех ЧПУ при живом index.php — rewrite.
Про FPM: Nginx + PHP-FPM. Про базу, которая маскируется под 500: MySQL.
После обновления PHP в панели
Сменили 8.1 → 8.3 одной кнопкой — перезапустите FPM/веб, проверьте cron-путь к новому php. Часть модулей могла не включиться в новой версии (gd «пропал»). Сверьте php -m и требования: требования.
Если 500 начался сразу после обновления файлов продукта — откатите из бэкапа и сравните diff: бэкап, порядок обновления — поддержка и обновления.
Минимальный набор для тикета
URL, время запроса (с часовым поясом), 5–20 строк лога вокруг ошибки, версия PHP, что меняли последним. Этого хватает, чтобы не играть в двадцативопросье. SLA и ожидания по срокам: SLA.
Иногда 500 появляется только на POST (сохранение формы, загрузка фото), а GET главной живой. Тогда смотрите лимиты тела запроса, права на upload и ошибки в обработчике формы — не общий «сайт лежит». В логе будет строка именно на этот URI. Для картинок параллельно проверьте gd/imagick и лимиты php.ini из требований. На Nginx отдельно client_max_body_size: мануал. Если ошибка только после включения https — смешанный контент редко даёт 500, чаще редирект-петля; но кривой абсолютный путь в конфиге после смены URL встречается: SSL, перенос URL — перенос. Без строки лога в тикет лучше не писать: поддержка.
Частые вопросы
Ошибка 500 после установки php скрипта?
500 почти всегда в error_log: версия PHP, .htaccess или доступ к базе.
Сколько времени занимает «Ошибка 500 после установки скрипта»?
Ориентир по тексту мануала — около 5 мин. На практике зависит от хостинга и подготовки базы.
Нужен ли отдельный сервер?
Для большинства скриптов достаточно хостинга или VDS с PHP и MySQL. Подбор сервера — в разделе VDS и требованиях к PHP/MySQL.
Установка готового скрипта php mysql?
Разбор рядом в мануале по этому запросу. установка готового скрипта php mysql
Требования php mysql для скрипта?
Разбор рядом в мануале по этому запросу. требования php mysql для скрипта