Ошибки 502 и 504 на сайте: что это и как исправить
Ошибки 502 и 504 означают, что «входная дверь» сайта работает, а тот, кто должен готовить страницы, не отвечает. Разбираемся, кто не отвечает и почему.
Как устроен типичный сайт
Перед сайтом почти всегда стоит nginx (или Cloudflare, или балансировщик хостинга). Он принимает запрос и передаёт его дальше: на PHP-FPM, Apache, приложение на Node или Python. Если «дальше» никто не ответил, nginx честно сообщает об этом посетителю кодом 502 или 504.
- 502 Bad Gateway: nginx постучался, а приложения нет (не запущено, упало, не то имя сокета) или оно ответило что-то невнятное.
- 504 Gateway Timeout: приложение есть, но не ответило за отведённое время (обычно 30 или 60 секунд).
Частые причины 502
- Упал PHP-FPM или приложение. Закончилась память на сервере, OOM-killer убил процесс. На VPS чинится перезапуском (
systemctl restart php8.2-fpm), а потом поиском того, кто съел память. - Приложение не поднялось после деплоя или перезагрузки. Ошибка в коде, не установилась зависимость, не тот порт. Смотрите лог приложения, а не nginx.
- Слишком много запросов. Все воркеры PHP заняты, новые запросы некуда принять. Часто это боты или атака, иногда просто рекламная кампания, которая привела больше людей, чем сервер тянет.
- Проблема у хостинга. На shared-хостинге 502 часто означает работы или перегрузку сервера. Проверьте статусную страницу хостинга и напишите в поддержку.
Частые причины 504
- Медленный запрос к базе. Страница каталога с 50 000 товаров без индексов в MySQL считается минуту. Помогает индекс, кеш или переписанный запрос.
- Внешний сервис не отвечает. Сайт ждёт ответа от 1С, CRM, платёжки, курса валют, и ждёт дольше таймаута. Правильно ставить таймаут на запрос и не блокировать страницу.
- Тяжёлые операции в момент запроса. Импорт, генерация отчёта, отправка рассылки прямо при открытии страницы вместо фоновой задачи.
Что сделать самому за пять минут
# Ошибки nginx: кто именно не ответил
tail -n 50 /var/log/nginx/error.log
# Живы ли процессы и сколько памяти свободно
systemctl status php8.2-fpm nginx
free -m
df -h
Если в error.log написано connect() failed (111: Connection refused), приложение не запущено. Если upstream timed out, это 504, и искать надо медленный запрос. Если No space left on device, диск заполнен.
proxy_read_timeout, fastcgi_read_timeout) иногда советуют как лекарство от 504. Это не лечение, а обезболивающее: посетитель будет ждать не 60, а 180 секунд и всё равно уйдёт. Причину медленного ответа нужно убирать.Починим сегодня, от 2 900 ₽
Опишите проблему, ИИ назовёт цену за минуту. Оплата после оценки, работа в тот же день, 14 дней гарантии.
Разработчик с 10-летним опытом, ИП, по оферте и с закрывающими документами.