502 Nieprawidłowa brama – DecompressionFailureAtResponse

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Może też pojawić się komunikat o błędzie podobny do tego poniżej:

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

Możliwe przyczyny

Ten błąd występuje tylko wtedy, gdy:

  • Kodowanie określone w nagłówku odpowiedzi HTTP (z serwera backendu lub serwera docelowego) Content-Encoding jest prawidłowe i  obsługiwane przez Apigee Edge.
  • BUT

  • Format ładunku wysłanego przez serwer backendu lub serwer docelowy w ramach odpowiedzi HTTP nie jest zgodny z formatem kodowania określonym w nagłówku Content-Encoding .

Dzieje się tak, ponieważ Apigee Edge nie może zdekodować ładunku przy użyciu określonego kodowania, ponieważ format ładunku nie jest taki sam jak kodowanie określone w nagłówku Content-Encoding.

Oto kilka przykładów obsługiwanych wartości parametru Content-Encoding i sposobu, w jaki Apigee Edge oczekuje reprezentacji ładunku w tych przypadkach:

Scenariusz Content-Encoding Reprezentacja ładunku
Pojedyncze kodowanie gzip

Format Unix gzip.

Zobacz RFC1952 GZIP Format.

Pojedyncze kodowanie spuszczać powietrze,

Ten format używa struktury zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951.

Wiele kodowań

Wiele kodowań

Na przykład w przypadku dwukrotnego kodowania może to być:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Wielokrotne kodowanie zastosowane do ładunku w podanej kolejności, w jakiej występuje w nagłówku.

Możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Format ładunku odpowiedzi nie pasuje do kodowania treści Format ładunku odpowiedzi wysłanego przez serwer backendu lub serwer docelowy jest niezakodowany lub nie pasuje do kodowania określonego w nagłówku Content-Encoding. Użytkownicy publicznej i prywatnej chmury Edge

Typowe etapy diagnostyki

Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:

Monitorowanie interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z  odpowiednią rolą.
  2. Przełącz się na organizację, w której chcesz zbadać problem.

  3. Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
  4. Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
  5. Sprawdź, czy filtr Proxy jest ustawiony na Wszystkie.
  6. Wykreśl kod błędu na osi czasu.
  7. Wybierz komórkę z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse, jak pokazano poniżej:

    ( wyświetl większy obraz)

  8. Informacje o kodzie błędumessaging.adaptors.http.flow.DecompressionFailureAtResponse są wyświetlane w sposób pokazany poniżej:

    ( wyświetl większy obraz)

  9. Kliknij Wyświetl logi i rozwiń wiersz, w którym wystąpił błąd 502.

    ( wyświetl większy obraz)

  10. W oknie Dzienniki zanotuj te informacje:
    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Jeśli pole Fault Source ma wartość target, oznacza to, że format ładunku odpowiedzi nie pasuje do obsługiwanego kodowania określonego w nagłówku odpowiedzi serwera backendu Content-Encoding.

Narzędzie śledzenia

