502 Nieprawidłowa brama – DecompressionFailureAtResponse

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

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żesz też zobaczyć komunikat o błędzie podobny do tego:

{
   "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 odpowiedzi HTTP (z nagłówka backendu/serwera docelowego) Content-Encoding jest prawidłowe i obsługiwane przez Apigee Edge,
  • ALE

  • Format ładunku wysyłany przez backend/serwer docelowy w ramach odpowiedzi HTTP nie pasuje do formatu kodowania określonego w nagłówku Content-Encoding

Dzieje się tak, ponieważ Apigee Edge nie dekoduje ładunku za pomocą podanego kodowania, ponieważ format ładunku nie jest w tym samym formacie co kodowanie określone w nagłówku Content-Encoding.

Oto kilka przykładów obsługiwanych wartości Content-Encoding i informacje o tym, jak Apigee Edge oczekuje reprezentacji ładunku w takich przypadkach:

Scenariusz Content-Encoding Reprezentacja ładunku
Pojedyncze kodowanie gzip

Format Unix gzip.

Zobacz Format GZIP w standardzie RFC1952.

Pojedyncze kodowanie deflate

Ten format wykorzystuje strukturę zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951..

Wiele kodowania

Wiele kodowania

Jeśli na przykład kodowanie zostało wykonane dwukrotnie, może to wyglądać tak:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Do ładunku zastosowano wiele kodowania w takiej kolejności, w jakiej wyświetla się 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 wysyłanego przez backend/serwer docelowy jest niezakodowany albo nie pasuje do kodowania określonego w nagłówku Content-Encoding. Użytkownicy chmury publicznej i prywatnej usługi Edge

Najczęstsze kroki diagnostyki

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

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 interfejsów API > Zbadaj.
  4. Wybierz przedział czasu, w którym zaobserwowano błędy.
  5. Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
  6. Porównaj kod błędu z czasem.
  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łędu messaging.adaptors.http.flow.DecompressionFailureAtResponse są wyświetlane jak 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 Logi zwróć uwagę na te informacje:
    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Jeśli źródło błędu 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 do śledzenia

Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    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 Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:

  3. Wybierz 1 z odpowiedzi z wynikiem błędu i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
  5. Błąd pojawia się zwykle w procesie tuż po etapie Odpowiedź otrzymana z serwera docelowego, jak pokazano poniżej:

    ( wyświetl większy obraz)

  6. Zapisz wartości właściwości ze śledzenia:

    • Kodowanie treści: gzip
    • Treść odpowiedzi: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Przejdź do etapu błędu tuż po etapie Odpowiedź otrzymana z serwera docelowego:

    ( wyświetl większy obraz)

    Zwróć uwagę na te właściwości:

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

      Instrukcja error.cause wskazuje, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że usługa Apigee Edge oczekiwała, że ładunek odpowiedzi będzie w formacie GZIP, co określono w nagłówku Content-Encoding (co zostało określone w poprzednim kroku).W związku z tym Apigee Edge nie może dekompresować ładunku za pomocą narzędzia gzip i zwraca błąd Decompression failure at response.

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

  8. Przejdź do etapu Odpowiedź wysłana do klienta w logu czasu i kliknij ją.

    ( wyświetl większy obraz)

    Zwróć uwagę na te informacje logu czasu:

    • Kod stanu: 502 Bad Gateway.
    • Treść błędu: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Przejdź do etapu AX (rejestrowane dane Analytics) w logu czasu i kliknij go.

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

    ( wyświetl większy obraz)

  11. Będą widoczne wartości X-Apigee-fault-code i X-Apigee-fault-source jako messaging.adaptors.http.flow.DecompressionFailureAtResponse oraz target, 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 przy użyciu logów dostępu NGINX:

  1. Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP 502.
  2. Sprawdź logi dostępu do NGINX:

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

    Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  3. Sprawdź, czy w danym okresie wystąpiły jakieś błędy 502 (jeśli problem wystąpił w przeszłości) lub czy jakieś odpowiedzi wciąż kończą się niepowodzeniem (502).
  4. Jeśli znajdziesz błędy 502 z kodem X-Apigee-fault-code zgodnym z wartością messaging.adaptors.http.flow.DecompressionFailureAtResponse, sprawdź wartość źródła błędów X-Apigee.

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

    Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodu X-Apigee-fault-code i X-Apigee-fault-code :

    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. Dlatego format ładunku odpowiedzi powinien być zgodny z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding. Jeśli występuje niezgodność, pojawia się ten błąd.

Diagnostyka

  1. Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu logów dostępu API monitorowania, narzędzia do śledzenia lub NGINX zgodnie z opisem w częstych krokach diagnostyki.
  2. Jeśli kod błędu to messaging.adaptors.http.flow.DecompressionFailureAtResponse, a źródło błędu ma wartość target, oznacza to, że format ładunku odpowiedzi wysłanego przez backend/serwer docelowy nie pasuje do obsługiwanego kodowania określonego w nagłówku odpowiedzi Content-Encoding.
  3. Możesz zidentyfikować niezgodność w odpowiedzi HTTP, korzystając z jednej z tych metod:

    Komunikat o błędzie

    Aby przeprowadzić weryfikację przy użyciu komunikatu o błędzie:

    1. Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z dokumentem 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 odpowiedzi nie udało się zdekompresować za pomocą kodowania określonego w nagłówku Content-Encoding.

    Trace

    Aby sprawdzić poprawność danych za pomocą logu czasu:

    1. Określ Content-Type i error.cause za pomocą śledzenia zgodnie z opisem w częstych krokach diagnostyki.
    2. Wartości z przykładowego logu czasu są następujące:

      • Kodowanie treści: 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 na to error.cause). Dlatego Apigee Edge w odpowiedzi wysyła 502 Bad Gateway i kod 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 backendu, wykonaj te czynności:

    1. Jeśli jesteś użytkownikiem chmury publicznej/chmury prywatnej, wyślij żądanie bezpośrednio do serwera backendu z samego serwera backendu lub dowolnej innej maszyny, z której możesz je wysyłać do serwera backendu.
    2. Jeśli jesteś użytkownikiem Private Cloud, możesz też wysłać żądanie do serwera backendu z jednego z podmiotów przetwarzających wiadomości.
    3. Sprawdź odpowiedź wysłaną przez serwer backendu i ustal 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ługiwanego kodowania, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówku Content-Encoding, to jest 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)>
      

      Powyższa przykładowa odpowiedź wysyła wartość gzip do nagłówka Content-Encoding, które jest obsługiwanym kodowaniem w Apigee Edge. response_payload.zip jest jednak wysyłana jako plik ZIP. Dlatego ta odpowiedź kończy się błędem 502 Bad Gateway z kodem błędu: messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Logi procesora wiadomości

    Aby sprawdzić poprawność danych za pomocą dzienników procesora wiadomości:

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

    1. Sprawdź dziennik procesora wiadomości:

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

    2. Sprawdź, czy w danym okresie wystąpiły jakieś błędy 502 (jeśli problem wystąpił w przeszłości) lub czy jakieś odpowiedzi wciąż kończą się niepowodzeniem z 502. Możesz użyć tego ciągu wyszukiwania:

      grep -ri "ZipException"
      
    3. Znajdą się w nim wiersze z pliku system.log podobne do tych:

      Scenariusz 1

      Scenariusz 1. Odpowiedź interfejsu API ma 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 oznacza, że ładunek odpowiedzi nie został wysłany w formacie GZIP, mimo że Content-Encoding jest określony jako gzip. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu 502 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.

      Scenariusz 2

      Scenariusz 2. Odpowiedź interfejsu API ma 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 został wysłany w formacie deflate i nie pasuje do kodowania określonego w nagłówku Content-Encoding tagu deflate. Dlatego Apigee Edge zgłasza wyjątek i zwraca aplikacjom klienckim kod stanu 502 z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse.

