502 Bad Gateway – DekomprimierungionFailureAtResponse

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

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 ruft den folgenden Antwortcode ab:

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 Back-End/Zielserver) angegebene Codierung ist gültig und wird von Apigee Edge unterstützt.
  • ABER

  • Das Nutzlastformat, das vom Back-End/Zielserver als Teil der HTTP-Antwort gesendet wird, stimmt nicht mit dem im Header Content-Encoding angegebenen Codierungsformat überein.

Dies liegt daran, dass Apigee Edge die Nutzlast nicht mit der angegebenen Codierung decodieren kann, da das Format der Nutzlast nicht dasselbe Format wie die im Header Content-Encoding angegebene Codierung hat.

Im Folgenden finden Sie einige Beispiele für unterstützte Content-Encoding-Werte und wie Apigee Edge die Nutzlastdarstellung in diesen Fällen erwartet:

Szenario Content-Encoding Nutzlastdarstellung
Einzelcodierung gzip

Das Unix-Format gzip.

Siehe RFC1952 GZIP-Format.

Einzelcodierung Deflate

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

Siehe RFC1950 und RFC1951.

Mehrfachcodierung

Mehrfachcodierung

Wird die Codierung beispielsweise zweimal durchgeführt, kann das so aussehen:

  • gzip, deflate
  • GZIP, GZIP
  • deflate, gzip
  • verkleinern
Mehrfachcodierung, die in der im Header angegebenen Reihenfolge auf die Nutzlast angewendet wird.

Mögliche Ursachen für diesen Fehler:

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

Allgemeine Diagnoseschritte

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

API-Monitoring

