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. - 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.
ABER
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 Siehe RFC1952 GZIP-Format. |
Einzelcodierung | Deflate | Dieses Format verwendet die |
Mehrfachcodierung | Mehrfachcodierung Wird die Codierung beispielsweise zweimal durchgeführt, kann das so aussehen:
|
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:
- Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.
- Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
- Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
- Achten Sie darauf, dass der Filter Proxy auf Alle festgelegt ist.
- Stellen Sie den Fehlercode der Zeit gegenüber.
Wählen Sie eine Zelle mit dem Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponse
aus, wie unten dargestellt:Informationen zum Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponse
werden wie unten dargestellt angezeigt:Klicken Sie auf Logs ansehen und maximieren Sie die Zeile, für die der Fehler
502
ausgegeben wird.- Notieren Sie sich im Fenster Logs die folgenden Details:
- Statuscode:
502
- Fehlerquelle:
target
- Fehlercode:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- Statuscode:
- Wenn die Fehlerquelle den Wert
target
hat, bedeutet dies, dass das Format der Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im AntwortheaderContent-Encoding
des Back-End-Servers angegeben ist.
Trace-Tool
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die Trace-Sitzung und entweder:
- Warten Sie, bis der Fehler
502 Bad Gateway
auftritt, oder - 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
Achten Sie darauf, dass Show all FlowInfos aktiviert ist:
- Wählen Sie eine der fehlgeschlagenen Antworten aus und untersuchen Sie den Trace.
- Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
In der Regel tritt der Fehler in einem Ablauf direkt nach der Phase Antwort vom Zielserver erhalten auf, wie unten dargestellt:
-
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"}}}
- Inhaltscodierung:
Wechseln Sie direkt nach der Phase Antwort vom Zielserver erhalten zur Fehlerphase:
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 FehlerDecompression 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 eine502
-Antwort, da der Fehler von Apigee Edge zurückgegeben wird.- Fehler:
Navigieren Sie im Trace zur Phase Response Sent to Client (Antwort an Kunden gesendet) und klicken Sie darauf.
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"}}}
- Status code:
Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
- 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:
- Die Werte von X-Apigee-fault-code und X-Apigee-fault-code werden als
messaging.adaptors.http.flow.DecompressionFailureAtResponse
undtarget
angezeigt. Dies zeigt an, dass das Format der Antwortnutzlast nicht mit der im HeaderContent-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:
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-
502
-Fehlern ermitteln. 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.
- Prüfen Sie, ob während eines bestimmten Zeitraums
502
-Fehler aufgetreten sind (ob das Problem in der Vergangenheit aufgetreten ist) oder ob Antworten mit502
immer noch fehlschlagen. 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-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
- 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.
- Wenn der Fehlercode
messaging.adaptors.http.flow.DecompressionFailureAtResponse
ist und die Fehlerquelle den Werttarget
hat, weist dies darauf hin, dass das Format der vom Back-End/Zielserver gesendeten Antwortnutzlast nicht mit der unterstützten Codierung übereinstimmt, die im AntwortheaderContent-Encoding
angegeben ist. Sie können die Diskrepanz als Teil der HTTP-Antwort mit einer der folgenden Methoden ermitteln:
Fehlermeldung
So validieren Sie mithilfe der Fehlermeldung:
-
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"
- In der obigen Fehlermeldung wird
"Decompression failure at response"
angezeigt, was darauf hindeutet, dass die Antwort mit der im HeaderContent-Encoding
angegebenen Codierung nicht dekomprimiert werden konnte.
Trace
So validieren Sie mit dem Trace:
- Bestimmen Sie Content-Type und error.cause mithilfe von Trace, wie unter Allgemeine Diagnoseschritte erläutert.
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 Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Inhaltscodierung:
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:
- 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.
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie die Anfrage auch von einem der Message Processors an den Back-End-Server stellen.
- Prüfen Sie die vom Back-End-Server gesendete Antwort und ermitteln Sie den Wert, der im Antwortheader
Content-Encoding.
übergeben wird. - Bestimmen Sie das Format der Nutzlast, die als Teil der Anfrage gesendet wird.
- Wenn der Wert des Headers
Content-Encoding
in der Liste der unterstützten Codierung enthalten ist, das Format der Antwortnutzlast jedoch nicht mit der imContent-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 HeaderContent-Encoding
, bei dem es sich um eine unterstützte Codierung in Apigee Edge handelt. Dieresponse_payload.zip
wird jedoch als ZIP-Datei gesendet. Daher schlägt diese Antwort mit dem Fehler502 Bad Gateway
und dem Fehlercodemessaging.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.Prüfen Sie das Message Processor-Protokoll:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Suchen Sie, ob während eines bestimmten Zeitraums
502
-Fehler aufgetreten sind (ob das Problem in der Vergangenheit aufgetreten ist) oder ob Antworten mit502
immer noch fehlschlagen. Sie können die folgende Suchzeichenfolge verwenden:grep -ri "ZipException"
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() : Exceptionjava.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 formatDie Zeile
java.util.zip.ZipException: Not in GZIP format
in der obigen Fehlermeldung gibt an, dass die Antwortnutzlast nicht im GZIP-Format gesendet wird, obwohlContent-Encoding
als gzip angegeben ist. Daher gibt Apigee Edge die Ausnahme aus und gibt den Statuscode502
mit dem Fehlercodemessaging.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 checkDie Zeilen
java.util.zip.ZipException: incorrect header check
undCaused 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 imContent-Encoding
-Header von Deflate angegeben ist. Daher gibt Apigee Edge die Ausnahme aus und gibt den Statuscode502
mit dem Fehlercodemessaging.adaptors.http.flow.DecompressionFailureAtResponse
an Clientanwendungen zurück.
-
Auflösung
- 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. - 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.
- Eine der
unterstützten Codierungen als Wert für den
- 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 alsContent-Encoding: gzip
und die Antwortnutzlast im Formatgzip
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 Fehler502
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