502 Bad Gateway - Response 405 without Allow Header (502 Ошибка шлюза – ответ 405 без заголовка Allow)

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 502 Bad Gateway с кодом ошибки protocol.http.Response405WithoutAllowHeader в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 502 Bad Gateway

Кроме того, может появиться следующее сообщение об ошибке:

{
   "fault":{
      "faultstring":"Received 405 Response without Allow Header",
      "detail":{
         "errorcode":"protocol.http.Response405WithoutAllowHeader"
      }
   }
}

Возможные причины

Эта ошибка возникает, если сервер отвечает кодом статуса 405 Method Not Allowed без заголовка Allow.

Согласно спецификации RFC 7231, раздел 6.5.5: 405 Method Not Allowed, сервер-источник должен создать и отправить поле заголовка Allow в ответе 405, содержащем список поддерживаемых методов целевого ресурса. Если нет, Apigee возвращает 502 Bad Gateway и код ошибки protocol.http.Response405WithoutAllowHeader.

Причина Описание Инструкции по устранению неполадок, применимые к
Ответ 405 без заголовка Allow от внутреннего сервера Бэкенд-сервер, обрабатывающий запрос к API, отвечает кодом статуса 405 без заголовка Allow. Пользователи общедоступного и частного облака Edge

Распространенные этапы диагностики

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

Мониторинг API

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в интерфейс Edge как пользователь с подходящей ролью.
  2. Перейдите к организации, в которой хотите изучить проблему.

    раскрывающийся список организаций;
  3. Перейдите на страницу Анализ > Мониторинг API > Исследование.
  4. Выберите период времени, в течение которого вы наблюдали ошибки.
  5. Постройте график Код ошибки по оси Y и Время по оси X.

  6. Выберите ячейку с кодом ошибки,protocol.http.Response405WithoutAllowHeader как показано ниже.

  7. Информация о коде неисправности protocol.http.Response405WithoutAllowHeader отображается, как показано ниже.

  8. Нажмите Посмотреть журналы и разверните один из неудачных запросов, чтобы посмотреть дополнительную информацию.

  9. В окне Журналы обратите внимание на следующие сведения:
    • Код статуса: 502.
    • Источник ошибки: target
    • Код ошибки: protocol.http.Response405WithoutAllowHeader.
  10. Если в поле Источник ошибки указано значение target, а в поле Код ошибки – protocol.http.Response405WithoutAllowHeader, это означает, что сервер отправил код статуса 405 Method Not Allowed без заголовка Allow.

Инструмент "Трассировка"

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

  1. Включите сеанс трассировки и либо
    • Дождитесь ошибки 502 Bad Gateway или
    • Если вы можете воспроизвести проблему, сделайте вызов API, чтобы воспроизвести проблему – ошибку 502 Bad Gateway.
  2. Убедитесь, что включен параметр Показывать все FlowInfo:

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

  6. Запишите значение ошибки из трассировки.

    В приведенном выше примере трассировки ошибка обозначена как Received 405 Response without Allow Header. Поскольку ошибка возникает в Apigee после отправки запроса на сервер, это означает, что сервер отправил код статуса ответа 405 без заголовка Allow.

  7. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
  8. Прокрутите вниз до раздела Заголовки ошибок / ответов на панели Сведения об этапе и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

  9. Значения X-Apigee-fault-code и X-Apigee-fault-source будут отображаться как protocol.http.Response405WithoutAllowHeader и target соответственно. Это означает, что ошибка возникла из-за того, что сервер отправил код статуса ответа 405 без заголовка Allow.
    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

nginx

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

  1. Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP 502.
  2. Проверьте журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    Где: ORG, ORG и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 502 с кодом protocol.http.Response405WithoutAllowHeader за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 502.
  4. Если вы обнаружите ошибки 502, в которых X-Apigee-fault-code соответствует значению protocol.http.Response405WithoutAllowHeader, определите значение X-Apigee-fault-source.

    Пример ошибки 502 из журнала доступа NGINX:

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

Причина: ответ 405 без заголовка Allow от внутреннего сервера

