502 Bad Gateway – DekomprimierungionFailureAtResponse

Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen
info

Symptom

Die Clientanwendung erhält als Antwort auf API-Aufrufe den HTTP-Statuscode 502 Bad Gateway mit dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse.

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 502 Bad Gateway

Außerdem wird möglicherweise eine Fehlermeldung wie die folgende angezeigt:

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

Mögliche Ursachen

Dieser Fehler tritt nur in folgenden Fällen auf:

  • Die im Header Content-Encoding der HTTP-Antwort (vom Backend-/Zielserver) angegebene Codierung ist gültig und wird von Apigee Edge unterstützt.
  • ABER

  • Das vom Backend-/Zielserver als Teil der HTTP-Antwort gesendete Nutzlastformat entspricht nicht dem im Content-Encoding -Header angegebenen Codierungsformat.

Das liegt daran, dass Apigee Edge die Nutzlast nicht mit der angegebenen Codierung decodieren kann, da das Format der Nutzlast nicht mit der im Content-Encoding-Header angegebenen Codierung übereinstimmt.

Hier sind einige Beispiele für unterstützte Content-Encoding-Werte und wie die Nutzlastdarstellung in diesen Fällen in Apigee Edge aussehen muss:

Szenario Content-Encoding Nutzlastdarstellung
Einzelne Codierung GZIP

Das Unix-Format gzip.

Weitere Informationen finden Sie unter RFC1952 GZIP Format.

Einzelne Codierung deflate

Dieses Format verwendet die zlib-Struktur mit dem Deflate-Komprimierungsalgorithmus.

Weitere Informationen finden Sie in RFC1950 und RFC1951..

Mehrfachcodierung

Mehrfachcodierung

Das kann beispielsweise passieren, wenn die Codierung zweimal erfolgt:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Mehrere Codierungen, die in der angegebenen Reihenfolge auf die Nutzlast angewendet werden, wie sie im Header angegeben sind.

Mögliche Ursachen für diesen Fehler:

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Das Format der Antwortnutzlast stimmt nicht mit der Content-Encoding überein. Das Format der vom Backend-/Zielserver gesendeten Antwortnutzlast ist entweder nicht codiert oder entspricht nicht der im Header Content-Encoding angegebenen Codierung. Nutzer der Edge Public und Private Cloud

Allgemeine Diagnoseschritte

Verwenden Sie eines der folgenden Tools oder Verfahren, um diesen Fehler zu diagnostizieren:

API-Monitoring

So diagnostizieren Sie den Fehler mit API Monitoring:

  1. Bei der Apigee Edge-Benutzeroberfläche anmelden als Nutzer mit einer geeigneten Rolle.
  2. Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.

  3. Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
  5. Achten Sie darauf, dass der Filter Proxy auf Alle gesetzt ist.
  6. Stellen Sie den Fehlercode im Vergleich zur Zeit dar.
  7. Wählen Sie eine Zelle mit dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse aus, wie unten dargestellt:

    ( größeres Bild ansehen)

  8. Informationen zum Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse werden wie unten dargestellt angezeigt:

    ( größeres Bild ansehen)

  9. Klicken Sie auf Logs ansehen und maximieren Sie die Zeile, in der der Fehler 502 aufgetreten ist.

    ( größeres Bild ansehen)

  10. Notieren Sie sich im Fenster Logs die folgenden Details:
    • Statuscode:502
    • Fehlerquelle: target
    • Fehlercode:messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Wenn Fault Source den Wert target hat, bedeutet das, dass das Format der Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im Antwortheader Content-Encoding des Backend-Servers angegeben ist.

Trace-Tool

