502 Bad Gateway - DecompressionFailureAtResponse

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 502 Bad Gateway с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 502 Bad Gateway

Кроме того, вы можете увидеть сообщение об ошибке, похожее на приведенное ниже:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

Возможные причины

Эта ошибка возникает только в следующих случаях:

  • Кодировка, указанная в заголовке Content-Encoding HTTP-ответа (от бэкенда/целевого сервера), действительна и поддерживается Apigee Edge.
  • BUT

  • Формат полезной нагрузки, отправленной целевым сервером в составе HTTP-ответа, не соответствует формату кодировки, указанному в заголовке Content-Encoding .

Это происходит потому, что Apigee Edge не удается декодировать полезную нагрузку с помощью указанной кодировки, поскольку формат полезной нагрузки не совпадает с форматом кодировки, указанным в заголовке Content-Encoding.

Ниже приведены примеры поддерживаемых значений Content-Encoding и ожидаемого представления полезной нагрузки в Apigee Edge:

Сценарий Content-Encoding Представление полезной нагрузки
Одна кодировка gzip

Формат Unix gzip.

Подробнее о формате GZIP согласно RFC1952…

Одна кодировка deflate

В этом формате используется структура zlib с алгоритмом сжатия deflate.

См. RFC1950 и RFC1951.

Несколько кодировок

Несколько кодировок

Например, если кодирование выполняется дважды, это может быть:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Несколько типов кодировки, примененных к полезной нагрузке в том порядке, в котором они указаны в заголовке.

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

Причина Описание Инструкции по устранению неполадок, применимые к
Формат полезной нагрузки ответа не соответствует кодировке контента Формат полезной нагрузки ответа, отправленной сервером назначения, не закодирован или не соответствует кодировке, указанной в заголовке Content-Encoding. Пользователи общедоступного и частного облака Edge

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

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

Мониторинг API

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

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

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

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

  8. Информация о коде ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse будет показана, как на изображении ниже.

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

  9. Нажмите Посмотреть журналы и разверните строку, в которой произошла ошибка 502.

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

  10. В окне Журналы обратите внимание на следующие сведения:
    • Код статуса: 502.
    • Источник ошибки: target
    • Код ошибки: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Если в поле Fault Source указано значение target, это означает, что формат полезной нагрузки ответа не соответствует поддерживаемой кодировке, указанной в заголовке ответа внутреннего сервера Content-Encoding.

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

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

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

  3. Выберите один из ответов с ошибкой и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка возникает в потоке сразу после этапа Получен ответ от целевого сервера, как показано ниже.

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

  6. Запишите значения свойств из трассировки:

    • Content-Encoding: gzip
    • Тело ответа: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Перейдите к этапу ошибки сразу после этапа Получен ответ от целевого сервера:

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

    Обратите внимание на следующие свойства:

    • Ошибка: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      В поле error.cause указано, что полезная нагрузка ответа не в формате GZIP. Это означает, что Apigee Edge ожидал, что полезная нагрузка ответа будет в формате GZIP, как указано в заголовке Content-Encoding (определено на предыдущем шаге).Поэтому Apigee Edge не может распаковать полезную нагрузку с помощью gzip и возвращает ошибку Decompression failure at response.

    Обратите внимание, что в этом случае целевой/внутренний сервер возвращает ответ 200, однако клиентское приложение получит ответ 502, поскольку ошибка возвращается Apigee Edge.

  8. Найдите в трассировке этап Response Sent to Client (Ответ отправлен клиенту) и нажмите на него.

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

    Обратите внимание на следующие детали трассировки:

    • Код статуса: 502 Bad Gateway.
    • Контент с ошибкой: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.

  10. Прокрутите страницу вниз до раздела Сведения об этапе, Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

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

  11. Значения X-Apigee-fault-code и X-Apigee-fault-source будут messaging.adaptors.http.flow.DecompressionFailureAtResponse и target соответственно. Это означает, что формат полезной нагрузки ответа не соответствует кодировке, указанной в заголовке Content-Encoding.
    Заголовки ответа Значение
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

nginx

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

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

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

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

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 502 за определенный период времени (если проблема возникла в прошлом) или есть ли ответы, которые по-прежнему не удается получить с кодом 502.
  4. Если вы обнаружите ошибки 502 с кодом X-Apigee-fault-code, соответствующим значению messaging.adaptors.http.flow.DecompressionFailureAtResponse, определите значение X-Apigee-fault-source.

    Пример ошибки 502 из журнала доступа NGINX

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    Заголовки ответа Значение
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Причина: формат полезной нагрузки ответа не соответствует Content-Encoding

