502 Bad Gateway - ResponseWithBody

Вы просматриваете документацию по 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-Length
  • Content-Encoding
  • Transfer-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 (Ошибка)

Content-Length заголовок

(установите ненулевое значение)

ERROR (Ошибка) ERROR (Ошибка)

Content-Encoding

(установите поддерживаемую кодировку в Apigee Edge)

ERROR (Ошибка) ОШИБОК НЕТ
Transfer-Encoding ERROR (Ошибка) ERROR (Ошибка)

Вот возможные причины этой ошибки:

Причина Описание Инструкции по устранению неполадок, применимые к
Тело ответа или заголовки с ответом 204 от внутреннего сервера Внутренний сервер отправляет ответ 204 No Content или 205 Reset Content с текстом и/или одним или несколькими заголовками Content-Type, Content-Encoding или Transfer-Encoding. Пользователи общедоступного и частного облака Edge

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

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

Мониторинг API

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

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

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

    ( посмотреть изображение в полном размере)

  7. Вы увидите информацию о коде ошибки protocol.http.ResponseWithBody, как показано ниже.

    ( посмотреть изображение в полном размере)

  8. Нажмите Посмотреть журналы и разверните строку с неудачным запросом.

    ( посмотреть изображение в полном размере)

  9. В окне Журналы обратите внимание на следующие сведения:
    • Код статуса: 502.
    • Источник ошибки: target
    • Код ошибки: protocol.http.ResponseWithBody.
  10. Если в столбце Источник ошибки указано значение target, а в столбце Код ошибки – protocol.http.ResponseWithBody, это означает, что ошибка произошла из-за того, что сервер отправил код статуса 204 No Content или 205 Reset Content с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины.

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

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

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

  3. Выберите один из неудачных запросов и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка находится в разделе flowinfo Error сразу после этапа 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
  6. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
  7. Прокрутите страницу вниз до раздела Сведения об этапе, Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

    ( посмотреть изображение в полном размере)

  8. Обратите внимание, что значения 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.ResponseWithBody
    X-Apigee-fault-source target

nginx

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

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

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

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

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 502 с кодом protocol.http.ResponseWithBody в определенный период времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 502.
  4. Если вы обнаружите ошибки 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.ResponseWithBody
    X-Apigee-fault-source target
  5. Обратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source – это protocol.http.ResponseWithBody и target соответственно. Это означает, что ошибка произошла из-за того, что сервер отправил код статуса 204 No Content или 205 Reset Content с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины.

Причина: тело ответа или заголовки с ответом 204 от внутреннего сервера

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

  1. Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные этапы диагностики.
  2. Если код ошибки – protocol.http.ResponseWithBody, а источник ошибки – target, это означает, что сервер отправил код статуса 204 No Content или 205 Reset Content с текстом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины.
  3. Чтобы проверить, действительно ли бэкенд-сервер отправил тело полезной нагрузки ответа и/или один или несколько заголовков, упомянутых в разделе Возможные причины, выполните следующие действия:

    1. Если вы используете общедоступное облако и можете отправлять тот же запрос к API на серверную часть напрямую из любой из своих систем.

    2. Если вы используете частное облако, то можете отправить тот же запрос к API на бэкенд-сервер напрямую с одного из Message Processor, связанных с определенной организацией и средой, в которых произошел сбой.
    3. Проверьте ответ, полученный от внутреннего сервера, и убедитесь, что он содержит текст полезной нагрузки и/или один или несколько упомянутых выше заголовков. Если да, то это и есть причина ошибки.

      Пример 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..

    4. Во всех приведенных выше примерах сервер отправил код статуса 204 No Content или 205 Reset Content с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины.
    5. Поэтому 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:

  1. Тело полезной нагрузки ответа
  2. и любой из следующих заголовков:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-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