Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
В ответ на вызовы API клиентское приложение получает HTTP-статус 504 с сообщением Gateway Timeout .
Данная ошибка указывает на то, что клиент не получил своевременного ответа от Apigee Edge или бэкэнд-сервера во время выполнения вызова API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 504 Gateway Time-out
При вызове такого прокси с помощью cURL или веб-браузера может возникнуть следующая ошибка:
<!DOCTYPE html> <html> <head> <title>Error</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>An error occurred.</h1> <p>Sorry, the page you are looking for is currently unavailable.<br/> Please try again later.</p> </body> </html>
Что вызывает тайм-ауты?
Типичный путь для запроса API через платформу Edge выглядит следующим образом: Клиент > Маршрутизатор > Обработчик сообщений > Сервер бэкэнда, как показано на следующем рисунке:

Все компоненты среды выполнения Apigee Edge, включая клиенты, маршрутизаторы, обработчики сообщений и бэкэнд-серверы, настроены с соответствующими значениями таймаута по умолчанию, чтобы гарантировать, что запросы к API не будут выполняться слишком долго. Если какой-либо из компонентов в потоке не получает ответ от вышестоящего компонента в течение периода времени, указанного в конфигурации таймаута, то этот компонент выдаст ошибку 504 Gateway Timeout .
В этом руководстве описано, как устранить ошибку 504 возникающую из-за превышения времени ожидания маршрутизатора.
Тайм-аут на маршрутизаторе
В Apigee Edge по умолчанию на маршрутизаторах установлено время ожидания 57 секунд. Это максимальное время, в течение которого API-прокси может работать с момента получения запроса API на Edge до отправки ответа, включая ответ от бэкэнда и все выполненные политики. Время ожидания по умолчанию можно изменить на маршрутизаторах/виртуальных хостах, как описано в разделе «Настройка времени ожидания ввода-вывода на маршрутизаторах» .
Возможные причины
В Edge типичными причинами ошибки 504 Gateway Timeout возникающей из-за превышения времени ожидания маршрутизатора, являются:
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
|---|---|---|
| Неправильная настройка тайм-аута на маршрутизаторе. | Это происходит, если маршрутизатор настроен с неправильным периодом ожидания ввода-вывода. | Пользователи публичных и частных облачных сервисов на периферии сети |
Общие этапы диагностики
Для диагностики этой ошибки воспользуйтесь одним из следующих инструментов/методов:
- мониторинг API
- Журналы доступа NGINX
мониторинг API
Для диагностики ошибки с помощью мониторинга API:
- Перейдите на страницу Анализ > Мониторинг API > Исследование .
- Отфильтруйте ошибки типа
5xxи выберите временной интервал. - Постройте график зависимости кода состояния от времени .
Щелкните по ячейке, отображающей ошибки
504чтобы увидеть более подробную информацию и просмотреть журналы этих ошибок, как показано ниже:Пример, демонстрирующий ошибки 504.

- В правой панели нажмите «Просмотреть журналы» .

В окне «Журнал трафика» обратите внимание на следующие сведения о некоторых ошибках
504:- Запрос: Здесь указываются метод запроса и URI, используемые для выполнения вызовов.
- Время ответа : Этот параметр показывает общее время, затраченное на обработку запроса.
В приведенном выше примере,
- Запрос указывает на
GET /test-timeout. - Время ответа составляет
57.001секунды. Это указывает на то, что маршрутизатор превысил время ожидания до того, как обработчик сообщений смог ответить, поскольку это значение очень близко к установленному по умолчанию времени ожидания ввода-вывода на маршрутизаторе, которое составляет 57 секунд.
Вы также можете получить все журналы, используя API мониторинга GET logs . Например, запросив журналы по
org,env,timeRangeиstatus, вы сможете загрузить все журналы транзакций, в которых произошло превышение времени ожидания клиента.Поскольку мониторинг API устанавливает для этих ошибок
504значение прокси-сервера как-(не задано), вы можете использовать API ( API журналов ), чтобы получить соответствующий прокси-сервер для виртуального хоста и пути.Например :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- Проверьте время ответа на наличие дополнительных ошибок
504и убедитесь, что время ответа остается неизменным (значение таймаута ввода-вывода, установленное на маршрутизаторе, составляет 57 секунд) для всех ошибок504.
Журналы доступа NGINX
Для диагностики ошибки с помощью журналов доступа NGINX:
- Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log - Выполните поиск, чтобы проверить наличие ошибок
504за определенный период времени (если проблема возникала ранее) или наличие запросов, которые по-прежнему завершаются с ошибкой504. - Обратите внимание на следующую информацию, касающуюся некоторых ошибок
504:- Время отклика
- URI запроса

