504 Gateway timeout — тайм-аут маршрутизатора

Вы просматриваете документацию 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:

  1. Перейдите на страницу Анализ > Мониторинг API > Исследование .
  2. Отфильтруйте ошибки типа 5xx и выберите временной интервал.
  3. Постройте график зависимости кода состояния от времени .
  4. Щелкните по ячейке, отображающей ошибки 504 чтобы увидеть более подробную информацию и просмотреть журналы этих ошибок, как показано ниже:

    Пример, демонстрирующий ошибки 504.

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

    В окне «Журнал трафика» обратите внимание на следующие сведения о некоторых ошибках 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
    
  6. Проверьте время ответа на наличие дополнительных ошибок 504 и убедитесь, что время ответа остается неизменным (значение таймаута ввода-вывода, установленное на маршрутизаторе, составляет 57 секунд) для всех ошибок 504 .

Журналы доступа NGINX

Для диагностики ошибки с помощью журналов доступа NGINX:

  1. Проверьте журналы доступа NGINX:
    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
  2. Выполните поиск, чтобы проверить наличие ошибок 504 за определенный период времени (если проблема возникала ранее) или наличие запросов, которые по-прежнему завершаются с ошибкой 504 .
  3. Обратите внимание на следующую информацию, касающуюся некоторых ошибок 504 :
    • Время отклика
    • URI запроса

    В этом примере мы видим следующую информацию:

    • Время запроса: 57.001 секунды. Это означает, что маршрутизатор превысил время ожидания через 57,001 секунды.

    • Запрос: GET /test-timeout
    • Псевдоним хоста : myorg-test.apigee.net
  4. Проверьте, совпадает ли время запроса с таймаутом ввода-вывода, настроенным на маршрутизаторе/виртуальном хосте. Если да, то это означает, что маршрутизатор превысил время ожидания до того, как обработчик сообщений не ответил в течение этого периода.

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

  5. Определите API-прокси, для которого был сделан запрос, используя базовый путь в поле «Запрос» .

Причина: Неправильная настройка тайм-аута на маршрутизаторе.

Диагноз

  1. Определите, вызваны ли ошибки 504 тем, что маршрутизатор превысил время ожидания до того, как обработчик сообщений смог ответить. Это можно сделать, проверив, совпадает ли время ответа в API-мониторинге/ время запроса в маршрутизаторе (оба поля представляют одну и ту же информацию, но называются по-разному) с таймаутом ввода-вывода, настроенным на маршрутизаторе/виртуальном хосте, и установлены ли значения полей «Источник ошибки» , «Прокси ошибки» и «Код ошибки» - используя журналы доступа API-мониторинга или NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Проверьте, не ниже ли значение таймаута ввода-вывода, заданное на маршрутизаторе или конкретном виртуальном хосте, по сравнению со значением, заданным на обработчике сообщений или конкретном API-прокси.

    Это можно сделать, выполнив действия, описанные в этом разделе.

Проверка таймаута ввода-вывода на виртуальных хостах

Edge UI

Чтобы проверить таймаут виртуального хоста с помощью пользовательского интерфейса Edge, выполните следующие действия:

  1. Войдите в пользовательский интерфейс Edge.
  2. Перейдите в раздел Администрирование > Виртуальные хосты .
  3. Выберите конкретную среду , в которой вы сталкиваетесь с проблемой превышения времени ожидания.
  4. Выберите конкретный виртуальный хост, для которого вы хотите проверить значение таймаута ввода-вывода.
  5. В разделе «Свойства» просмотрите значение параметра « Время ожидания чтения прокси-сервера» в секундах.

    В приведенном выше примере параметр Proxy Read Timeout настроен на значение 120 Это означает, что время ожидания ввода-вывода, настроенное на этом виртуальном хосте, составляет 120 секунд.

API управления

Вы также можете проверить время ожидания чтения через прокси-сервер, используя следующие API управления:

  1. Выполните команду 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 — это имя виртуального хоста.

  2. Проверьте значение, заданное для свойства 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.

  1. Войдите в систему маршрутизатора.
  2. Найдите свойство proxy_read_timeout в каталоге /opt/nginx/conf.d и проверьте, установлено ли для него новое значение, как показано ниже:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Проверьте значение параметра 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-прокси
  1. В пользовательском интерфейсе Edge выберите конкретный API-прокси, для которого вы хотите просмотреть значение таймаута ввода-вывода.
  2. Выберите конкретную целевую точку, которую вы хотите проверить.
  3. См. свойство io.timeout.millis с соответствующим значением в элементе <HTTPTargetConnection> в конфигурации TargetEndpoint .

    Например, в следующем коде время ожидания ввода-вывода установлено на 120 секунд:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
Просмотр таймаута ввода-вывода в политике ServiceCallout API-прокси
  1. В пользовательском интерфейсе Edge выберите конкретный API-прокси, в котором вы хотите просмотреть новое значение таймаута ввода-вывода для политики ServiceCallout.
  2. Выберите конкретную политику ServiceCallout, которую вы хотите проверить.
  3. См. элемент <Timeout> с соответствующим значением в конфигурации <ServiceCallout> .

    Например, время ожидания ввода-вывода в следующем коде составит 120 секунд:

    <Timeout>120000</Timeout>

Проверка таймаута ввода-вывода в обработчиках сообщений.

  1. Войдите в систему обработки сообщений.
  2. Найдите свойство 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
  3. В приведенном выше примере обратите внимание, что свойство HTTPTransport.io.timeout.millis в http.properties установлено со значением 55000 Это указывает на то, что таймаут ввода-вывода успешно настроен на 55 секунд в обработчике сообщений.

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

Запишите значения, установленные для всех слоев, как показано в таблице ниже:

Тайм-аут на маршрутизаторе (секунды) Истекло время ожидания на виртуальном хосте (в секундах) Истекло время ожидания в обработчике сообщений (в секундах) Истекло время ожидания на API-прокси (в секундах)
57 - 55 120

В этом примере,

  • Значение по умолчанию, равное 57 секундам, задано на маршрутизаторе.
  • Значение тайм-аута не задано для конкретного виртуального хоста. Это означает, что будет использоваться значение по умолчанию, равное 57 секундам, настроенное на самом маршрутизаторе.
  • В процессоре сообщений по умолчанию установлено значение 55 секунд.
  • Однако для конкретного API-прокси установлено значение 120 секунд.

Обратите внимание, что более высокое значение таймаута настроено только на API-прокси, но маршрутизатор по-прежнему настроен на 57 секунд. Следовательно, маршрутизатор выдает ошибку таймаута через 57 секунд, пока обработчик сообщений/бэкэнд все еще обрабатывает ваш запрос. Это приводит к тому, что маршрутизатор отправляет клиентскому приложению ответ с ошибкой 504 Gateway Timeout .

Разрешение

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

  1. Обратитесь к разделу «Рекомендации по настройке таймаута ввода-вывода» , чтобы понять, какие значения таймаута следует установить для различных компонентов, участвующих в потоке запросов API через Apigee Edge.
  2. В приведенном выше примере, если вы определили, что необходимо установить более высокое значение таймаута, поскольку серверная часть требует больше времени, и вы увеличили значение таймаута обработчика сообщений до 120 секунд, установите более высокое значение таймаута. Например: 123 seconds на маршрутизаторе. Чтобы избежать влияния нового значения таймаута на все API-прокси, установите значение 123 seconds только для конкретного виртуального хоста , используемого в конкретном API-прокси.
  3. Чтобы установить время ожидания на виртуальном хосте, следуйте инструкциям в разделе «Настройка таймаута ввода-вывода на маршрутизаторах» .