Вы просматриваете документацию по 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:
- Войдите в интерфейс Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.
- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки,
protocol.http.Response405WithoutAllowHeaderкак показано ниже.
Информация о коде неисправности
protocol.http.Response405WithoutAllowHeaderотображается, как показано ниже.
Нажмите Посмотреть журналы и разверните один из неудачных запросов, чтобы посмотреть дополнительную информацию.
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
502. - Источник ошибки:
target - Код ошибки:
protocol.http.Response405WithoutAllowHeader.
- Код статуса:
- Если в поле Источник ошибки указано значение
target, а в поле Код ошибки –protocol.http.Response405WithoutAllowHeader, это означает, что сервер отправил код статуса405 Method Not Allowedбез заголовкаAllow.
Инструмент "Трассировка"
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите
сеанс трассировки и либо
- Дождитесь ошибки
502 Bad Gatewayили - Если вы можете воспроизвести проблему, сделайте вызов API, чтобы воспроизвести проблему – ошибку
502 Bad Gateway.
- Дождитесь ошибки
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка возникает в потоке после этапа Запрос отправлен на целевой сервер, как показано ниже.
Запишите значение ошибки из трассировки.
В приведенном выше примере трассировки ошибка обозначена как
Received 405 Response without Allow Header. Поскольку ошибка возникает в Apigee после отправки запроса на сервер, это означает, что сервер отправил код статуса ответа405без заголовкаAllow.- Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
Прокрутите вниз до раздела Заголовки ошибок / ответов на панели Сведения об этапе и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
- Значения X-Apigee-fault-code и X-Apigee-fault-source будут отображаться как
protocol.http.Response405WithoutAllowHeaderиtargetсоответственно. Это означает, что ошибка возникла из-за того, что сервер отправил код статуса ответа405без заголовкаAllow.Заголовки ответов Значение X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
nginx
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP
502. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
Где: ORG, ORG и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникали ли ошибки
502с кодомprotocol.http.Response405WithoutAllowHeaderза определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой502. Если вы обнаружите ошибки
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.Response405WithoutAllowHeaderX-Apigee-fault-source target
Причина: ответ 405 без заголовка Allow от внутреннего сервера
диагностика;
- Определите код ошибки и источник ошибки для
502 Bad Gateway, используя API Monitoring, Trace Tool или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики. - Если код ошибки –
protocol.http.Response405WithoutAllowHeader, а источник ошибки –target, это означает, что сервер отправил ответ с кодом статуса405без заголовкаAllow. Поэтому Apigee возвращает код статуса502 Bad Gatewayс кодом ошибкиprotocol.http.Response405WithoutAllowHeader.
Разрешение
Чтобы устранить проблему, выполните одно из следующих действий:
Бэкенд-сервер
Вариант 1. Настройте сервер так, чтобы он отправлял код статуса 405 с заголовком Allow:
Убедитесь, что сервер всегда соответствует спецификации RFC 7231, раздел 6.5.5: 405 Method Not Allowed и отправляет код статуса
405, включая список разрешенных методов в заголовокAllow, как показано ниже:Allow: HTTP_METHODS
- Например, если ваш сервер поддерживает методы
GET,POSTиHEAD, то заголовокAllowдолжен содержать их в следующем виде:Allow: GET, POST, HEAD
Обработка ошибок
Вариант 2. Используйте обработку ошибок, чтобы отправить код статуса 405 с заголовком Allow из прокси API:
Если бэкенд-сервер возвращает код статуса 405 без заголовка Allow, вы можете использовать обработку ошибок, чтобы вернуть код статуса 405 и заголовок Allow из прокси-сервера API, как показано ниже.
Создайте правило, например 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>
Создайте
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>- Сохраните эти изменения в новой версии прокси-сервера API и разверните ее.
- Выполните вызовы API и убедитесь, что вы получаете код статуса
405с заголовкомAllow.
Как настроить ресурс
Вариант 3. Настройте свойство в Message Processor, чтобы Apigee Edge не возвращал ошибку 502
- Если вы являетесь пользователем Private Cloud, вы можете обновить свойство
HTTP.ignore.allow_header.for.405доtrue, чтобы Apigee Edge не выдавал ошибку502, даже если бэкенд-сервер отвечает кодом статуса405без заголовкаAllow, используя практическое руководство: Настройка игнорирования заголовка Allow для свойства 405 в Message Processors. - Если вы пользователь общедоступного облака , обратитесь в службу поддержки 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