Перейти к содержимому

Ошибки 500 и 502 - где искать причину и чем они отличаются

Сайт отдаёт 500, 502 или белый экран. Разбираем причины в порядке убывания частоты - коды говорят о разном.

С чего начать

Смотрим, какой код и от кого приходит:

Окно терминала
curl -sI https://example.com/ | head -3
tail -50 /var/log/nginx/error.log # 502 и 504 пишутся здесь
tail -50 /var/log/php-fpm/error.log # 500 и фатальные ошибки - здесь
curl -s https://example.com/ | wc -c # пустое тело при коде 200 - другой разбор

Коды приходят от разных участников. Пятисотая - от самого приложения, 502 и 504 - от веб-сервера, который не дождался ответа от PHP. Это разные журналы и разные причины, и путать их - терять время.

Включаем показ ошибок на время разбора:

// /bitrix/.settings.php: только на тестовом сайте или под своим адресом
'exception_handling' => ['value' => [
'debug' => true,
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_DEPRECATED,
]],

Белый экран - это фатальная ошибка при выключенном выводе. Текст её всегда есть в журнале PHP, а показ на экране нужен лишь тогда, когда до журнала не добраться.

Смотрим, что происходило в момент сбоя:

Окно терминала
# память, время и убитые процессы: три обычные причины обрыва
grep -iE 'memory|timeout|killed' /var/log/php-fpm/error.log | tail -10
dmesg | grep -i 'killed process' | tail -5
grep -c '502' /var/log/nginx/access.log
# всплеск в час пик - нехватка процессов, одиночные - конкретный запрос
ss -x | grep -c php-fpm
# отдельная частая причина такой картины - остановленная служба базы данных

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

Причины

  1. Фатальная ошибка в коде примерно 30% случаев

    ПризнакСтабильная 500 или белый экран на одних и тех же страницах.

    ПроверкаЧитаем журнал PHP: там есть файл и строка, где всё оборвалось.

    Что делатьПравим свой код или отключаем стороннее решение, вызвавшее ошибку; после обновлений это самая частая причина.

  2. Процессам PHP не хватает памяти примерно 25% случаев

    ПризнакОшибка появляется под нагрузкой и исчезает ночью.

    ПроверкаИщем в журналах сообщения о превышении памяти и записи ядра об убитых процессах.

    Что делатьПоднимаем предел памяти пулу и уменьшаем число процессов до влезающего в оперативную память.

  3. PHP не отвечает вовремя примерно 20% случаев

    ПризнакКод 504 на тяжёлых страницах или во время обмена с учётной системой.

    ПроверкаСверяем время ожидания в веб-сервере с временем выполнения в PHP.

    Что делатьПоднимаем оба предела согласованно, а долгие операции уводим в фон - в агенты и очереди.

  4. Служба PHP не запущена или перезапускается примерно 15% случаев

    ПризнакКод 502 на всех страницах сразу, включая статические разделы сайта.

    ПроверкаСмотрим состояние службы процессов PHP и сокет, в который стучится веб-сервер.

    Что делатьЗапускаем службу и разбираем причину падения по её журналу: чаще всего это ошибка в конфигурации пула.

  5. Кончилось место на диске примерно 10% случаев

    ПризнакОшибки появились разом, сайт не пишет ни кэш, ни журналы.

    ПроверкаСмотрим свободное место на разделах с сайтом, базой и журналами.

    Что делатьЧистим журналы, старые резервные копии и кэш; журналы после этого настраивают на ротацию.

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

Чем 500 отличается от 502?

Пятисотую отдаёт приложение, столкнувшись с ошибкой. Пятьсот вторую - веб-сервер, не получивший ответа от PHP: приложение до неё могло вообще не дойти.

Почему на экране пусто вместо текста ошибки?

Вывод ошибок выключен, как и положено на боевом сайте. Текст при этом пишется в журнал PHP и никуда не пропадает.

Ошибка появляется только в час пик - что смотреть?

Память и число процессов: под нагрузкой сайт упирается в пределы, которых хватает при одном посетителе. Журнал медленных запросов покажет, какие страницы тяжелее прочих.

Стоит ли включать показ ошибок на боевом сайте?

Нет: тексты ошибок раскрывают пути и структуру кода. На время разбора его включают точечно и сразу выключают обратно.

Смежное

Первоисточник