Aby zdiagnozować błąd za pomocą narzędzia Trace:

  1. Włącz śledzenie sesji i wybierz jedną z tych opcji:
    1. Poczekaj na wystąpienie błędu 502 Bad Gateway lub
    2. Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz 502 Bad Gateway.
  2. Sprawdź, czy opcja Pokaż wszystkie informacje o przepływach jest włączona:

  3. Wybierz jedną z odpowiedzi, które nie przeszły testu, i sprawdź ślad.
  4. Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
  5. Błąd zwykle występuje w przepływie bezpośrednio po fazie Response Received from target server (Odpowiedź otrzymana z serwera docelowego), jak pokazano poniżej:

    ( wyświetl większy obraz)

  6. Zanotuj wartości właściwości ze śladu:

    • Content-Encoding: gzip
    • Treść odpowiedzi: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Przejdź do fazy błędu tuż po fazie Response Received from target server (Odpowiedź otrzymana z serwera docelowego):

    ( wyświetl większy obraz)

    Zanotuj właściwości:

    • Błąd: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      error.cause jest podane, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwał, że ładunek odpowiedzi będzie w formacie GZIP, zgodnie z tym, co zostało określone w nagłówku Content-Encoding (ustalonym w poprzednim kroku).Dlatego Apigee Edge nie może zdekompresować ładunku za pomocą gzip i zwraca błąd Decompression failure at response.

    Zwróć uwagę, że w tym przypadku odpowiedź z serwera docelowego/backendu to 200, ale aplikacja kliencka otrzyma odpowiedź 502, ponieważ błąd jest zwracany przez Apigee Edge.

  8. W śladzie przejdź do fazy Odpowiedź wysłana do klienta i kliknij ją.

    ( wyświetl większy obraz)

    Zanotuj te informacje ze śladu:

    • Kod stanu: 502 Bad Gateway.
    • Treść błędu: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Otwórz fazę AX (Analytics Data Recorded) w śladzie i kliknij ją.

  10. Przewiń w dół do sekcji Szczegóły fazyNagłówki błędów i określ wartości X-Apigee-fault-codeX-Apigee-fault-source, jak pokazano poniżej:

    ( wyświetl większy obraz)

  11. Wartości X-Apigee-fault-codeX-Apigee-fault-source będą miały postać messaging.adaptors.http.flow.DecompressionFailureAtResponsetarget, co oznacza, że format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówku Content-Encoding.
    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:

  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX do określania kluczowych informacji o błędach HTTP 502.
  2. Sprawdź logi dostępu NGINX:

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

    Gdzie: ORG, ENVPORT# są zastępowane rzeczywistymi wartościami.

  3. Sprawdź, czy w określonym czasie wystąpiły jakieś 502 błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują odpowiedzi z błędem 502.
  4. Jeśli znajdziesz błędy 502 z wartością X-Apigee-fault-code równą messaging.adaptors.http.flow.DecompressionFailureAtResponse, określ wartość X-Apigee-fault-source.

    Przykładowy błąd 502 z dziennika dostępu NGINX:

    Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości atrybutów X-Apigee-fault-codeX-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Przyczyna: format ładunku odpowiedzi nie pasuje do kodowania treści

Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek odpowiedzi Content-Encoding zawiera prawidłowe i obsługiwane kodowanie. Oczekuje się więc, że format ładunku odpowiedzi będzie zgodny z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding. Jeśli wystąpi niezgodność, pojawi się ten błąd.

Diagnostyka

  1. Określ kod błęduźródło błędu zaobserwowanego za pomocą monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w typowych krokach diagnostycznych.
  2. Jeśli Fault Code to messaging.adaptors.http.flow.DecompressionFailureAtResponse, a Fault Source ma wartość target, oznacza to, że format ładunku odpowiedzi wysłanego przez serwer backendu lub serwer docelowy nie jest zgodny z  obsługiwanym kodowaniem określonym w nagłówku odpowiedzi Content-Encoding.
  3. Niezgodność możesz określić w ramach odpowiedzi HTTP, korzystając z jednej z tych metod:

    Komunikat o błędzie

    Aby sprawdzić poprawność za pomocą komunikatu o błędzie:

    1. Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z faultstring.

      Przykładowy komunikat o błędzie:

      "faultstring":"Decompression failure at response"
    2. W powyższym komunikacie o błędzie wyświetla się "Decompression failure at response", co oznacza, że nie można zdekompresować odpowiedzi przy użyciu kodowania określonego w nagłówku Content-Encoding.

    Śledzenie

    Aby sprawdzić poprawność za pomocą śladu:

    1. Określ Content-Typeerror.cause, korzystając z Trace, zgodnie z opisem w Typowych krokach diagnostycznych.
    2. Wartości z przykładowego śledzenia są następujące:

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

      Wartość w nagłówku odpowiedzi Content-Encoding to gzip, ale ładunek odpowiedzi nie jest w formacie GZIP (co wskazuje error.cause). Dlatego Apigee Edge odpowiada kodem 502 Bad Gateway i kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Rzeczywista prośba

    Aby sprawdzić poprawność za pomocą rzeczywistego żądania:

    Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego lub serwera backendu, wykonaj te czynności:

    1. Jeśli jesteś użytkownikiem chmury publicznej lub prywatnej, wyślij żądanie bezpośrednio do serwera backendu z tego serwera lub z dowolnego innego urządzenia, z którego możesz wysłać żądanie do serwera backendu.
    2. Jeśli jesteś użytkownikiem chmury prywatnej, możesz też wysłać żądanie do serwera backendu z jednego z procesorów wiadomości.
    3. Sprawdź odpowiedź wysłaną przez serwer backendu i określ wartość przekazaną w nagłówku odpowiedzi Content-Encoding..
    4. Określ format ładunku wysyłanego w ramach żądania.
    5. Jeśli wartość nagłówka Content-Encoding znajduje się na liście obsługiwanych kodowań, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówku Content-Encoding, to jest to przyczyną problemu.

      Przykład:

      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)>
      

      W przykładzie powyżej odpowiedź wysyła wartość gzip do nagłówka Content-Encoding, który jest obsługiwanym kodowaniem w Apigee Edge. response_payload.zip jest jednak wysyłany jako plik ZIP. Dlatego ta odpowiedź kończy się niepowodzeniem z błędem 502 Bad Gateway i kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Dzienniki procesora komunikatów

    Aby przeprowadzić weryfikację za pomocą logów procesora komunikatów:

    Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów procesora komunikatów, aby określić kluczowe informacje o błędach HTTP 502.

    1. Sprawdź dziennik procesora komunikatów:

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

    2. Sprawdź, czy w określonym czasie wystąpiły jakieś błędy 502 (jeśli problem pojawił się w przeszłości) lub czy nadal występują odpowiedzi z błędem 502. Możesz użyć tego ciągu wyszukiwania:

      grep -ri "ZipException"
      
    3. Znajdziesz w nim wiersze podobne do tych:

      Scenariusz 1

      Scenariusz 1. Odpowiedź interfejsu API zawiera nagłówek 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
      

      Wiersz java.util.zip.ZipException: Not in GZIP format w powyższym komunikacie o błędzie wskazuje, że ładunek odpowiedzi nie jest wysyłany w formacie GZIP, mimo że Content-Encoding jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu 502 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse do aplikacji klienckich.

      Scenariusz 2

      Scenariusz 2. Odpowiedź interfejsu API zawiera nagłówek 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
      
      

      Wiersze java.util.zip.ZipException: incorrect header check i Caused by: java.util.zip.DataFormatException: incorrect header check w powyższym komunikacie o błędzie wskazują, że ładunek odpowiedzi nie jest wysyłany w formacie deflate i nie pasuje do kodowania określonego w nagłówku Content-Encoding deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu 502 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse do aplikacji klienckich.

