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-Encodingder HTTP-Antwort (vom Backend-/Zielserver) angegebene Codierung ist gültig und wird von Apigee Edge unterstützt. - Das vom Backend-/Zielserver als Teil der HTTP-Antwort gesendete Nutzlastformat entspricht nicht dem im
Content-Encoding-Header angegebenen Codierungsformat.
ABER
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 Weitere Informationen finden Sie unter RFC1952 GZIP Format. |
| Einzelne Codierung | deflate | Dieses Format verwendet die |
| Mehrfachcodierung | Mehrfachcodierung Das kann beispielsweise passieren, wenn die Codierung zweimal erfolgt:
|
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:
- Bei der Apigee Edge-Benutzeroberfläche anmelden als Nutzer mit einer geeigneten Rolle.
Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.
- Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
- Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
- Achten Sie darauf, dass der Filter Proxy auf Alle gesetzt ist.
- Stellen Sie den Fehlercode im Vergleich zur Zeit dar.
Wählen Sie eine Zelle mit dem Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponseaus, wie unten dargestellt:
Informationen zum Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponsewerden wie unten dargestellt angezeigt:
Klicken Sie auf Logs ansehen und maximieren Sie die Zeile, in der der Fehler
502aufgetreten ist.
- Notieren Sie sich im Fenster Logs die folgenden Details:
- Statuscode:
502 - Fehlerquelle:
target - Fehlercode:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- Statuscode:
- Wenn Fault Source den Wert
targethat, bedeutet das, dass das Format der Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im AntwortheaderContent-Encodingdes Backend-Servers angegeben ist.
Trace-Tool
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die Trace-Sitzung und führen Sie einen der folgenden Schritte aus:
- Warten Sie, bis der Fehler
502 Bad Gatewayauftritt. - Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus und reproduzieren Sie
502 Bad Gateway.
- Warten Sie, bis der Fehler
Prüfen Sie, ob Alle FlowInfos anzeigen aktiviert ist:
- Wählen Sie eine der fehlgeschlagenen Antworten aus und sehen Sie sich den Trace an.
- Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
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:
-
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"}}}
- Content-Encoding:
Gehen Sie direkt nach der Phase Response Received from target server (Antwort vom Zielserver empfangen) zur Fehlerphase:
Beachten Sie die Eigenschaften:
- Fehler:
Decompression failure at response - error.class::
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formaterror.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 FehlerDecompression failure at responsezurück.
Die Antwort vom Ziel-/Backend-Server ist in diesem Fall
200. Die Clientanwendung erhält jedoch eine502-Antwort, da der Fehler von Apigee Edge zurückgegeben wird.- Fehler:
Rufen Sie im Trace die Phase Response Sent to Client auf und klicken Sie darauf.
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"}}}
- Statuscode:
Rufen Sie im Trace die Phase AX (Analytics Data Recorded) auf und klicken Sie darauf.
- 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:
- Die Werte von X-Apigee-fault-code und X-Apigee-fault-source werden als
messaging.adaptors.http.flow.DecompressionFailureAtResponseundtargetangezeigt. Das bedeutet, dass das Format der Antwortnutzlast nicht mit der imContent-Encoding-Header angegebenen Codierung übereinstimmt.Antwortheader Wert X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie NGINX-Zugriffsprotokolle verwenden, um die wichtigsten Informationen zu HTTP-
502-Fehlern zu ermitteln. NGINX-Zugriffslogs prüfen:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDabei gilt:ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
- Suchen Sie nach
502-Fehlern in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Antworten, bei denen weiterhin502auftritt. Wenn Sie
502-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert vonmessaging.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.DecompressionFailureAtResponseX-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
- 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.
- Wenn der Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponseund die Fehlerquelle den Werttargethat, bedeutet dies, dass das Format der vom Backend-/Zielserver gesendeten Antwortnutzlast nicht mit der im AntwortheaderContent-Encodingangegebenen unterstützten Codierung übereinstimmt. 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:
-
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"
- In der oben genannten Fehlermeldung wird
"Decompression failure at response"angezeigt. Das bedeutet, dass die Antwort nicht mit der imContent-Encoding-Header angegebenen Codierung dekomprimiert werden konnte.
Trace
So validieren Sie die Ergebnisse mit Trace:
- Bestimmen Sie Content-Type und error.cause mit Trace, wie unter Häufige Diagnoseschritte beschrieben.
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 Gatewayund dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
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:
- 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.
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie die Anfrage auch von einem der Message Processors an den Backend-Server senden.
- Prüfen Sie die vom Backend-Server gesendete Antwort und ermitteln Sie den Wert, der im Antwortheader
Content-Encoding.übergeben wurde. - Ermitteln Sie das Format der Nutzlast, die als Teil der Anfrage gesendet wird.
- Wenn der Wert des Headers
Content-Encodingin der Liste der unterstützten Codierungen enthalten ist, das Format der Antwortnutzlast jedoch nicht mit der im HeaderContent-Encodingangegebenen 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
gzipan den HeaderContent-Encodinggesendet, der eine unterstützte Codierung in Apigee Edge ist. Die Dateiresponse_payload.zipwird jedoch als ZIP-Datei gesendet. Daher schlägt diese Antwort mit einem502 Bad Gateway-Fehler und dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponsefehl.
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.Log des Message Processors prüfen:
/opt/apigee/var/log/edge-message-processor/logs/system.logSuchen Sie nach
502-Fehlern während eines bestimmten Zeitraums (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Antworten, bei denen weiterhin502auftritt. Sie können den folgenden Suchstring verwenden:grep -ri "ZipException"
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() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred 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 formatDie Zeile
java.util.zip.ZipException: Not in GZIP formatin der oben genannten Fehlermeldung gibt an, dass die Antwortnutzlast nicht im GZIP-Format gesendet wird, obwohlContent-Encodingals „gzip“ angegeben ist. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode502mit dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponsean 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 checkDie Zeilen
java.util.zip.ZipException: incorrect header checkundCaused by: java.util.zip.DataFormatException: incorrect header checkin der obigen Fehlermeldung weisen darauf hin, dass die Antwortnutzlast nicht im Deflate-Format gesendet wird und nicht mit der im HeaderContent-Encodingvon Deflate angegebenen Codierung übereinstimmt. Daher löst Apigee Edge die Ausnahme aus und gibt den Statuscode502mit dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponsean Clientanwendungen zurück.
-
Auflösung
- 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-Encodingnicht übergeben werden. Wenn die Nutzlast der Antwort komprimiert werden muss, fahren Sie mit Schritt 2 fort. - 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.
- Eine der
unterstützten Codierungen als Wert für den
- Im oben beschriebenen Beispiel ist die Antwortnutzlast im ZIP-Format, im Antwortheader wird jedoch
Content-Encoding: gzipangegeben. Sie können das Problem beheben, indem Sie den Antwortheader alsContent-Encoding: gzipund die Antwortnutzlast im Formatgzipsenden: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 des502-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_logDabei 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