Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса 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-LengthContent-EncodingTransfer-Encoding
Согласно спецификациям
RFC 7231, раздел 6.3.5: 204 No Content и
RFC 7231, раздел 6.3.6: 205 Reset Content, ожидается, что сервер-источник не будет отправлять дополнительный контент в теле полезной нагрузки ответа с кодом статуса 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 |
| Тело ответа | ERROR (Ошибка) | ERROR (Ошибка) |
(установите ненулевое значение) |
ERROR (Ошибка) | ERROR (Ошибка) |
(установите поддерживаемую кодировку в Apigee Edge) |
ERROR (Ошибка) | ОШИБОК НЕТ |
Transfer-Encoding |
ERROR (Ошибка) | ERROR (Ошибка) |
Вот возможные причины этой ошибки:
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Тело ответа или заголовки с ответом 204 от внутреннего сервера | Внутренний сервер отправляет ответ 204 No Content или 205 Reset Content с текстом и/или одним или несколькими заголовками Content-Type, Content-Encoding или Transfer-Encoding. |
Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.
- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
- Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
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.
- Дождитесь появления ошибки
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка находится в разделе
flowinfoError сразу после этапа Request sent to target server, как показано ниже:Сценарий 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-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target
nginx
Чтобы диагностировать ошибку с помощью журналов доступа 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-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source 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 на бэкенд-сервер напрямую с одного из Message Processor, связанных с определенной организацией и средой, в которых произошел сбой.
Проверьте ответ, полученный от внутреннего сервера, и убедитесь, что он содержит текст полезной нагрузки и/или один или несколько упомянутых выше заголовков. Если да, то это и есть причина ошибки.
Пример 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.
Разрешение
Убедитесь, что при отправке ответа 204 No Content или 205 Reset Content в Apigee Edge сервер всегда соответствует спецификации
RFC 7231, раздел 6.3.6: 205 Reset Content. Это означает, что серверная часть НЕ ДОЛЖНА отправлять следующие данные в составе ответа 204 No Content или 205 Reset Content:
- Тело полезной нагрузки ответа
- и любой из следующих заголовков:
Content-LengthContent-EncodingTransfer-Encoding
Спецификация
Apigee Edge отвечает кодом статуса 502 Bad Gateway и кодом ошибки protocol.http.ResponseWithBody, если серверный сервис отправляет ответ 204 No Content или 205 Reset Content, но не соответствует следующим спецификациям RFC:
| Спецификация |
|---|
| RFC 7231, раздел 6.3.5: 204 No Content |
| RFC 7231, раздел 6.3.6: 205 Reset Content |
Важная информация
Рекомендуем настроить сервер так, чтобы он отправлял коды статуса 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.
Если вы пользователь общедоступного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Название прокси API
- Команда
curl, использованная для воспроизведения ошибки502 - Файл трассировки для запросов к API
Если вы используете частное облако, предоставьте следующую информацию:
- Полное сообщение об ошибке, которое появляется при неудачных запросах.
- Название среды
- Пакет прокси API
- Файл трассировки для запросов к API
Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Системные журналы Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log