502 Плохой шлюз — DecompressionFailureAtResponse

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

Симптом

Клиентское приложение получает код состояния 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 .
  • НО

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

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

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

Сценарий Кодирование контента Представление полезной нагрузки
Единая кодировка gzip

Формат Unix gzip .

См. Формат GZIP RFC1952 .

Единая кодировка сдувать

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

См. RFC1950 и RFC1951 .

Множественное кодирование

Множественное кодирование

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

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

Возможные причины этой ошибки следующие:

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

Общие этапы диагностики

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

API-мониторинг

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  6. Обратите внимание на значения свойств из трассировки:

    • Кодирование контента: 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
    • ошибка.причина: Not in GZIP format

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

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

  8. Перейдите к этапу «Ответ, отправленный клиенту» в трассировке и щелкните его.

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

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

    • Код состояния: 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-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-источник-ошибки target

НГИНКС

Чтобы диагностировать ошибку с помощью журналов доступа 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-код неисправности messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-источник-ошибки 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 с помощью Trace , как описано в разделе «Общие шаги диагностики» .
    2. Значения выборки трассировки следующие:

      • Кодирование контента: gzip
      • ошибка.причина: Not in GZIP format

      Значение в заголовке ответа Content-Encodinggzip ; однако полезные данные ответа не имеют формата GZIP (на что указывает error.cause ). Поэтому Apigee Edge отвечает 502 Bad Gateway и кодом ошибки messaging.adaptors.http.flow.DecompressionFailureAtResponse .

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

    Чтобы подтвердить использование фактического запроса:

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

    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 .

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

    Для проверки с использованием журналов процессора сообщений:

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

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

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

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

      grep -ri "ZipException"
      
    3. Вы найдете строки из system.log, подобные следующим:

      Сценарий №1

      Сценарий № 1. Когда ответ API имеет заголовок Content-Encoding: gzip

      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. Когда ответ API имеет заголовок Content-Encoding: 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 в приведенном выше сообщении об ошибке указывают на то, что полезные данные ответа не отправляются в дефлированном формате и не соответствуют кодировке. указанный в заголовке 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 :

Если вы являетесь пользователем 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