Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния 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 Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
protocol.http.Response405WithoutAllowHeader
, как показано ниже:Информация о коде неисправности
protocol.http.Response405WithoutAllowHeader
http.Response405WithoutAllowHeader отображается, как показано ниже:Нажмите «Просмотреть журналы» и разверните один из невыполненных запросов, чтобы просмотреть дополнительную информацию.
- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
502
- Источник неисправности:
target
- Код ошибки:
protocol.http.Response405WithoutAllowHeader
.
- Код состояния:
- Если источником ошибки является
target
, а код ошибки —protocol.http.Response405WithoutAllowHeader
, это означает, что внутренний сервер ответил кодом состояния405 Method Not Allowed
без заголовкаAllow
.
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и либо
- Дождитесь появления ошибки
502 Bad Gateway
или - Если вы можете воспроизвести проблему, выполните вызов API, чтобы воспроизвести проблему — ошибка
502 Bad Gateway
- Дождитесь появления ошибки
Убедитесь, что параметр «Показать все FlowInfos» включен:
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаружите ошибку в потоке после этапа отправки запроса на целевой сервер, как показано ниже:
Обратите внимание на значение ошибки из трассировки.
В приведенном выше примере трассировки ошибка отображается как
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-код неисправности protocol.http.Response405WithoutAllowHeader
X-Apigee-источник-ошибки target
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа 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-код неисправности protocol.http.Response405WithoutAllowHeader
X-Apigee-источник-ошибки target
Причина: ответ 405 без заголовка Allow от внутреннего сервера.
Диагностика
- Определите код ошибки и источник ошибки для
502 Bad Gateway
с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» . - Если код ошибки —
protocol.http.Response405WithoutAllowHeader
, а источник ошибки имеет значениеtarget
, это означает, что внутренний сервер ответил кодом состояния405
без заголовкаAllow
. Поэтому Apigee отвечает502 Bad Gateway
с кодом ошибкиprotocol.http.Response405WithoutAllowHeader
http.Response405WithoutAllowHeader .
Разрешение
Для решения проблемы используйте один из следующих способов:
Внутренний сервер
Вариант № 1. Исправьте внутренний сервер, чтобы он отправлял код состояния 405 с заголовком «Разрешить»:
Убедитесь, что внутренний сервер всегда соответствует спецификации RFC 7231, раздел 6.5.5: «Метод 405 не разрешен» , и отправляет код состояния
405
, включая список разрешенных методов как часть заголовкаAllow
Разрешить», как показано ниже:Allow: HTTP_METHODS
- Например, если ваш внутренний сервер разрешает методы
GET
,POST
иHEAD
, вам необходимо убедиться, что заголовокAllow
содержит их следующим образом:Allow: GET, POST, HEAD
Обработка ошибок
Вариант № 2. Используйте обработку ошибок, чтобы отправить код состояния 405 с заголовком «Разрешить» из вашего прокси-сервера API:
Если внутренний сервер возвращает код состояния 405
без заголовка Allow
, вы можете использовать обработку ошибок, чтобы ответить кодом состояния 405
и заголовком Allow
» от вашего прокси-сервера API следующим образом:
Создайте политику, такую как политика AssignMessage или политика RaiseFault, и установите код состояния
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
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. Настройте свойство в процессоре сообщений, чтобы Apigee Edge не возвращал ошибку 502.
- Если вы являетесь пользователем частного облака , вы можете обновить свойство
HTTP.ignore.allow_header.for.405
доtrue
, чтобы Apigee Edge не выдавал ошибку502
, даже если внутренний сервер отвечает кодом состояния405
без заголовкаAllow
, используя Практическое руководство: Настройка заголовка ignoreallow для свойства 405 в процессорах сообщений . - Если вы являетесь пользователем публичного облака, обратитесь в службу поддержки Apigee Edge.
Спецификация
Apigee ожидает ответа 405 Method Not Allowed
от внутреннего сервера вместе с заголовком Allow
в соответствии со следующими спецификациями:
Спецификация | |
---|---|
RFC 7231, раздел 6.5.5: метод 405 не разрешен | |
RFC 7231, раздел 7.4.1: Разрешить |
Ключевые моменты, на которые следует обратить внимание
Рекомендуемое решение — исправить внутренний сервер, чтобы он отправлял код состояния 405
с заголовком Allow
и соответствовал спецификации RFC 7231, раздел 6.5.5: 405 Method Not Allowed .
Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Если проблема не устранена даже после выполнения приведенных выше инструкций, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge .
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя 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