← Все статьи

SiteGuard13 мин чтения

Ошибка 504 Gateway Timeout: почему сервер не дождался ответа

Ошибка 504 Gateway Timeout означает, что сервер, работающий как шлюз или прокси, не дождался своевременного ответа от другого сервера. Посетитель видит сообщение «Тайм-аут шлюза», а нужное действие остаётся без понятного результата. Причина может находиться в соединении, очереди приложения, медленной базе данных или внешнем сервисе.

Сам код не показывает, какой именно таймер сработал. Чтобы исправить 504, владельцу нужно найти задержавшийся этап и сопоставить его с действующим ограничением времени. Ниже — порядок диагностики, особенности Nginx, действия посетителя и проверка восстановления. Отдельно разберём, почему увеличение тайм-аута помогает не всегда и как не получить дубликат заказа при повторной попытке.

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

Сайт может обслуживать цепочка компонентов: CDN принимает обращение, прокси передаёт его приложению, а приложение запрашивает базу или API. В роли шлюза способен выступать любой соответствующий промежуточный сервер. Вышестоящий обработчик, к которому он обращается, часто называют upstream.

По RFC 9110 статус 504 связан с отсутствием своевременного ответа от необходимого upstream-сервера. Формулировки Gateway Timeout и Gateway Time-out обозначают этот же HTTP-статус. Общий смысл также объясняет справочник MDN.

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

Соседние статусы отличаются направлением проверки: 500 указывает на внутренний сбой, 502 — на некорректный ответ шлюзу, 503 — на временную невозможность обслужить запрос. Для 504 особенно важны длительность и этап ожидания. Но автоматически считать его доказательством перегрузки нельзя.

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

Что делать посетителю сайта при ошибке 504

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

  1. Сохраните незавершённый текст. Перед закрытием формы скопируйте доступные введённые данные.
  2. Проверьте значимую операцию. После оплаты, заказа или заявки посмотрите историю в кабинете либо уточните результат у поддержки. Ошибка ответа не доказывает, что запись не появилась.
  3. Повторите обычное открытие позже. Для чтения страницы достаточно одной проверки после паузы. Если отказ остаётся, запишите время и адрес.
  4. Уточните масштаб. Открывается ли главная, работает ли другой раздел, сообщал ли сервис о сбое?
  5. Передайте наблюдения владельцу. Укажите действие, текст сообщения и время с часовым поясом, а не только фразу «сайт не работает».

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

Как владельцу найти запрос, который не дождался ответа

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

Подтвердите HTTP-статус и длительность

Откройте Network («Сеть») в инструментах разработчика браузера. Найдите запрос со статусом 504, посмотрите его адрес, метод, заголовки, ответ и временные показатели. Возможности панели описаны в документации Chrome DevTools. Отличайте отказ основного документа от ошибки фонового запроса.

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

Сопоставьте журналы и этапы

Опишите фактический путь: браузер, CDN, балансировщик, прокси, приложение, зависимый сервис. Найдите событие в журналах по времени и идентификатору запроса. Установите, кто сформировал 504, а кто только передал его дальше. Логотип CDN или надпись nginx на странице сами по себе не отвечают на этот вопрос.

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

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

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

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

Сравните успешные и неуспешные случаи

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

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

Основные причины ошибки 504 и способы исправления

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

НаблюдениеВозможная причинаЧто проверить
Соединение с upstream не устанавливается вовремяПроблема адреса, маршрута или сетевого доступаАдрес, порт, доступность обработчика и сетевые события
Соединение установлено, заголовок долго не приходитОчередь либо медленная обработкаВремя входа в приложение и занятые исполнители
Сбой связан с большим отчётомДорогой запрос к базе или обработка большого набораДлительность этапов и объём данных
Тайм-аут возникает при обращении к партнёруМедленный внешний API или лишние повторыВремя вызова зависимости и политику клиента
Отказы появляются только на одном узлеРазличия конфигурации или состоянияВерсию, зависимости и журналы конкретного узла

Задержка соединения или передачи данных

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

У разных шлюзов один статус охватывает разные ситуации. Например, AWS Application Load Balancer перечисляет для 504 как проблемы установления соединения, так и ожидание ответа уже подключённой цели. Его конкретные пределы не следует переносить на другой балансировщик.

Приложение ждёт свободного исполнителя

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

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

Медленная база данных или внешний API

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

Исправляйте конкретное место: ограничивайте ненужный объём выборки, исследуйте медленный запрос, проверяйте договорённые сроки внешнего вызова. Не меняйте все настройки базы одновременно. Для зависимости заранее определите, какой результат увидит пользователь при недоступности, и обеспечьте корректное завершение либо перенос задачи.

Слишком долгая работа выполняется внутри веб-запроса

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

