502 Nieprawidłowa brama – DecompressionFailureAtResponse

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway z kodem błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse jako odpowiedź na interfejs API połączeń.

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 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/serwera docelowego) Atrybut Content-Encoding jest prawidłowy i . obsługiwane przez Apigee Edge,
  • ALE

  • Format ładunku wysyłany przez serwer backendu/serwer docelowy w ramach odpowiedzi HTTP nie pasuje do formatu kodowania określonego w 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 parametrze Nagłówek Content-Encoding.

Oto kilka przykładów obsługiwanych wartości Content-Encoding oraz sposób działania Apigee Edge oczekuje, że ładunek będzie reprezentowany w tych przypadkach:

Scenariusz Content-Encoding Reprezentacja ładunku
Pojedyncze kodowanie gzip

Format uniksowy gzip.

Zobacz RFC1952 GZIP Format.

Pojedyncze kodowanie Deflate

Ten format wykorzystuje strukturę zlib z algorytmem kompresji deflate.

Zobacz RFC1950 i RFC1951.

Wielokrotne kodowanie

Wielokrotne kodowanie

Jeśli na przykład kodowanie jest wykonywane 2 razy, może to być:

  • gzip, deflate, gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Do ładunku zastosowano wiele kodowania, w podanej kolejności, w jakiej występuje w nagłówku.

Możliwe przyczyny tego błędu są następujące:

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

Typowe kroki diagnostyki

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

