Ошибка 504 Gateway Timeout на сайте и как ее исправить

Сайт открывается нормально, но одна страница внезапно зависает, а спустя некоторое время вместо нее появляется 504 Gateway Timeout. Или ошибка возникает только в часы высокой посещаемости, при импорте товаров, формировании большого отчета или выполнении другого тяжелого действия.

В таких случаях проблема часто связана не с тем, что сервер полностью перестал работать. Наоборот, часть инфраструктуры остается доступной и успевает принять запрос посетителя. Но следующее звено слишком долго не дает необходимого ответа.

Именно поэтому 504 полезно воспринимать не просто как очередную серверную ошибку, а как подсказку. Где-то внутри цепочки обработки запроса возникло слишком долгое ожидание.

Что означает ошибка 504 Gateway Timeout

Современный сайт редко работает по принципу браузер обратился к серверу и тот мгновенно отдал готовую страницу. Между посетителем и приложением может находиться несколько компонентов.

Упрощенная схема выглядит так:

  • посетитель запрашивает страницу;
  • запрос принимает веб-сервер или прокси;
  • он обращается к следующему серверу или приложению;
  • приложение выполняет необходимую работу;
  • результат возвращается обратно посетителю.

В этой цепочке могут участвовать Nginx, Apache, PHP-FPM, CDN, балансировщик нагрузки, контейнер с приложением и другие компоненты.

Код 504 означает, что сервер, работающий как шлюз или прокси, не получил своевременный ответ от вышестоящего сервера, который был нужен для завершения запроса.

Проще представить это на бытовом примере.

Вы пришли в пункт выдачи и попросили сотрудника принести заказ со склада. Сотрудник запрос принял, отправил его на склад и ждет. Проходит допустимое время, но склад так и не отвечает. В результате сотрудник вынужден сообщить, что выполнить запрос не удалось.

С сайтом происходит нечто похожее.

При этом 504 легко перепутать с недавно рассмотренной ошибкой 502 Bad Gateway. Обе связаны с работой шлюза или прокси, но смысл у них различается.

При 502 промежуточный сервер получил от следующего звена некорректный ответ. При 504 необходимый ответ не был получен вовремя.

Разница кажется небольшой, но для диагностики она важна.

Если приложение отвечает неправильно или соединение с ним нарушено, направление поиска будет одним. Если приложение работает, но выполняет запрос слишком долго, другим.

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

Возможно, следующий запрос просто выполнился быстрее.

Если 504 регулярно видят разные посетители, очистка кэша браузера и переустановка браузера почти наверняка не устранят настоящую причину.

Почему появляется 504 Gateway Timeout

Одна из самых очевидных причин заключается в слишком долгой работе приложения.

Допустим, пользователь открывает обычную страницу каталога. PHP обращается к базе данных, получает данные и за доли секунды формирует результат. Все работает нормально.

Затем запускается страница, которая должна обработать несколько десятков тысяч записей. Приложение продолжает работать, но результат формируется слишком долго. Прокси перестает ждать и закрывает соединение.

Посетитель получает 504.

Похожее происходит с тяжелыми запросами к базе данных.

Сам сервер базы может оставаться полностью работоспособным. Но конкретный SQL-запрос выполняется настолько долго, что приложение не успевает сформировать страницу за время, которое готов ждать следующий компонент цепочки.

Особенно подозрительна ситуация, когда 504 возникает только на определенных страницах.

Например:

  • главная страница открывается быстро;
  • обычные статьи работают;
  • карточки товаров доступны;
  • а сложный фильтр каталога регулярно заканчивается 504.

Это уже сильный повод искать проблему в логике конкретного запроса, базе данных или приложении, а не считать весь хостинг неработающим.

Другая распространенная причина связана с внешними сервисами.

Сайт может во время формирования страницы обращаться к API платежной системы, CRM, службе доставки или другому серверу.

Если внешний сервис отвечает медленно, ваше приложение тоже начинает ждать. В результате посетитель сталкивается с 504, хотя исходная задержка возникла вообще за пределами вашего сервера.

Поэтому при диагностике важно учитывать не только PHP и базу данных, но и все внешние зависимости проекта.

504 может появляться и из-за недостатка ресурсов.

Когда процессор постоянно загружен, заканчивается оперативная память или одновременно выполняется слишком много тяжелых процессов, сервер начинает обслуживать запросы медленнее.

То, что раньше выполнялось за секунду, теперь занимает десять или двадцать секунд. Более тяжелая операция растягивается еще сильнее и в какой-то момент перестает укладываться в допустимое время ожидания.

На виртуальном хостинге похожая ситуация возможна при достижении ограничений тарифа. Конкретная реализация лимитов зависит от провайдера, поэтому по одному коду 504 нельзя определить, какой именно ресурс закончился.

Нужно смотреть статистику аккаунта и журналы ошибок.

На VPS следует проверить как минимум:

  • загрузку процессора;
  • использование оперативной памяти;
  • состояние swap;
  • свободное место на диске;
  • дисковую нагрузку;
  • работу PHP-FPM;
  • состояние базы данных;
  • очереди и фоновые задачи;
  • логи веб-сервера и приложения.

Еще один характерный сценарий связан с периодическими задачами.

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

Если 504 появляется примерно в одно и то же время, стоит проверить Cron, резервное копирование, импорт, создание отчетов и другие запланированные процессы.

В этом случае сама периодичность ошибки становится важной подсказкой.

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

Например, Nginx при проксировании использует ограничения времени ожидания ответа. Если upstream не передает данные достаточно долго, соединение закрывается.

Но здесь есть ловушка: обнаружив слово timeout, владелец VPS может сразу решить, что достаточно увеличить соответствующее значение.

