Зафиксировать время
Точный момент ошибки нужен для сопоставления с логами.
Практическая диагностика · сервер
Если ошибка появляется не постоянно, одиночная проверка страницы почти ничего не доказывает. Нужно понять, кто именно возвращает 502/504, в какой момент это происходит и что в это время происходило с backend, PHP, базой данных и нагрузкой.
Быстрый маршрут
Не перезапускаем всё подряд. Сначала фиксируем код, время, URL и слой, который его отдал.
Точный момент ошибки нужен для сопоставления с логами.
Понять, падает весь сайт или отдельный тип страниц.
502 чаще означает плохой ответ upstream, 504 — ожидание истекло.
Nginx/Apache, PHP-FPM, приложение и база показывают разные части цепочки.
CPU, RAM, swap, диски, процессы и лимиты соединений.
Шаг 1
В типичной схеме запрос проходит через nginx или другой reverse proxy к PHP-FPM, контейнеру, Node.js-приложению или внешнему upstream. 502 означает, что прокси не получил корректный ответ от следующего звена; 504 — что ответ не пришёл вовремя.
Если ошибка видна только на одной части сайта, например в каталоге или поиске, это уже сильная подсказка: общий веб-сервер жив, а проблема локализуется в конкретном backend-сценарии.
Шаг 2
Ищем записи вида upstream timed out, connection refused, prematurely closed connection, PHP fatal error, exhausted memory, deadlock или slow query. Важно смотреть несколько журналов с одной временной меткой, а не один error.log.
Если 504 появляется ровно через одинаковый интервал, например 30 или 60 секунд, проверяем timeout на прокси и реальную длительность backend-операции. Увеличивать timeout без поиска причины опасно: это может только дольше удерживать занятые воркеры.
Шаг 3
Для PHP-проектов частая причина — очередь запросов к PHP-FPM: все воркеры заняты долгими операциями, а новые запросы ждут или получают отказ. Для Node/Java-приложений аналогичный эффект создают зависшие процессы, event loop, pool соединений или аварийный restart.
Если ошибка совпадает с импортом, резервным копированием, cron или тяжёлым отчётом, проблема может быть не в веб-запросе как таковом, а в конкуренции за CPU, память или базу.
Шаг 4
Средние 20% CPU за час не исключают короткий пик до 100% всех ядер. То же относится к памяти: OOM может убить PHP/MySQL за секунды, после чего график быстро возвращается к норме.
Проверяем swap, iowait, свободное место, количество процессов, OOM-события и лимиты файловых дескрипторов. На виртуальном сервере дополнительно учитываем ограничения самого тарифа.
curl -I https://example.ru/Фиксирует текущий HTTP-код, но не заменяет наблюдение во времени.
free -hПоказывает RAM и swap; важна динамика около момента ошибки.
uptimeLoad average помогает увидеть очередь, но требует контекста по числу CPU.
Шаг 5
Страница может зависать, пока приложение ждёт MySQL, Redis, API платёжной системы, CRM или другого сервиса. Reverse proxy видит только то, что upstream не отвечает вовремя.
Если 504 возникает на определённой операции, трассируем именно её: медленные SQL-запросы, блокировки таблиц, DNS внешнего API, сетевые таймауты и повторные попытки.
Практический пример
Днём сайт работает нормально, а около 19:00 отдельные запросы начинают отдавать 502. Простая ручная проверка утром не воспроизводит проблему, поэтому кажется, что ошибка случайна.
Сопоставляем время сбоя с nginx error log, PHP-FPM и системными метриками. В момент ошибки видно, что все PHP-воркеры заняты тяжёлыми запросами каталога, очередь растёт, а часть соединений upstream закрывается.
| Наблюдение | Вывод |
|---|---|
| Ошибка только в пиковое время | ищем зависимость от нагрузки |
| upstream errors в ту же минуту | проблема после nginx |
| PHP-FPM pool заполнен | нужно разбирать долгие запросы и размер пула |
Типовые сценарии
Код сам по себе не называет виновника, но сочетание времени, URL и логов сильно сужает поиск.
| Симптом | Вероятная зона | Что проверить |
|---|---|---|
| 502 сразу после deploy | backend не стартовал или сокет недоступен | процесс, socket/port, конфигурацию upstream |
| 504 через одинаковые 60 секунд | backend выполняется дольше timeout | медленную операцию и timeout-цепочку |
| 502 только под нагрузкой | заканчиваются воркеры/соединения/память | PHP-FPM pool, DB pool, RAM, OOM |
| 504 только в одной функции | тяжёлый SQL или внешний API | логи приложения, slow query, API timeout |
| Ошибки ночью | cron, backup, импорт | расписание фоновых задач и ресурсы |
Чего не делать
После restart исчезает важное состояние, а причина остаётся.
Долгий запрос начинает занимать ресурсы ещё дольше.
Причина часто находится в PHP, приложении или базе.
Короткие пики и OOM могут не быть видны по среднему графику.
Чек-лист
Когда нужен доступ к проекту
Если для проверки нужны error log, настройки FPM, slow query и системные метрики, без серверного доступа остаются только предположения. Передавайте специалисту точное время, URL и код — это резко ускоряет поиск причины.
Вопросы
502 обычно означает некорректный или недоступный ответ upstream, 504 — что прокси не дождался ответа вовремя.
Иногда как временная мера, но сначала нужно понять, почему операция стала такой долгой.
Restart освобождает память и очереди, но это не доказывает, что первопричина устранена.
Иногда по симптомам можно сузить область, но периодические ошибки надёжнее всего диагностируются по журналам и метрикам в тот же момент.