Monitorowanie interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsów API:

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

  3. Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
  4. Wybierz okres, w którym zaobserwowano błędy.
  5. Upewnij się, że filtr Serwer proxy jest ustawiony na Wszystkie.
  6. Porównaj Kod błędu z czasem.
  7. Wybierz komórkę, która ma kod błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse jako poniżej:

    ( wyświetl większy obraz)

  8. Informacje o kodzie błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse jest wyświetlany w następujący sposób:

    ( 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ługiwane kodowanie określone w nagłówku odpowiedzi serwera backendu Content-Encoding.

Narzędzie śledzenia

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

  1. Włącz sesję śledzenia. oraz:
    1. Poczekaj, aż wystąpi błąd 502 Bad Gateway lub
    2. Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz te dane. 502 Bad Gateway
  2. Sprawdź, czy opcja Show all FlowInfos jest włączona:

  3. Wybierz jedną z odpowiedzi zakończonych niepowodzeniem i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd .
  5. Błąd pojawia się zazwyczaj zaraz po Faza Odebrano odpowiedź z serwera docelowego, jak pokazano poniżej:

    ( wyświetl większy obraz)

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

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

    ( wyświetl większy obraz)

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

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

      Zapis error.cause wskazuje, że ładunek odpowiedzi nie jest w formacie GZIP. Oznacza to, że Apigee Edge oczekiwał, że ładunek odpowiedzi będzie w formacie GZIP została określona w nagłówku Content-Encoding (określono w poprzednim kroku).Dlatego Apigee Edge nie może dekompresować ładunku za pomocą narzędzia gzip i zwraca błąd Decompression failure at response.

    Zwróć uwagę, że odpowiedź serwera docelowego/backendowego to 200 w case; jednak aplikacja kliencka otrzyma 502 ponieważ Apigee zwraca błąd.

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

    ( wyświetl większy obraz)

    Zanotuj te informacje ze śledzenia:

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

  10. Przewiń w dół do sekcji Phase Details (Szczegóły etapu), Error Headers (Nagłówki błędów). Wyznacz wartości X-Apigee-fault-code i X-Apigee-fault-source jak poniżej:

    ( wyświetl większy obraz)

  11. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source. jako messaging.adaptors.http.flow.DecompressionFailureAtResponse i target, co oznacza, że format ładunku odpowiedzi nie pasuje do kodowanie określone 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żywać logów dostępu NGINX do: określenie najważniejszych 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: wartości ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  3. Wyszukaj błędy (502) w danym okresie (jeśli problem wystąpił w przeszłości) lub jeśli jakieś odpowiedzi nadal występują 502
  4. Jeśli znajdziesz błędy 502 z kodem błędu X-Apigee-fault-code pasujący do wartości messaging.adaptors.http.flow.DecompressionFailureAtResponse, a następnie określ wartość źródła X-Apigee-fault-source..

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

    Powyższy przykładowy wpis z logu dostępu NGINX zawiera następujące wartości dla: 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 Content-Encoding

Domyślnie Apigee Edge zawsze dekompresuje ładunek, jeśli nagłówek odpowiedzi Content-Encoding zawiera prawidłowe i a obsługiwane kodowanie. Można więc oczekiwać, że format ładunku odpowiedzi powinno być zgodne z kodowaniem określonym w nagłówku odpowiedzi Content-Encoding. Ten błąd pojawia się w przypadku niezgodności.

Diagnostyka

  1. Określ kod błędu i źródło błędu dla błędu zaobserwowanego za pomocą interfejsu API. Logi monitorowania, narzędzia śledzenia lub logi dostępu NGINX zgodnie z opisem w artykule Najczęstsze czynności diagnostyczne.
  2. Jeśli kod błędu to messaging.adaptors.http.flow.DecompressionFailureAtResponse oraz Źródło błędu ma wartość target, a następnie ten wskazuje, że format ładunku odpowiedzi wysłanego przez serwer backendu/serwer docelowy nie pasuje do obsługiwane kodowanie określone w nagłówku odpowiedzi Content-Encoding.
  3. Możesz określić niezgodność w ramach odpowiedzi HTTP, używając jednego z tych argumentów metody:

    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, przeczytaj faultstring.

      Przykładowy komunikat o błędzie:

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

    Śledzenie

    Aby przeprowadzić weryfikację za pomocą logu czasu:

    1. Określ Content-Type i error.cause. za pomocą Trace zgodnie z opisem w sekcji Typowe kroki 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. ładunek odpowiedzi nie jest w formacie GZIP, (jak wskazuje error.cause). Dlatego Apigee Edge przekazuje odpowiedź 502 Bad Gateway i kod błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse

    Rzeczywiste żądanie

    Aby przeprowadzić weryfikację na podstawie rzeczywistego żądania:

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

    1. Jeśli korzystasz z chmury publicznej lub Private Cloud, prześlij prośbę bezpośrednio do serwera backendu z serwera backendu lub jakiegokolwiek innego na którym możesz wysłać żądanie do serwera backendu.
    2. Jeśli jesteś użytkownikiem Private Cloud, możesz też wysłać prośbę z jednego z procesorów komunikatów.
    3. Zbadaj odpowiedź wysłaną przez serwer backendu i określ wartość przekazywane w nagłówku odpowiedzi Content-Encoding.
    4. Określ format ładunku wysłanego w ramach żądania.
    5. Jeśli wartość nagłówka Content-Encoding znajduje się na liście obsługiwane kodowanie, ale format ładunku odpowiedzi nie pasuje do kodowania określonego w nagłówku Content-Encoding, to jest właśnie 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 funkcji Content-Encoding, który jest obsługiwane kodowanie w Apigee Edge. Jednak response_payload.zip jest wysyłany w postaci pliku ZIP. Dlatego odpowiedź kończy się niepowodzeniem i jest wyświetlany błąd 502 Bad Gateway z kodem błędu: messaging.adaptors.http.flow.DecompressionFailureAtResponse

    Logi procesora wiadomości

    Aby przeprowadzić weryfikację za pomocą logów procesora wiadomości:

    Jeśli jesteś użytkownikiem Private Cloud, możesz używać logów procesora wiadomości w celu ustalenia najważniejszych informacji o błędach HTTP 502.

    1. Sprawdź dziennik procesora wiadomości:

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

    2. Wyszukaj błędy 502 w konkretnym okresie czas trwania (jeśli problem wystąpił w przeszłości) lub jeśli pojawią się jakieś odpowiedzi; nadal występują błędy z użyciem funkcji 502. Możesz użyć takiego ciągu wyszukiwania:

      grep -ri "ZipException"
      
    3. Znajdziesz w nim wiersze z pliku system.log podobne do tych:

      Scenariusz 1

      Scenariusz 1. Gdy 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 wskazuje, że odpowiedź nie jest wysyłany w formacie GZIP, chociaż 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. Gdy 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
      
      

      Linie java.util.zip.ZipException: incorrect header check oraz Caused by: java.util.zip.DataFormatException: incorrect header check w powyższym komunikacie o błędzie wskazuje, że ładunek odpowiedzi nie został wysłany w deflate i nie pasuje do kodowania określonego w Content-Encoding nagłówek deflate. W związku z tym Apigee Edge zgłasza wyjątek i zwraca kod stanu 502 z kod błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse do aplikacji klienckich.

Rozdzielczość

  1. Jeśli nie ma potrzeby skompresowanego ładunku odpowiedzi w procesie serwera proxy interfejsu API w Apigee Edge i na serwerze backendu, nie przekazuj nagłówka Content-Encoding. Jeśli chcesz skompresować ładunek odpowiedzi, przejdź do kroku 2.
  2. Jeśli musisz skompresować ładunek odpowiedzi, upewnij się, że serwer backendu zawsze wysyła to:
    • Dowolny obsługiwane kodowanie jako wartość nagłówka Content-Encoding w polu odpowiedź
    • Ładunek odpowiedzi w obsługiwanym formacie Apigee Edge jest zgodny z kodowaniem format określony w nagłówku Content-Encoding
  3. W przykładzie powyżej ładunek odpowiedzi jest w formacie ZIP, ale jej nagłówek określa Content-Encoding: gzip. Możesz rozwiązać problem, wysyłając odpowiedź nagłówek jako Content-Encoding: gzip oraz ładunek odpowiedzi w gzip format:
    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 wysyła kod stanu 502 Bad Gateway zawierający kod błędu messaging.adaptors.http.flow.DecompressionFailureAtResponse zgodnie z poniższym RFC specyfikacje:

Specyfikacja
RFC 7231, sekcja 6.5.1
RFC 7231, sekcja 3.1.2.2

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, wejdź na Musi zbierać informacje diagnostyczne.

Musi zbierać informacje diagnostyczne

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

Jeśli jesteś użytkownikiem Public Cloud, 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:

  • Pełny komunikat o błędzie zaobserwowany dla odpowiedzi zakończonych niepowodzeniem
  • Nazwa środowiska
  • Pakiet serwera 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, ENV i PORT# są zastępowane przez wartości rzeczywiste.

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