Иногда это действительно необходимо. Например, приложение по своей природе выполняет долгую операцию, и существующее ограничение объективно слишком маленькое.

Но очень часто увеличение таймаута просто маскирует проблему.

Если страница должна формироваться за секунду, а выполняется полторы минуты из-за неоптимального запроса к базе, заставлять Nginx ждать еще дольше не является нормальной оптимизацией.

Посетитель все равно будет смотреть на зависшую страницу.

Как найти причину ошибки 504

Первое, что стоит определить, это масштаб проблемы.

Проверьте главную страницу, несколько внутренних страниц и тот адрес, на котором появилась ошибка.

Если 504 возникает абсолютно везде, проблема может затрагивать общий компонент сайта или инфраструктуры.

Если ошибка появляется только при конкретном действии, это намного более полезная ситуация для диагностики.

Предположим, сайт работает до тех пор, пока пользователь не применит определенный фильтр. Тогда можно воспроизвести проблему и искать, что именно происходит при этом запросе.

Следующий вопрос: когда появилась ошибка?

Если несколько минут назад был установлен плагин, изменен код или запущен импорт, начинать диагностику следует с этого события.

Если сайт месяцами не менялся, но 504 стала появляться по вечерам, стоит проверить нагрузку и изменение посещаемости.

Очень полезны журналы.

Лог веб-сервера помогает увидеть проблему со стороны прокси. Лог приложения может показать, какой процесс выполнялся в этот момент. Журнал базы данных и инструменты анализа медленных запросов способны указать на запрос, который занимает аномально много времени.

Важно сопоставлять события по времени.

Допустим, внешний мониторинг зафиксировал 504 в 18:42. В этот же момент в системной статистике виден резкий рост загрузки процессора, а в журнале приложения началась тяжелая обработка данных.

Такое совпадение намного полезнее случайного изменения десятка параметров сервера.

Если сайт использует внешнее API, проверьте его отдельно.

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

Поэтому внешние HTTP-запросы должны иметь разумные ограничения времени ожидания и корректную обработку ошибок.

Не каждая внешняя служба должна иметь возможность заставить весь сайт ждать бесконечно.

Если используется CDN или внешний reverse proxy, появляется еще один уровень.

Нужно понять, кто именно возвращает 504.

Иногда промежуточный сервис доступен посетителю, но не может вовремя получить ответ от исходного сервера. В таком случае сам CDN работает, а проблема находится дальше по цепочке.

На VPS дополнительно стоит проверить конфигурацию Nginx или другого прокси.

У Nginx, например, существуют отдельные параметры времени подключения к upstream, отправки запроса и чтения ответа. Причем время чтения обычно относится к интервалу между операциями чтения, а не просто к общей продолжительности передачи всей страницы.

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

Если вы не администрируете сервер самостоятельно, лучше не экспериментировать с системной конфигурацией.

На виртуальном хостинге соберите информацию и обратитесь в поддержку.

Полезное обращение выглядит примерно так: ошибка 504 появляется на конкретной странице с 15:20, остальные страницы работают, проблема воспроизводится при запуске фильтра каталога, до этого был выполнен импорт товаров.

Такое описание дает специалисту гораздо больше, чем сообщение сайт иногда тормозит.

Почему увеличение таймаута не всегда решает проблему

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

Но сначала нужно ответить на другой вопрос: почему сервер вообще не успевает?

Если операция действительно должна выполняться долго, возможно, ее стоит вынести из обычного веб-запроса.

Например, создание большого архива, массовая обработка изображений, импорт десятков тысяч товаров или генерация сложного отчета могут выполняться фоново.

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

Такой подход зачастую надежнее, чем заставлять HTTP-соединение оставаться открытым несколько минут.

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

Если не хватает ресурсов, следует выяснить, почему они заканчиваются.

Иногда достаточно исправить один неудачный процесс. В другой ситуации проект действительно вырос из текущего тарифа.

Если 504 появляется во время резервного копирования, импорта или Cron-задачи, можно пересмотреть расписание и снизить конкуренцию тяжелых процессов за ресурсы.

Если проблема связана с внешним API, приложение должно уметь переживать его недоступность или медленный ответ.

И только когда нормальная операция действительно требует большего времени, имеет смысл корректировать таймауты соответствующего уровня.

При этом менять их нужно согласованно.

В цепочке может существовать несколько ограничений: CDN, балансировщик, Nginx, приложение, PHP и внешний сервис. Увеличение одного параметра не гарантирует, что другое звено не завершит ожидание раньше.

Есть и еще одна причина не устанавливать огромные таймауты без необходимости.

Медленные запросы занимают рабочие процессы и соединения. Если таких запросов станет много, они способны сами создать дополнительную нагрузку и ухудшить положение.

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

Если 504 появилась один раз и больше не повторяется, причиной мог быть кратковременный сбой или единичная перегрузка. Но регулярные Gateway Timeout уже требуют диагностики.

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

На виртуальном хостинге повторяющиеся 504 могут стать поводом проверить потребление ресурсов и обсудить ситуацию с поддержкой. На VPS нужно дополнительно анализировать серверные службы, приложение и базу данных.

А если сайт стабильно упирается в ресурсы даже после оптимизации, стоит оценить более производительный тариф или переход на VPS.

Главное при ошибке 504 не превращать диагностику в соревнование по увеличению таймаутов. Gateway Timeout сообщает не только о том, что ожидание закончилось. Он показывает, что одно из звеньев сайта отвечает слишком медленно.

Найдите это звено, и тогда получится устранить причину ошибки, а не просто заставить посетителя ждать ее появления дольше.

Оцените статью
Рейтинг хостингов
Добавить комментарий