диагностика;

  1. Определите код ошибки и источник ошибки для 502 Bad Gateway, используя API Monitoring, Trace Tool или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
  2. Если код ошибки – protocol.http.Response405WithoutAllowHeader, а источник ошибки – target, это означает, что сервер отправил ответ с кодом статуса 405 без заголовка Allow. Поэтому Apigee возвращает код статуса 502 Bad Gateway с кодом ошибки protocol.http.Response405WithoutAllowHeader.

Разрешение

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

Бэкенд-сервер

Вариант 1. Настройте сервер так, чтобы он отправлял код статуса 405 с заголовком Allow:

  1. Убедитесь, что сервер всегда соответствует спецификации RFC 7231, раздел 6.5.5: 405 Method Not Allowed и отправляет код статуса 405, включая список разрешенных методов в заголовок Allow, как показано ниже:

    Allow: HTTP_METHODS
  2. Например, если ваш сервер поддерживает методы GET, POST и HEAD, то заголовок Allow должен содержать их в следующем виде:
    Allow: GET, POST, HEAD

Обработка ошибок

Вариант 2. Используйте обработку ошибок, чтобы отправить код статуса 405 с заголовком Allow из прокси API:

Если бэкенд-сервер возвращает код статуса 405 без заголовка Allow, вы можете использовать обработку ошибок, чтобы вернуть код статуса 405 и заголовок Allow из прокси-сервера API, как показано ниже.

  1. Создайте правило, например AssignMessage policy или RaiseFault policy, и задайте код статуса 405 с заголовком Allow и собственным сообщением.

    Пример правила AssignMessage для отправки кода 405 с заголовком Allow:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader">
        <DisplayName>AM-405WithAllowHeader</DisplayName>
        <Set>
            <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>Method Not Allowed</ReasonPhrase>
        </Set>
        <Add>
            <Headers>
                <Header name="Allow">GET, POST, HEAD</Header>
            </Headers>
        </Add>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
  2. Создайте FaultRule в TargetEndpoint, который вызывает правило при получении ошибки 502 с кодом protocol.http.Response405WithoutAllowHeader.

    Пример конфигурации TargetEndpoint с FaultRule:

    <TargetEndpoint name="default">
    ...
        <FaultRules>
           <FaultRule name="405WithoutAllowHeader">
                <Step>
                    <Name>AM-405WithAllowHeader</Name>
                </Step>
                <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition>
            </FaultRule>
        </FaultRules>
  3. Сохраните эти изменения в новой версии прокси-сервера API и разверните ее.
  4. Выполните вызовы API и убедитесь, что вы получаете код статуса 405 с заголовком Allow.

Как настроить ресурс

Вариант 3. Настройте свойство в Message Processor, чтобы Apigee Edge не возвращал ошибку 502

  1. Если вы являетесь пользователем Private Cloud, вы можете обновить свойство HTTP.ignore.allow_header.for.405 до true, чтобы Apigee Edge не выдавал ошибку 502, даже если бэкенд-сервер отвечает кодом статуса 405 без заголовка Allow, используя практическое руководство: Настройка игнорирования заголовка Allow для свойства 405 в Message Processors.
  2. Если вы пользователь общедоступного облака , обратитесь в службу поддержки Apigee Edge.

Спецификация

Apigee ожидает от внутреннего сервера ответ 405 Method Not Allowed вместе с заголовком Allow в соответствии со следующими спецификациями:

Спецификация
RFC 7231, раздел 6.5.5: 405 Method Not Allowed
RFC 7231, раздел 7.4.1: Allow

Важная информация

Рекомендуем исправить серверную часть, чтобы она отправляла код статуса 405 с заголовком Allow и соответствовала спецификации RFC 7231, раздел 6.5.5: 405 Method Not Allowed (Метод не разрешен).

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

Необходимо собрать диагностическую информацию

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

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

  • Название организации
  • Название среды
  • Название прокси API
  • Полная команда curl, использованная для воспроизведения 502 Bad Gateway с кодом ошибки protocol.http.Response405WithoutAllowHeader
  • Файл трассировки для запросов к API

Если вы используете частное облако, предоставьте следующую информацию:

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси-сервера API
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    Где: ORG, ORG и PORT# заменяются фактическими значениями.

  • Системные журналы процессора сообщений
    /opt/apigee/var/log/edge-message-processor/logs/system.log

Ссылки

Обработка ошибок в Apigee