Rozdzielczość

  1. Jeśli w przepływie proxy interfejsu API w Apigee Edge i na serwerze backendu nie jest potrzebny skompresowany ładunek odpowiedzi, nie przekazuj nagłówka Content-Encoding. Jeśli konieczne jest skompresowanie ładunku odpowiedzi, przejdź do kroku 2.
  2. Jeśli konieczne jest skompresowanie ładunku odpowiedzi, upewnij się, że serwer backendu zawsze wysyła te informacje:
    • dowolne obsługiwane kodowanie jako wartość nagłówka Content-Encoding w odpowiedzi.
    • Ładunek odpowiedzi w obsługiwanym formacie do Apigee Edge jest zgodny z formatem kodowania określonym w nagłówku Content-Encoding.
  3. W omówionym powyżej przykładzie ładunek odpowiedzi jest w formacie ZIP, ale nagłówek odpowiedzi określa Content-Encoding: gzip. Możesz rozwiązać ten problem, wysyłając nagłówek odpowiedzi jako Content-Encoding: gzip, a ładunek odpowiedzi w formacie 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)>
    

Specyfikacja

Apigee Edge odpowiada kodem stanu 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse zgodnie ze specyfikacjami RFC:

Specyfikacja
RFC 7231, sekcja 6.5.1
RFC 7231, sekcja 3.1.2.2

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.

musi zbierać informacje diagnostyczne;

Zbierz te informacje diagnostyczne, a potem skontaktuj się z zespołem pomocy Apigee Edge:

Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:

  • Nazwa organizacji
  • Nazwa środowiska
  • Nazwa proxy interfejsu API
  • Pełne polecenie curl użyte do odtworzenia błędu 502
  • Plik śledzenia odpowiedzi interfejsu API

Jeśli jesteś użytkownikiem chmury Private Cloud, podaj te informacje:

  • Pełny komunikat o błędzie w przypadku nieudanych odpowiedzi
  • Nazwa środowiska
  • Pakiet proxy interfejsu API
  • Plik śledzenia odpowiedzi interfejsu API
  • Logi dostępu NGINX/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Gdzie: ORG, ENVPORT# są zastępowane rzeczywistymi wartościami.

  • Dzienniki systemowe procesora komunikatów /opt/apigee/var/log/edge-message-processor/logs/system.log