В этом примере мы видим следующую информацию:
Время запроса:
57.001секунды. Это означает, что маршрутизатор превысил время ожидания через 57,001 секунды.- Запрос:
GET /test-timeout - Псевдоним хоста :
myorg-test.apigee.net
Проверьте, совпадает ли время запроса с таймаутом ввода-вывода, настроенным на маршрутизаторе/виртуальном хосте. Если да, то это означает, что маршрутизатор превысил время ожидания до того, как обработчик сообщений не ответил в течение этого периода.
В приведенном выше примере записи журнала доступа NGINX время запроса , равное
57.001секунды, очень близко к таймауту ввода-вывода по умолчанию, установленному на маршрутизаторе. Это явно указывает на то, что маршрутизатор превысил время ожидания до того, как обработчик сообщений смог ответить.- Определите API-прокси, для которого был сделан запрос, используя базовый путь в поле «Запрос» .
Причина: Неправильная настройка тайм-аута на маршрутизаторе.
Диагноз
- Определите, вызваны ли ошибки
504тем, что маршрутизатор превысил время ожидания до того, как обработчик сообщений смог ответить. Это можно сделать, проверив, совпадает ли время ответа в API-мониторинге/ время запроса в маршрутизаторе (оба поля представляют одну и ту же информацию, но называются по-разному) с таймаутом ввода-вывода, настроенным на маршрутизаторе/виртуальном хосте, и установлены ли значения полей «Источник ошибки» , «Прокси ошибки» и «Код ошибки»-используя журналы доступа API-мониторинга или NGINX, как описано в разделе «Общие шаги диагностики» . Проверьте, не ниже ли значение таймаута ввода-вывода, заданное на маршрутизаторе или конкретном виртуальном хосте, по сравнению со значением, заданным на обработчике сообщений или конкретном API-прокси.
Это можно сделать, выполнив действия, описанные в этом разделе.
Проверка таймаута ввода-вывода на виртуальных хостах
Edge UI
Чтобы проверить таймаут виртуального хоста с помощью пользовательского интерфейса Edge, выполните следующие действия:
- Войдите в пользовательский интерфейс Edge.
- Перейдите в раздел Администрирование > Виртуальные хосты .
- Выберите конкретную среду , в которой вы сталкиваетесь с проблемой превышения времени ожидания.
- Выберите конкретный виртуальный хост, для которого вы хотите проверить значение таймаута ввода-вывода.
- В разделе «Свойства» просмотрите значение параметра « Время ожидания чтения прокси-сервера» в секундах.