So diagnostizieren Sie den Fehler mit dem Trace-Tool:

  1. Aktivieren Sie die Trace-Sitzung und führen Sie einen der folgenden Schritte aus:
    1. Warten Sie, bis der Fehler 502 Bad Gateway auftritt.
    2. Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus und reproduzieren Sie 502 Bad Gateway.
  2. Prüfen Sie, ob Alle FlowInfos anzeigen aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Antworten aus und sehen Sie sich den Trace an.
  4. Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
  5. Der Fehler tritt in der Regel in einem Ablauf direkt nach der Phase Response Received from target server (Antwort vom Zielserver empfangen) auf, wie unten dargestellt:

    ( größeres Bild ansehen)

  6. Notieren Sie sich die Werte der Attribute aus dem Trace:

    • Content-Encoding: gzip
    • Antworttext:{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Gehen Sie direkt nach der Phase Response Received from target server (Antwort vom Zielserver empfangen) zur Fehlerphase:

    ( größeres Bild ansehen)

    Beachten Sie die Eigenschaften:

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

      error.cause gibt an, dass die Antwortnutzlast nicht im GZIP-Format vorliegt. Das bedeutet, dass Apigee Edge erwartet hat, dass die Antwortnutzlast im GZIP-Format vorliegt, wie im Content-Encoding-Header angegeben (im vorherigen Schritt ermittelt).Daher kann Apigee Edge die Nutzlast nicht mit GZIP dekomprimieren und gibt den Fehler Decompression failure at response zurück.

    Die Antwort vom Ziel-/Backend-Server ist in diesem Fall 200. Die Clientanwendung erhält jedoch eine 502-Antwort, da der Fehler von Apigee Edge zurückgegeben wird.

  8. Rufen Sie im Trace die Phase Response Sent to Client auf und klicken Sie darauf.

    ( größeres Bild ansehen)

    Beachten Sie die folgenden Details aus dem Trace:

    • Statuscode:502 Bad Gateway.
    • Fehlerinhalt: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Rufen Sie im Trace die Phase AX (Analytics Data Recorded) auf und klicken Sie darauf.

  10. Scrollen Sie nach unten zum Abschnitt Phasendetails und Fehlerheader und ermitteln Sie die Werte von X-Apigee-fault-code und X-Apigee-fault-source, wie unten dargestellt:

    ( größeres Bild ansehen)

  11. Die Werte von X-Apigee-fault-code und X-Apigee-fault-source werden als messaging.adaptors.http.flow.DecompressionFailureAtResponse und target angezeigt. Das bedeutet, dass das Format der Antwortnutzlast nicht mit der im Content-Encoding-Header angegebenen Codierung übereinstimmt.
    Antwortheader Wert
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:

  1. Wenn Sie ein Private Cloud-Nutzer sind, können Sie NGINX-Zugriffsprotokolle verwenden, um die wichtigsten Informationen zu HTTP-502-Fehlern zu ermitteln.
  2. NGINX-Zugriffslogs prüfen:

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

    Dabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.

  3. Suchen Sie nach 502-Fehlern in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Antworten, bei denen weiterhin 502 auftritt.
  4. Wenn Sie 502-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert von messaging.adaptors.http.flow.DecompressionFailureAtResponse übereinstimmt, ermitteln Sie den Wert von X-Apigee-fault-source.

    Beispiel für einen 502-Fehler aus dem NGINX-Zugriffslog:

    Der obige Beispiel-Eintrag aus dem NGINX-Zugriffslog hat die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-source:

    Antwortheader Wert
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Ursache: Das Format der Antwortnutzlast stimmt nicht mit der Content-Encoding überein.

Standardmäßig dekomprimiert Apigee Edge die Nutzlast immer, wenn der Antwortheader Content-Encoding eine gültige und von Apigee unterstützte Codierung enthält. Daher wird erwartet, dass das Format der Antwortnutzlast mit der im Antwortheader Content-Encoding angegebenen Codierung übereinstimmt. Wenn es eine Abweichung gibt, wird dieser Fehler angezeigt.

Diagnose

  1. Ermitteln Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte beschrieben.
  2. Wenn der Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse und die Fehlerquelle den Wert target hat, bedeutet dies, dass das Format der vom Backend-/Zielserver gesendeten Antwortnutzlast nicht mit der im Antwortheader Content-Encoding angegebenen unterstützten Codierung übereinstimmt.
  3. Sie können die Abweichung als Teil der HTTP-Antwort mit einer der folgenden Methoden ermitteln:

    Fehlermeldung

    So validieren Sie die Inhaberschaft mit der Fehlermeldung:

    1. Wenn Sie Zugriff auf die vollständige Fehlermeldung haben, die Sie von Apigee Edge erhalten haben, lesen Sie die Informationen unter faultstring.

      Beispiel für eine Fehlermeldung:

      "faultstring":"Decompression failure at response"
    2. In der oben genannten Fehlermeldung wird "Decompression failure at response" angezeigt. Das bedeutet, dass die Antwort nicht mit der im Content-Encoding-Header angegebenen Codierung dekomprimiert werden konnte.

    Trace

    So validieren Sie die Ergebnisse mit Trace:

    1. Bestimmen Sie Content-Type und error.cause mit Trace, wie unter Häufige Diagnoseschritte beschrieben.
    2. Die Werte aus dem Beispiel-Trace sind:

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

      Der Wert im Antwortheader Content-Encoding ist gzip. Die Antwortnutzlast ist jedoch nicht im GZIP-Format (wie durch error.cause angegeben). Daher antwortet Apigee Edge mit 502 Bad Gateway und dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Tatsächliche Anfrage

    So validieren Sie die Anfrage:

    Wenn Sie Zugriff auf die tatsächliche Anfrage haben, die an die Ziel-/Backend-Serveranwendung gesendet wurde, führen Sie die folgenden Schritte aus:

    1. Wenn Sie ein Public Cloud-/Private Cloud-Nutzer sind, stellen Sie eine Anfrage direkt an den Backend-Server, entweder vom Backend-Server selbst oder von einem anderen Computer, von dem aus Sie die Anfrage an den Backend-Server senden dürfen.
    2. Wenn Sie ein Private Cloud-Nutzer sind, können Sie die Anfrage auch von einem der Message Processors an den Backend-Server senden.
    3. Prüfen Sie die vom Backend-Server gesendete Antwort und ermitteln Sie den Wert, der im Antwortheader Content-Encoding. übergeben wurde.
    4. Ermitteln Sie das Format der Nutzlast, die als Teil der Anfrage gesendet wird.
    5. Wenn der Wert des Headers Content-Encoding in der Liste der unterstützten Codierungen enthalten ist, das Format der Antwortnutzlast jedoch nicht mit der im Header Content-Encoding angegebenen Codierung übereinstimmt, ist dies die Ursache des Problems.

      Beispiel:

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

      In der obigen Beispielantwort wird der Wert gzip an den Header Content-Encoding gesendet, der eine unterstützte Codierung in Apigee Edge ist. Die Datei response_payload.zip wird jedoch als ZIP-Datei gesendet. Daher schlägt diese Antwort mit einem 502 Bad Gateway-Fehler und dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse fehl.

    Logs des Message Processors

    So validieren Sie die Einrichtung anhand von Message Processor-Logs:

    Wenn Sie Private Cloud-Nutzer sind, können Sie die Message Processor-Logs verwenden, um die wichtigsten Informationen zu HTTP-502-Fehlern zu ermitteln.

    1. Log des Message Processors prüfen:

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

    2. Suchen Sie nach 502-Fehlern während eines bestimmten Zeitraums (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Antworten, bei denen weiterhin 502 auftritt. Sie können den folgenden Suchstring verwenden:

      grep -ri "ZipException"
      
    3. In system.log finden Sie Zeilen, die in etwa so aussehen:

      Szenario 1

      Szenario 1: Wenn die API-Antwort den Header „Content-Encoding: gzip“ enthält

      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
      

      Die Zeile java.util.zip.ZipException: Not in GZIP format in der oben genannten Fehlermeldung gibt an, dass die Antwortnutzlast nicht im GZIP-Format gesendet wird, obwohl Content-Encoding als „gzip“ angegeben ist. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode 502 mit dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse an Clientanwendungen zurück.

      Szenario 2

      Szenario 2: Wenn die API-Antwort den Header „Content-Encoding: deflate“ enthält

      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
      
      

      Die Zeilen java.util.zip.ZipException: incorrect header check und Caused by: java.util.zip.DataFormatException: incorrect header check in der obigen Fehlermeldung weisen darauf hin, dass die Antwortnutzlast nicht im Deflate-Format gesendet wird und nicht mit der im Header Content-Encoding von Deflate angegebenen Codierung übereinstimmt. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode 502 mit dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse an Clientanwendungen zurück.

Auflösung

  1. Wenn der komprimierte Antwort-Payload im API-Proxy-Ablauf in Apigee Edge und auf dem Backend-Server nicht benötigt wird, darf der Header Content-Encoding nicht übergeben werden. Wenn die Nutzlast der Antwort komprimiert werden muss, fahren Sie mit Schritt 2 fort.
  2. Wenn die Nutzlast der Antwort komprimiert werden muss, muss der Back-End-Server immer Folgendes senden:
    • Eine der unterstützten Codierungen als Wert für den Content-Encoding-Header in der Antwort
    • Die Antwortnutzlast im unterstützten Format für Apigee Edge entspricht dem im Content-Encoding-Header angegebenen Codierungsformat.
  3. Im oben beschriebenen Beispiel ist die Antwortnutzlast im ZIP-Format, im Antwortheader wird jedoch Content-Encoding: gzip angegeben. Sie können das Problem beheben, indem Sie den Antwortheader als Content-Encoding: gzip und die Antwortnutzlast im Format gzip senden:
    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)>
    

Spezifikation

Apigee Edge antwortet mit dem Statuscode 502 Bad Gateway und dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse gemäß den folgenden RFC-Spezifikationen:

Spezifikation
RFC 7231, Abschnitt 6.5.1
RFC 7231, Abschnitt 3.1.2.2

Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee Edge-Support:

Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Name der Organisation
  • Name der Umgebung
  • Name des API-Proxys
  • Vollständiger curl-Befehl, der zum Reproduzieren des 502-Fehlers verwendet wurde
  • Trace-Datei für die API-Antworten

Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Vollständige Fehlermeldung für die fehlgeschlagenen Antworten
  • Name der Umgebung
  • API-Proxy-Bundle
  • Trace-Datei für die API-Antworten
  • NGINX-Zugriffslogs /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.

  • Systemprotokolle des Message Processors /opt/apigee/var/log/edge-message-processor/logs/system.log