По умолчанию Apigee Edge всегда распаковывает полезную нагрузку, если заголовок ответа Content-Encoding содержит допустимую и поддерживаемую кодировку. Таким образом, ожидается, что формат полезной нагрузки ответа будет соответствовать кодировке, указанной в заголовке ответа Content-Encoding. Если данные не совпадают, вы увидите сообщение об ошибке.

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

  1. Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные этапы диагностики.
  2. Если код ошибки – messaging.adaptors.http.flow.DecompressionFailureAtResponse, а источник ошибки – target, это означает, что формат полезной нагрузки ответа, отправленного целевым сервером, не соответствует поддерживаемой кодировке, указанной в заголовке ответа Content-Encoding.
  3. Вы можете определить несоответствие как часть HTTP-ответа одним из следующих способов:

    Сообщение об ошибке

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

    1. Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к faultstring.

      Пример сообщения об ошибке

      "faultstring":"Decompression failure at response"
    2. В приведенном выше сообщении об ошибке указано "Decompression failure at response", что означает, что ответ не удалось распаковать с помощью кодировки, указанной в заголовке Content-Encoding.

    Трассировка

    Чтобы проверить данные с помощью трассировки:

    1. Определите Content-Type и error.cause с помощью трассировки, как описано в разделе Распространенные действия по диагностике.
    2. Значения из примера трассировки:

      • Content-Encoding: gzip
      • error.cause: Not in GZIP format

      Значение в заголовке ответа Content-Encoding – gzip, однако полезная нагрузка ответа не в формате GZIP (как указано в error.cause). Поэтому Apigee Edge возвращает код ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse и объект 502 Bad Gateway.

    Фактический запрос

    Чтобы проверить запрос:

    Если у вас есть доступ к фактическому запросу, отправленному целевому или внутреннему серверному приложению, выполните следующие действия:

    1. Если вы используете общедоступное или частное облако, отправьте запрос непосредственно на серверную часть с самого сервера или с любого другого устройства, с которого разрешено отправлять запросы на серверную часть.
    2. Если вы используете частное облако, вы также можете отправить запрос на серверную часть с одного из процессоров сообщений.
    3. Проверьте ответ, отправленный внутренним сервером, и определите значение, переданное в заголовке ответа Content-Encoding..
    4. Определите формат полезной нагрузки, отправляемой в составе запроса.
    5. Если значение заголовка Content-Encoding есть в списке поддерживаемых кодировок, но формат полезной нагрузки ответа не соответствует кодировке, указанной в заголовке Content-Encoding, то это и является причиной проблемы.

      Пример

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      В приведенном выше примере ответа значение gzip отправляется в заголовок Content-Encoding, который представляет собой поддерживаемую кодировку в Apigee Edge. Однако файл response_payload.zip будет отправлен в виде ZIP-архива. Поэтому этот ответ не проходит проверку и возвращает ошибку 502 Bad Gateway с кодом messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Журналы процессора сообщений

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

    Если вы используете Private Cloud, то можете определить ключевую информацию об ошибках HTTP 502 с помощью журналов Message Processor.

    1. Проверьте журнал обработчика сообщений:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Выполните поиск, чтобы узнать, возникали ли ошибки 502 в течение определенного периода времени (если проблема возникла в прошлом) или есть ли ответы, которые по-прежнему завершаются с ошибкой 502. Вы можете использовать следующую строку поиска:

      grep -ri "ZipException"
      
    3. В файле system.log вы найдете строки, похожие на приведенные ниже.

      Сценарий 1

      Сценарий 1. Заголовок Content-Encoding: gzip в ответе API

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      Строка java.util.zip.ZipException: Not in GZIP format в сообщении об ошибке выше указывает, что полезная нагрузка ответа не отправлена в формате GZIP, хотя Content-Encoding указан как gzip. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса 502 с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse.

      Сценарий 2

      Сценарий 2. Заголовок Content-Encoding в ответе API имеет значение deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      Строки java.util.zip.ZipException: incorrect header check и Caused by: java.util.zip.DataFormatException: incorrect header check в приведенном выше сообщении об ошибке указывают, что полезная нагрузка ответа не отправляется в формате deflate и не соответствует кодировке, указанной в заголовке Content-Encoding deflate. Поэтому Apigee Edge вызывает исключение и возвращает клиентским приложениям код статуса 502 с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse.

Разрешение

  1. Если сжатая полезная нагрузка ответа не нужна в потоке прокси-сервера API в Apigee Edge и на бэкенд-сервере, не передавайте заголовок Content-Encoding. Если необходимо сжать полезную нагрузку ответа, перейдите к шагу 2.
  2. Если вам нужно сжать полезную нагрузку ответа, убедитесь, что сервер всегда отправляет следующее:
    • Любую из поддерживаемых кодировок в качестве значения заголовка Content-Encoding в ответе.
    • Полезная нагрузка ответа в поддерживаемом формате для Apigee Edge соответствует формату кодировки, указанному в заголовке Content-Encoding.
  3. В примере выше полезная нагрузка ответа имеет формат ZIP, но в заголовке ответа указано Content-Encoding: gzip. Чтобы устранить проблему, отправьте заголовок ответа как Content-Encoding: gzip, а полезную нагрузку ответа – в формате gzip:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Спецификация

Apigee Edge отвечает кодом статуса 502 Bad Gateway с кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse в соответствии со следующими спецификациями RFC:

Спецификация
RFC 7231, раздел 6.5.1
RFC 7231, раздел 3.1.2.2

Если вам по-прежнему нужна помощь службы поддержки 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