So diagnostizieren Sie den Fehler mithilfe von API-Monitoring:

  1. Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
  2. Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.

  3. Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
  5. Achten Sie darauf, dass der Filter Proxy auf Alle festgelegt ist.
  6. Stellen Sie den Fehlercode der Zeit gegenüber.
  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, für die der Fehler 502 ausgegeben wird.

    ( 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 die Fehlerquelle den Wert target hat, bedeutet dies, dass das Format der Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im Antwortheader Content-Encoding des Back-End-Servers angegeben ist.

Trace-Tool

So diagnostizieren Sie den Fehler mit dem Trace-Tool:

  1. Aktivieren Sie die Trace-Sitzung und entweder:
    1. Warten Sie, bis der Fehler 502 Bad Gateway auftritt, oder
    2. Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus und reproduzieren Sie 502 Bad Gateway.
  2. Achten Sie darauf, dass Show all FlowInfos aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Antworten aus und untersuchen Sie den Trace.
  4. Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
  5. In der Regel tritt der Fehler in einem Ablauf direkt nach der Phase Antwort vom Zielserver erhalten auf, wie unten dargestellt:

    ( größeres Bild ansehen)

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

    • Inhaltscodierung: gzip
    • Antworttext: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Wechseln Sie direkt nach der Phase Antwort vom Zielserver erhalten 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. Dies bedeutet, dass Apigee Edge erwartet hat, dass die Antwortnutzlast im GZIP-Format vorliegt, wie im Header Content-Encoding angegeben (im vorherigen Schritt festgelegt).Daher kann Apigee Edge die Nutzlast nicht mit gzip dekomprimieren und gibt den Fehler Decompression failure at response zurück.

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

  8. Navigieren Sie im Trace zur Phase Response Sent to Client (Antwort an Kunden gesendet) und klicken Sie darauf.

    ( größeres Bild ansehen)

    Notieren Sie sich die folgenden Details aus dem Trace:

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

  10. Scrollen Sie nach unten zum Abschnitt Phase Details, Error Headers und bestimmen Sie die Werte für X-Apigee-Fehler-Code und X-Apigee-Fehler-Quelle, wie unten dargestellt:

    ( größeres Bild ansehen)

  11. Die Werte von X-Apigee-fault-code und X-Apigee-fault-code werden als messaging.adaptors.http.flow.DecompressionFailureAtResponse und target angezeigt. Dies zeigt an, dass das Format der Antwortnutzlast nicht mit der im Header Content-Encoding 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 mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-502-Fehlern ermitteln.
  2. Prüfen Sie die NGINX-Zugriffslogs:

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

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

  3. Prüfen Sie, ob während eines bestimmten Zeitraums 502-Fehler aufgetreten sind (ob das Problem in der Vergangenheit aufgetreten ist) oder ob Antworten mit 502 immer noch fehlschlagen.
  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-code.

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

    Der obige Beispieleintrag aus dem NGINX-Zugriffslog enthält die folgenden Werte für X-Apigee-fault-code und X-Apigee-fault-code :

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

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

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

Diagnose

  1. Bestimmen Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte erläutert.
  2. Wenn der Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse ist und die Fehlerquelle den Wert target hat, weist dies darauf hin, dass das Format der vom Back-End/Zielserver gesendeten Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im Antwortheader Content-Encoding angegeben ist.
  3. Sie können die Diskrepanz als Teil der HTTP-Antwort mit einer der folgenden Methoden ermitteln:

    Fehlermeldung

    So validieren Sie mithilfe der Fehlermeldung:

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

      Beispiel für eine Fehlermeldung:

      "faultstring":"Decompression failure at response"
      
    2. In der obigen Fehlermeldung wird "Decompression failure at response" angezeigt, was darauf hindeutet, dass die Antwort mit der im Header Content-Encoding angegebenen Codierung nicht dekomprimiert werden konnte.

    Trace

    So validieren Sie mit dem Trace:

    1. Bestimmen Sie Content-Type und error.cause mithilfe von Trace, wie unter Allgemeine Diagnoseschritte erläutert.
    2. Die Werte aus dem Beispiel-Trace lauten wie folgt:

      • Inhaltscodierung: gzip
      • error.cause::Not in GZIP format

      Der Wert im Antwortheader Content-Encoding ist gzip. Die Nutzlast der Antwort hat jedoch nicht das 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 mithilfe der tatsächlichen Anfrage:

    Wenn Sie Zugriff auf die eigentliche Anfrage an die Ziel-/Back-End-Server-Anwendung haben, führen Sie die folgenden Schritte aus:

    1. Wenn Sie ein Nutzer einer öffentlichen Cloud oder einer privaten Cloud sind, stellen Sie vom Back-End-Server selbst oder von einer anderen Maschine, von der Sie die Anfrage an den Back-End-Server senden dürfen, eine Anfrage direkt an den Back-End-Server.
    2. Wenn Sie ein Private Cloud-Nutzer sind, können Sie die Anfrage auch von einem der Message Processors an den Back-End-Server stellen.
    3. Prüfen Sie die vom Back-End-Server gesendete Antwort und ermitteln Sie den Wert, der im Antwortheader Content-Encoding. übergeben wird.
    4. Bestimmen 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 Codierung enthalten ist, das Format der Antwortnutzlast jedoch nicht mit der im Content-Encoding-Header angegebenen Codierung übereinstimmt, ist das 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)>
      

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

    Message Processor-Protokolle

    So validieren Sie mithilfe von Message Processor-Protokollen:

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

    1. Prüfen Sie das Message Processor-Protokoll:

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

    2. Suchen Sie, ob während eines bestimmten Zeitraums 502-Fehler aufgetreten sind (ob das Problem in der Vergangenheit aufgetreten ist) oder ob Antworten mit 502 immer noch fehlschlagen. Sie können die folgende Suchzeichenfolge verwenden:

      grep -ri "ZipException"
      
    3. Die Zeilen aus system.log sehen in etwa so aus:

      Szenario 1

      Szenario 1: Wenn die API-Antwort den Header „Content-Encoding: gzip“ hat

      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 obigen Fehlermeldung gibt an, dass die Antwortnutzlast nicht im GZIP-Format gesendet wird, obwohl Content-Encoding als gzip angegeben ist. Daher gibt 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 geben an, dass die Antwortnutzlast nicht im Deflate-Format gesendet wird und nicht mit der Codierung übereinstimmt, die im Content-Encoding-Header von Deflate angegeben ist. Daher gibt 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 die komprimierte Antwortnutzlast im API-Proxy-Fluss in Apigee Edge und auf dem Back-End-Server nicht erforderlich ist, übergeben Sie den Header Content-Encoding nicht. Wenn die Nutzlast der Antwort komprimiert werden muss, fahren Sie mit Schritt 2 fort.
  2. Wenn die Nutzlast der Antwort komprimiert werden muss, sorgen Sie dafür, dass der Back-End-Server immer Folgendes sendet:
    • 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 stimmt mit dem im Header Content-Encoding angegebenen Codierungsformat überein.
  3. Im oben beschriebenen Beispiel liegt die Antwortnutzlast im ZIP-Format vor, aber der Antwortheader gibt Content-Encoding: gzip an. 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 gemäß den folgenden RFC-Spezifikationen mit dem Statuscode 502 Bad Gateway und dem Fehlercode messaging.adaptors.http.flow.DecompressionFailureAtResponse:

Spezifikation
RFC 7231, Abschnitt 6.5.1
RFC 7231, Abschnitt 3.1.2.2

Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, lesen Sie Diagnoseinformationen müssen eingeholt werden.

Erfassen von Diagnoseinformationen erforderlich

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

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

  • Name der Organisation
  • Name der Umgebung
  • API-Proxy-Name
  • Führen Sie den Befehl curl aus, mit dem der Fehler 502 reproduziert wurde
  • Ablaufverfolgungsdatei für die API-Antworten

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

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

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

  • Systemprotokolle von Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log