Rozdzielczość

  1. Jeśli nie potrzebujesz skompresowanego ładunku odpowiedzi w przepływie serwera proxy interfejsu API w Apigee Edge i na serwerze backendu, nie przekazuj nagłówka Content-Encoding. Jeśli musisz skompresować ładunek odpowiedzi, przejdź do kroku 2.
  2. Jeśli musisz skompresować ładunek odpowiedzi, sprawdź, czy serwer backendu zawsze wysyła:
    • Dowolne obsługiwane kodowanie jako wartość nagłówka Content-Encoding w odpowiedzi
    • Ładunek odpowiedzi w obsługiwanym formacie Apigee Edge pasuje do formatu kodowania określonego w nagłówku Content-Encoding
  3. W podanym wyżej przykładzie ładunek odpowiedzi jest w formacie ZIP, ale w nagłówku odpowiedzi podano Content-Encoding: gzip. Aby rozwiązać ten problem, wyślij nagłówek odpowiedzi w formacie 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 w odpowiedzi przesyła kod stanu 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse zgodnie z tą specyfikacją RFC:

Specyfikacja
RFC 7231, sekcja 6.5.1
RFC 7231, sekcja 3.1.2.2

Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Musisz zebrać informacje diagnostyczne.

Musisz zebrać informacje diagnostyczne

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

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

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

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

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

    Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  • Dzienniki systemowe procesora wiadomości /opt/apigee/var/log/edge-message-processor/logs/system.log