Для такого подхода может использоваться 202 Accepted. MDN уточняет: этот статус означает принятие запроса к обработке, а не её успешное завершение. Очереди нужны собственные ограничения, обработка ошибок и контроль результата; простая замена 504 на 202 ничего не исправляет.

Какие тайм-ауты проверить в Nginx и всей цепочке

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

Подключение, отправка и чтение — разные этапы

В Nginx proxy_connect_timeout относится к установлению соединения с HTTP-upstream. proxy_send_timeout задаёт допустимый промежуток между последовательными операциями записи при передаче запроса. Для ожидания данных ответа используется proxy_read_timeout. Назначение директив приведено в документации прокси-модуля.

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

Не подменяйте одну директиву другой. Если маршрут передаётся PHP-FPM через FastCGI, изменение только HTTP-проксирования может не затронуть нужный этап. Сначала выясните способ обработки, сообщение журнала и точный предел, который был достигнут.

Согласуйте сроки на нескольких уровнях

Даже если приложение готово ждать долго, внешний шлюз может завершить ожидание раньше. Составьте для конкретного сценария список действующих ограничений: CDN, балансировщик, прокси, приложение и клиент внешнего API. Уточните, какие значения управляемы, какие установлены поставщиком и что происходит после истечения срока.

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

Условный пример: общий допустимый срок внешнего обработчика равен 35 секундам, а клиент поставщика выполняет две последовательные попытки по 20 секунд каждая. Уже эти попытки занимают больше времени, чем предусмотрено снаружи; к ним могут добавиться паузы и обработка. Это учебные числа, а не рекомендуемые настройки. Проверьте реальную политику библиотеки: дополнительные попытки иногда включены внутри неё и не видны в коде одного вызова.

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

Когда увеличение тайм-аута обоснованно

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

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

Пример: 504 при формировании отчёта

Рассмотрим условный случай. Отчёт за короткий период открывается, а за длительный возвращает 504. Журнал прокси показывает ожидание ответа приложения. Внутренние измерения подтверждают, что большая часть времени уходит на запрос к базе, а не на установление соединения.

Команда проверяет параметры выборки и условия выполнения на тестовой среде. Находит ненужную обработку большого массива данных и исправляет её. Затем сравнивает оба варианта отчёта при сопоставимых условиях: важны длительность, правильность содержимого и влияние на другие обращения.

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

Другой возможный исход — измерения показывают, что приложение быстро закончило работу, но ответ не дошёл через промежуточный уровень. Тогда оптимизация базы не объясняет сбой: нужно исследовать передачу ответа и соответствующий журнал. Одинаковый 504 не означает одинаковое исправление.

Как проверить, что ошибка 504 устранена

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

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

Для заказа или платежа сначала выясняйте состояние предыдущей попытки. Используйте защиту от повторов, если она предусмотрена контрактом API; произвольный заголовок не создаёт гарантии идемпотентности. Не включайте дополнительные повторы на каждом уровне только ради уменьшения числа видимых ошибок.

Продумайте и сообщение в интерфейсе. Когда результат ещё неизвестен, не утверждайте, что заказ точно отменён. Если приложение умеет проверять состояние по идентификатору, покажите промежуточный статус и способ получить окончательный ответ. Если такой возможности нет, предложите обращение в поддержку с номером операции. Такое поведение нужно реализовать и проверить отдельно: один новый текст на странице ошибки не обеспечивает сохранность данных.

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

Как замечать повторные тайм-ауты и учитывать SEO

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

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

По документации Google серверные ошибки замедляют обход, а URL с устойчивыми отказами со временем могут исключаться из индекса. Один ответ 504 не позволяет предсказать потерю позиций. После восстановления проверяйте доступность важных страниц и отчёты поиска без обещаний фиксированного срока возвращения трафика.

Что написать хостингу или разработчику

Передайте URL, метод, точное время с часовым поясом, действие, длительность до отказа и идентификатор запроса. Добавьте масштаб проблемы, сведения о недавних изменениях и результат сравнения с успешным случаем. Если доступны журналы, приложите относящийся к событию фрагмент без паролей, cookies и токенов.

Условный шаблон: «Формирование большого отчёта возвращает HTTP 504, короткий отчёт работает. Просим сопоставить запрос с журналом прокси и приложения, определить этап ожидания и сработавший предел». Замените описание своими наблюдениями. Просьба найти конкретное ограничение полезнее общего требования увеличить все тайм-ауты.

Частые вопросы об ошибке 504 Gateway Timeout

504 означает, что у посетителя медленный интернет?

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

Почему ошибка появляется всегда через одинаковое время?

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

Можно ли просто увеличить proxy_read_timeout?

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

Операция точно не выполнилась, если вернулся 504?

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

Поможет ли перезапуск сервера?

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

Когда исправление можно считать завершённым?

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