В приведенном выше примере параметр Proxy Read Timeout настроен на значение
120Это означает, что время ожидания ввода-вывода, настроенное на этом виртуальном хосте, составляет 120 секунд.
API управления
Вы также можете проверить время ожидания чтения через прокси-сервер, используя следующие API управления:
Выполните команду Get virtual host API, чтобы получить конфигурацию
virtualhost, как показано ниже:Пользователь публичного облака
curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
Пользователь частного облака
curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
Где:
ORGANIZATION_NAME — это название организации.
ENVIRONMENT_NAME — это имя среды.
VIRTUALHOST_NAME — это имя виртуального хоста.
Проверьте значение, заданное для свойства
proxy_read_timeoutПример определения виртуального хоста
{ "hostAliases": [ "api.myCompany,com", ], "interfaces": [], "listenOptions": [], "name": "secure", "port": "443", "retryOptions": [], "properties": { "property": [ { "name": "proxy_read_timeout", "value": "120" } ] }, "sSLInfo": { "ciphers": [], "clientAuthEnabled": "false", "enabled": "true", "ignoreValidationErrors": false, "keyAlias": "myCompanyKeyAlias", "keyStore": "ref://myCompanyKeystoreref", "protocols": [] }, "useBuiltInFreeTrialCert": false }В приведенном выше примере
proxy_read_timeoutнастроен на значение120Это означает, что время ожидания ввода-вывода, настроенное на этом виртуальном хосте, составляет 120 секунд.
Проверка таймаута ввода-вывода в файле router.properties.
- Войдите в систему маршрутизатора.
- Найдите свойство
proxy_read_timeoutв каталоге/opt/nginx/conf.dи проверьте, установлено ли для него новое значение, как показано ниже:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
Проверьте значение параметра
proxy_read_timeout, установленного в конфигурационном файле конкретного виртуального хоста.Пример результата выполнения команды grep.
/opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57; /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
В приведенном выше примере обратите внимание, что свойство
proxy_read_timeoutбыло установлено на новое значение57в файле конфигурации0-default.conf, который является файлом конфигурации для виртуального хоста по умолчанию. Это указывает на то, что время ожидания ввода-вывода настроено на 57 секунд на маршрутизаторе для виртуального хоста по умолчанию . Если у вас несколько виртуальных хостов, вы увидите эту информацию для каждого из них. Получите значениеproxy_read_timeoutдля конкретного виртуального хоста, который вы использовали для выполнения вызовов API, завершившихся ошибками504.
Проверка таймаута ввода-вывода в API-прокси
Время ожидания ввода-вывода можно посмотреть по следующей ссылке:
- Целевая конечная точка API-прокси
- Политика вызовов сервисов API-прокси
Просмотр таймаута ввода-вывода в целевой конечной точке API-прокси
- В пользовательском интерфейсе Edge выберите конкретный API-прокси, для которого вы хотите просмотреть значение таймаута ввода-вывода.
- Выберите конкретную целевую точку, которую вы хотите проверить.
- См. свойство
io.timeout.millisс соответствующим значением в элементе<HTTPTargetConnection>в конфигурацииTargetEndpoint.Например, в следующем коде время ожидания ввода-вывода установлено на 120 секунд:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
Просмотр таймаута ввода-вывода в политике ServiceCallout API-прокси
- В пользовательском интерфейсе Edge выберите конкретный API-прокси, в котором вы хотите просмотреть новое значение таймаута ввода-вывода для политики ServiceCallout.
- Выберите конкретную политику ServiceCallout, которую вы хотите проверить.
См. элемент
<Timeout>с соответствующим значением в конфигурации<ServiceCallout>.Например, время ожидания ввода-вывода в следующем коде составит 120 секунд:
<Timeout>120000</Timeout>
Проверка таймаута ввода-вывода в обработчиках сообщений.
- Войдите в систему обработки сообщений.
Найдите свойство
HTTPTransport.io.timeout.millisв каталоге/opt/apigee/edge-message-processor/confиспользуя следующую команду:grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
Пример выходных данных
/opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
- В приведенном выше примере обратите внимание, что свойство
HTTPTransport.io.timeout.millisвhttp.propertiesустановлено со значением55000Это указывает на то, что таймаут ввода-вывода успешно настроен на 55 секунд в обработчике сообщений.
После определения значения тайм-аута, настроенного на маршрутизаторе и обработчике сообщений, проверьте, не установлено ли на маршрутизаторе/виртуальном хосте меньшее значение тайм-аута по сравнению с обработчиком сообщений/API-прокси.
Запишите значения, установленные для всех слоев, как показано в таблице ниже:
| Тайм-аут на маршрутизаторе (секунды) | Истекло время ожидания на виртуальном хосте (в секундах) | Истекло время ожидания в обработчике сообщений (в секундах) | Истекло время ожидания на API-прокси (в секундах) |
|---|---|---|---|
| 57 | - | 55 | 120 |
В этом примере,
- Значение по умолчанию, равное 57 секундам, задано на маршрутизаторе.
- Значение тайм-аута не задано для конкретного виртуального хоста. Это означает, что будет использоваться значение по умолчанию, равное 57 секундам, настроенное на самом маршрутизаторе.
- В процессоре сообщений по умолчанию установлено значение 55 секунд.
- Однако для конкретного API-прокси установлено значение 120 секунд.
Обратите внимание, что более высокое значение таймаута настроено только на API-прокси, но маршрутизатор по-прежнему настроен на 57 секунд. Следовательно, маршрутизатор выдает ошибку таймаута через 57 секунд, пока обработчик сообщений/бэкэнд все еще обрабатывает ваш запрос. Это приводит к тому, что маршрутизатор отправляет клиентскому приложению ответ с ошибкой 504 Gateway Timeout .
Разрешение
Для решения этой проблемы выполните следующие шаги, чтобы настроить правильное время ожидания ввода-вывода на маршрутизаторе и процессоре сообщений.
- Обратитесь к разделу «Рекомендации по настройке таймаута ввода-вывода» , чтобы понять, какие значения таймаута следует установить для различных компонентов, участвующих в потоке запросов API через Apigee Edge.
- В приведенном выше примере, если вы определили, что необходимо установить более высокое значение таймаута, поскольку серверная часть требует больше времени, и вы увеличили значение таймаута обработчика сообщений до 120 секунд, установите более высокое значение таймаута. Например:
123 secondsна маршрутизаторе. Чтобы избежать влияния нового значения таймаута на все API-прокси, установите значение123 secondsтолько для конкретного виртуального хоста , используемого в конкретном API-прокси. - Чтобы установить время ожидания на виртуальном хосте, следуйте инструкциям в разделе «Настройка таймаута ввода-вывода на маршрутизаторах» .