Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния HTTP 502 Bad Gateway
с кодом ошибки protocol.http.ResponseWithBody
в качестве ответа на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 502 Bad Gateway
Кроме того, вы можете увидеть одно из следующих сообщений об ошибке:
{ "fault":{ "faultstring":"Received 204 Response with message body", "detail":{ "errorcode":"protocol.http.ResponseWithBody" } } }
{ "fault":{ "faultstring":"Received 205 Response with message body", "detail":{ "errorcode":"protocol.http.ResponseWithBody" } } }
Возможные причины
Эта ошибка возникает, если HTTP-ответ от внутреннего сервера к Apigee Edge имеет значение 204 No Content
или 205 Reset Content
, но содержит тело ответа и/или один или несколько следующих заголовков:
-
Content-Length
-
Content-Encoding
-
Transfer-Encoding
В соответствии со спецификациями RFC 7231, раздел 6.3.5: 204 «Нет содержимого» и RFC 7231, раздел 6.3.6: 205 «Сбросить содержимое» , ожидается, что никакой дополнительный контент не должен отправляться как часть тела полезной нагрузки ответа с кодом состояния 204 No Content
или 205 Reset Content
исходным сервером. Заголовки ответа, такие как Content-Length
, Content-Encoding
или Transfer-Encoding
указывают размер, тип или формат полезных данных ответа.
Таким образом, Apigee Edge возвращает код состояния 502 Bad Gateway
с кодом ошибки protocol.http.ResponseWithBody
клиенту при следующих обстоятельствах:
Код состояния с внутреннего сервера | ||
---|---|---|
Ответ от внутреннего сервера содержит | 204 Нет содержания | 205 Сбросить содержимое |
Тело ответа | ОШИБКА | ОШИБКА |
Заголовок (установлено ненулевое значение) | ОШИБКА | ОШИБКА |
(установлено поддерживаемое кодирование в Apigee Edge ) | ОШИБКА | НЕТ ОШИБКИ |
Transfer-Encoding | ОШИБКА | ОШИБКА |
Вот возможные причины этой ошибки:
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Тело ответа или заголовки с ответом 204 от внутреннего сервера. | Внутренний сервер отправляет ответ 204 No Content или 205 Reset Content с телом ответа и/или одним или несколькими заголовками Content-Type , Content-Encoding или Transfer-Encoding . | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
protocol.http.ResponseWithBody
, как показано ниже:Вы увидите информацию о коде ошибки
protocol.http.ResponseWithBody
, как показано ниже:Нажмите «Просмотреть журналы» и разверните строку с невыполненным запросом.
- В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
502
- Источник неисправности:
target
- Код ошибки:
protocol.http.ResponseWithBody
.
- Код состояния:
- Если источник сбоя имеет
target
значение, а код сбоя имеет значениеprotocol.http.ResponseWithBody
, это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Content
или205 Reset Content
с телом ответа и/или один из заголовков, упомянутых в разделе «Возможные причины» .
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Подождите, пока произойдет ошибка
502 Bad Gateway
. или - Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите ошибку
502 Bad Gateway
.
- Подождите, пока произойдет ошибка
Убедитесь, что параметр «Показать все FlowInfos» включен:
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаруживаете ошибку в сообщении об ошибке
flowinfo
сразу после этапа отправки запроса на целевой сервер, как показано ниже:Сценарий №1
Сценарий № 1: Внутренний сервер отвечает кодом состояния
204 No Content
, содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .Обратите внимание на следующие значения из трассировки:
- ошибка:
Received 204 Response with message body
- error.class:
com.apigee.rest.framework.BadGateway
Сценарий №2
Сценарий № 2: Внутренний сервер отвечает кодом состояния
204 No Content
, содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .Обратите внимание на следующие значения из трассировки:
- ошибка:
Received 205 Response with message body
- error.class:
com.apigee.rest.framework.BadGateway
- ошибка:
- Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
Прокрутите вниз до раздела «Сведения о фазе , заголовки ошибок» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
- Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source
are protocol.http.ResponseWithBody
иtarget
соответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Content
или205 Reset Content
вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .Ошибка Ценить X-Apigee-код неисправности protocol.http.ResponseWithBody
X-Apigee-источник-ошибки target
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации о HTTP
502 Bad Gateway
. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
Где: ORG , ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, есть ли какие-либо ошибки
502
с кодом ошибкиprotocol.http.ResponseWithBody
в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой502
. Если вы обнаружите какие-либо ошибки
502
с кодом X-Apigee-fault-code , соответствующим значениюprotocol.http.ResponseWithBody
, определите значение X-Apigee-fault-source .Пример ошибки 502 из журнала доступа NGINX:
Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source :
Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.ResponseWithBody
X-Apigee-источник-ошибки target
- Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source являются
protocol.http.ResponseWithBody
иtarget
соответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния204 No Content
или205 Reset Content
вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .
Причина: тело ответа или заголовки с ответом 204 от внутреннего сервера.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если код ошибки —
protocol.http.ResponseWithBody
, а источник ошибки имеет значениеtarget
, то это означает, что внутренний сервер ответил кодом состояния204 No Content
или205 Reset Content
с телом ответа и/или одним из упомянутых заголовков. в разделе Возможные причины . Чтобы проверить, действительно ли внутренний сервер отправил тело полезных данных ответа и/или один или несколько заголовков, упомянутых в разделе «Возможные причины» , вы можете выполнить следующие шаги:
Если вы являетесь пользователем общедоступного облака и можете ли вы сделать тот же запрос API к внутреннему серверу непосредственно из любой из ваших систем.
- Если вы являетесь пользователем частного облака , то вы можете сделать тот же API-запрос к внутреннему серверу непосредственно от одного из процессоров сообщений, связанных с конкретной организацией и средой, где наблюдается сбой.
Просмотрите ответ, полученный от внутреннего сервера, и убедитесь, что он содержит тело полезных данных ответа и/или один или несколько вышеупомянутых заголовков. Если да, то это причина этой ошибки.
Образец №1
Пример № 1: Ответ внутреннего сервера 204 с заголовком Content-Encoding
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Encoding: gzip
< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveВ этом примере внутренний сервер ответил кодом состояния
204 No Content
иContent-Encoding: gzip
Образец №2
Пример № 2: Ответ внутреннего сервера 204 с заголовком Content-Length
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Length: 48
< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-aliveВ этом примере внутренний сервер ответил кодом состояния
204 No Content
иContent-Length: 48
Образец №3
Пример № 3: Ответ внутреннего сервера 205 с телом ответа
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 205 Reset Content < Date: Sat, 31 Jul 2021 17:14:09 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host X.X.X.X left intact
This is a sample Response
В этом примере внутренний сервер ответил кодом состояния
205 Reset Content
с телом ответаThis is a sample Response.
- Во всех приведенных выше примерах внутренний сервер отправлял код состояния
204 No Content
или205 Reset Content
вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины . - Поэтому Apigee Edge отправил код состояния
502 Bad Gateway
с кодом ошибкиprotocol.http.ResponseWithBody
.
Разрешение
Убедитесь, что внутренний сервер всегда соответствует спецификации RFC 7231, раздел 6.3.6: 205 Reset Content при отправке ответа 204 No Content
или 205 Reset Content
в Apigee Edge. То есть внутренний сервер НЕ ДОЛЖЕН отправлять следующее как часть ответа 204 No Content
или 205 Reset Content
:
- Тело полезной нагрузки ответа
- И любой из следующих заголовков:
-
Content-Length
-
Content-Encoding
-
Transfer-Encoding
-
Спецификация
Apigee Edge отвечает кодом состояния 502 Bad Gateway
и кодом ошибки protocol.http.ResponseWithBody
если внутренний сервер отправляет ответ 204 No Content
или 205 Reset Content
, но не соответствует следующим спецификациям RFC:
Спецификация |
---|
RFC 7231, раздел 6.3.5: 204 Нет содержимого |
RFC 7231, раздел 6.3.6: 205 Сбросить содержимое |
Ключевые моменты, на которые следует обратить внимание
Рекомендуемое решение — исправить внутренний сервер, чтобы он отправлял код состояния 204 No Content
и 205 Reset Content
без тела ответа и любых заголовков — Content-Length
, Content-Encoding
и Transfer-Encoding
и придерживаться спецификаций RFC 7231. раздел 6.3.5: 204 No Content и RFC 7231, раздел 6.3.6: 205 Reset Content .
Если вам по-прежнему нужна помощь со стороны службы поддержки Apigee, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Полная команда
curl
, используемая для воспроизведения ошибки502
- Файл трассировки запросов API
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке, наблюдаемое для неудачных запросов
- Имя среды
- Пакет API-прокси
- Файл трассировки запросов API
Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
Где: ORG , ENV и PORT# заменяются фактическими значениями.
- Системные журналы процессора сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log