Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen info
Symptom
Die Clientanwendung erhält den HTTP-Statuscode 502 Bad Gateway mit dem Fehlercode protocol.http.TooBigBody als Antwort auf API-Aufrufe.
Fehlermeldung
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 502 Bad Gateway
Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:
{
"fault":{
"faultstring":"Body buffer overflow",
"detail":{
"errorcode":"protocol.http.TooBigBody"
}
}
}Mögliche Ursachen
Dieser Fehler tritt auf, wenn die Nutzlastgröße, die vom Ziel-/Backend-Server als Teil der HTTP-Antwort an Apigee Edge gesendet wird, das zulässige Limit in Apigee Edge überschreitet.
Mögliche Ursachen für den Fehler:
| Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
|---|---|---|
| Größe der Antwortnutzlast überschreitet das zulässige Limit | Die Nutzlastgröße, die vom Ziel-/Backend-Server als Teil der HTTP-Antwort an Apigee gesendet wird, überschreitet das zulässige Limit in Apigee. | Nutzer der Edge Public und Private Cloud |
| Größe der Antwortnutzlast überschreitet nach der Dekomprimierung das zulässige Limit | Die Nutzlastgröße, die vom Ziel-/Backend-Server als Teil der HTTP-Antwort an Apigee im komprimierten Format gesendet wird, überschreitet das zulässige Limit, wenn sie von Apigee dekomprimiert wird. | 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.
- Sie können den Filter Proxy auswählen, um den Fehlercode einzugrenzen.
- Stellen Sie den Fehlercode im Vergleich zur Zeit dar.
Wählen Sie eine Zelle mit dem Fehlercode
protocol.http.TooBigBodyaus, wie unten dargestellt:
Sie sehen die Informationen zum Fehlercode
protocol.http.TooBigBodywie unten dargestellt:
Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.
- Notieren Sie sich im Fenster „Logs“ die folgenden Details:
- Statuscode:
502 - Fehlerquelle:
target - Fehlercode:
protocol.http.TooBigBody.
- Statuscode:
- Wenn Fault Source den Wert
targetund Fault Code den Wertprotocol.http.TooBigBodyhat, bedeutet das, dass die Größe der Antwortnutzlast der HTTP-Antwort vom Ziel-/Backend-Server das zulässige Limit in Apigee Edge überschreitet.
Trace
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 den Fehler
502 Bad Gateway.
- Warten Sie, bis der Fehler
- Wählen Sie eine der fehlgeschlagenen Anfragen 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.
Rufen Sie die Phase Error direkt nach der Phase Response received from target server auf, wie unten dargestellt:
Notieren Sie sich die Werte des Fehlers aus dem Trace:
- Fehler:
Body buffer overflow - error.class:
com.apigee.errors.http.server.BadGateway
Dies weist darauf hin, dass Apigee Edge (Message Processor-Komponente) den Fehler ausgibt, sobald die Antwort vom Backend-Server empfangen wird, da die Nutzlastgröße das zulässige Limit überschreitet.
- Fehler:
Der Fehler wird in der Phase Response Sent to Client (Antwort an Client gesendet) angezeigt, wie unten zu sehen:
- Notieren Sie sich die Werte des Fehlers aus dem Trace. Der oben gezeigte Beispiel-Trace zeigt Folgendes:
- Fehler:
502 Bad Gateway - Fehlerinhalt:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- Fehler:
Rufen Sie die Phase Antwort vom Zielserver empfangen auf, wie unten für verschiedene Szenarien dargestellt:
Unkomprimiert
Szenario 1: Antwortnutzlast wird unkomprimiert gesendet
Notieren Sie sich die Werte des Fehlers aus dem Trace:
- Antwort vom Zielserver erhalten:
200 OK - Content-Length (aus dem Abschnitt Response Headers): ~11 MB
Komprimiert
Szenario 2: Anfragenutzlast wird in komprimierter Form gesendet
Notieren Sie sich die Werte des Fehlers aus dem Trace:
- Antwort vom Zielserver erhalten:
200 OK - Content-Encoding: Wenn Sie diesen Header im Bereich Response Headers (Antwortheader) sehen, notieren Sie sich den Wert. In diesem Beispiel ist der Wert
gzip.
- Antwort vom Zielserver erhalten:
Beachten Sie den Body im Abschnitt Response Content:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}Rufen Sie im Trace die Phase AX (Analytics Data Recorded) auf und klicken Sie darauf, um die zugehörigen Details zu sehen.
- Scrollen Sie in Phasendetails nach unten zum Abschnitt Gelesene Variablen und ermitteln Sie die Werte von
target.received.content.length, die Folgendes angeben:- Die tatsächliche Größe der Antwortnutzlast, wenn sie im unkomprimierten Format gesendet wird, und
- Die Größe der Antwortnutzlast nach der Dekomprimierung durch Apigee, wenn die Nutzlast im komprimierten Format gesendet wird. Er ist in diesem Szenario immer derselbe wie der Wert des zulässigen Limits (10 MB).
Unkomprimiert
Szenario 1: Antwortnutzlast wird unkomprimiert gesendet
Notieren Sie sich den Wert von target.received.content.length:
Anfrageheader Wert target.received.content.length ~11 MB Komprimiert
Szenario 2: Anfragenutzlast wird in komprimierter Form gesendet
Notieren Sie sich den Wert von target.received.content.length:
Anfrageheader Wert target.received.content.length ~10 MB In der folgenden Tabelle wird erläutert, warum der
502-Fehler von Apigee in den beiden Szenarien basierend auf dem Wert von target.received.content.length zurückgegeben wird:Szenario Wert von „target.received.content.length“ Grund für den Fehler Antwortnutzlast im unkomprimierten Format ~11 MB Die Größe überschreitet das zulässige Limit von 10 MB. Antwortnutzlast im komprimierten Format ~10 MB Größenbeschränkung nach der Dekomprimierung überschritten
NGINX
So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:
- Wenn Sie Private Cloud-Nutzer sind, können Sie die 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_log
Dabei 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 Anfragen, die immer noch mit502fehlschlagen. - Wenn Sie
502-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert vonprotocol.http.TooBigBodyü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 protocol.http.TooBigBodyX-Apigee-fault-source target
Ursache: Die Größe der Antwortnutzlast überschreitet das zulässige Limit.
Diagnose
- Ermitteln Sie den Fehlercode, die Fehlerquelle und die Größe der Antwortnutzlast für den beobachteten Fehler mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte in Szenario 1 beschrieben.
- Wenn die Fehlerquelle den Wert
targethat, bedeutet das, dass die Größe der Antwortnutzlast, die vom Ziel-/Backend-Server an Apigee gesendet wird, das zulässige Limit in Apigee Edge überschreitet. - Prüfen Sie die Größe der Antwortnutzlast, die in Schritt 1 ermittelt wurde.
- Wenn die Nutzlastgröße das zulässige Limit von 10 MB überschreitet, ist dies die Ursache des Fehlers.
- Wenn die Nutzlastgröße das zulässige Limit von etwa 10 MB erreicht, wird die Antwortnutzlast möglicherweise im komprimierten Format übergeben. Gehen Sie zu Ursache: Größe der Antwortnutzlast überschreitet nach der Dekomprimierung das zulässige Limit.
- Prüfen Sie, ob die Größe der Antwortnutzlast tatsächlich das zulässige Limit von 10 MB überschreitet. Gehen Sie dazu so vor:
- Wenn Sie keinen Zugriff auf die tatsächliche Anfrage an den Ziel-/Backend-Server haben, fahren Sie mit Lösung fort.
- Wenn Sie Zugriff auf die tatsächliche Anfrage an den Ziel-/Backend-Server haben, 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 Private Cloud verwenden, können Sie die Anfrage auch von einem der Message Processors an den Backend-Server senden.
- Prüfen Sie die Größe der in der Antwort übergebenen Nutzlast anhand des Content-Length-Headers.
- Wenn die Größe der Nutzlast das zulässige Limit in Apigee Edge überschreitet, ist dies die Ursache des Problems.
Beispielantwort vom Backend-Server:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
Im obigen Beispiel sehen Sie, dass
Content-Length: 11534336 (which is ~11 MB)die Ursache für diesen Fehler ist, da es das zulässige Limit in Apigee Edge überschreitet.
Auflösung
Weitere Informationen finden Sie unter Lösung.
Ursache: Die Größe der Antwortnutzlast überschreitet nach der Dekomprimierung das zulässige Limit.
Wenn die Antwortnutzlast im komprimierten Format gesendet wird und der Antwortheader Content-Encoding auf gzip, gesetzt ist, dekomprimiert Apigee die Antwortnutzlast. Wenn Apigee während der Dekomprimierung feststellt, dass die Größe der Nutzlast das zulässige Limit in Apigee Edge überschreitet, wird die Dekomprimierung beendet und sofort mit 502 Bad Gateway und dem Fehlercode protocol.http.TooBigBody geantwortet.
Diagnose
- Ermitteln Sie den Fehlercode, die Fehlerquelle und die Größe der Antwortnutzlast für den beobachteten Fehler mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffsprotokollen, wie in Häufige Diagnoseschritte in Szenario 2 beschrieben.
- Wenn die Fehlerquelle den Wert
targethat, bedeutet dies, dass die Größe der Antwortnutzlast, die von der Ziel-/Backend-Anwendung an Apigee gesendet wird, das zulässige Limit in Apigee Edge überschreitet. - Prüfen Sie die Größe der Antwortnutzlast, die in Schritt 1 ermittelt wurde.
- Wenn die Nutzlastgröße das zulässige Limit von 10 MB überschreitet, ist dies die Ursache des Fehlers.
- Wenn die Nutzlastgröße das zulässige Limit von etwa 10 MB erreicht, wird die Antwortnutzlast möglicherweise im komprimierten Format übergeben. Prüfen Sie in diesem Fall die unkomprimierte Größe der komprimierten Antwortnutzlast.
- Sie können mit einer der folgenden Methoden prüfen, ob die Antwort vom Ziel/Backend im komprimierten Format gesendet wurde und die unkomprimierte Größe das zulässige Limit überschritten hat:
Trace
Trace-Tool verwenden:
- Wenn Sie einen Trace für die fehlgeschlagene Anfrage erfasst haben, folgen Sie der Anleitung unter Trace und
- Wert von target.received.content.length ermitteln
- Prüfen Sie, ob die Anfrage vom Client den Header Content-Encoding:
gzipenthält.
- Wenn der Wert von target.received.content.length in der Nähe des zulässigen Limits von 10 MB liegt und der Antwortheader Content-Encoding:
gziplautet, ist dies die Ursache für diesen Fehler.
Tatsächliche Anfrage
Tatsächliche Anfrage verwenden:
- Wenn Sie keinen Zugriff auf die tatsächliche Anfrage haben, die an den Ziel-/Backend-Server gesendet wurde, fahren Sie mit Lösung fort.
- Wenn Sie Zugriff auf die tatsächliche Anfrage haben, die an den Ziel-/Backend-Server gesendet wurde, führen Sie die folgenden Schritte aus:
- Prüfen Sie die Größe der in der Antwort übergebenen Nutzlast sowie den in der Antwort gesendeten
Content-Encoding-Header. - Wenn Sie feststellen, dass der Antwortheader
Content-Encodingaufgzipgesetzt ist und die unkomprimierte Größe der Nutzlast das zulässige Limit in Apigee Edge überschreitet, ist dies die Ursache für diesen Fehler.Beispiel für eine Antwort vom Backend-Server:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
Im obigen Fall wird der Header
Content-Encoding: gzipgesendet und die Größe der Dateitestzippedfile.gzin der Antwort liegt unter dem Limit. Die Größe der unkomprimierten Dateitestzippedfilebetrug jedoch etwa 15 MB.
- Prüfen Sie die Größe der in der Antwort übergebenen Nutzlast sowie den in der Antwort gesendeten
Logs des Message Processors
Nachrichtenprozessor-Logs verwenden:
- Wenn Sie Private Cloud-Nutzer sind, können Sie die Message Processor-Logs verwenden, um die wichtigsten Informationen zu HTTP-
502-Fehlern zu ermitteln. Logs des Message Processors prüfen
/opt/apigee/var/log/edge-message-processor/logs/system.logSuchen Sie nach
502-Fehlern in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder danach, ob bei Anfragen immer noch502-Fehler auftreten. Sie können die folgenden Suchstrings verwenden:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Sie finden Zeilen aus
system.log, die so aussehen wie unten (TotalReadundchunkCountkönnen in Ihrem Fall variieren):2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
Während der Dekomprimierung wird der Vorgang beendet und die folgende Zeile ausgegeben, sobald der Message Processor feststellt, dass die Anzahl der gelesenen Bytes insgesamt größer als 10 MB ist:
Message is too large. TotalRead 10489856 chunkCount 2571Das bedeutet, dass die Größe der Antwortnutzlast mehr als 10 MB beträgt und Apigee den Fehler ausgibt, wenn die Größe das Limit von 10 MB mit dem Fehlercode
protocol.http.TooBigBodyüberschreitet.
- Wenn Sie einen Trace für die fehlgeschlagene Anfrage erfasst haben, folgen Sie der Anleitung unter Trace und
Auflösung
Größe festlegen
Option 1 [Empfohlen]: Korrigieren Sie die Zielserveranwendung, damit keine Nutzlastgröße gesendet wird, die das Apigee-Limit überschreitet.
- Analysieren Sie den Grund dafür, dass der jeweilige Zielserver eine Antwort-/Nutzlastgröße sendet, die das in Limits definierte zulässige Limit überschreitet.
- Wenn das nicht gewünscht ist, ändern Sie die Anwendung auf dem Zielserver so, dass die Antwort-/Nutzlastgröße unter dem zulässigen Limit liegt.
- Wenn dies gewünscht ist und Sie eine Antwort/Nutzlast senden möchten, die das zulässige Limit überschreitet, fahren Sie mit den nächsten Optionen fort.
Muster für signierte URLs
Option 2 [Empfohlen]: Muster für signierte URLs innerhalb eines Apigee JavaCallouts verwenden
Für Nutzlasten, die größer als 10 MB sind, empfiehlt Apigee, ein Muster für signierte URLs innerhalb eines Apigee JavaCallouts zu verwenden, wie im Beispiel Edge-Callout: Signierte URL-Generator auf GitHub dargestellt.
Streaming
Option 3: Streaming verwenden
Wenn Ihr API-Proxy sehr große Anfragen und/oder Antworten verarbeiten muss, können Sie Streaming in Apigee aktivieren.
CwC
Option 4: Pufferlimit mit der CwC-Property erhöhen
Diese Option sollte nur verwendet werden, wenn Sie keine der empfohlenen Optionen nutzen können, da es bei einer Erhöhung der Standardgröße zu Leistungsproblemen kommen kann.
Apigee bietet die CwC-Eigenschaft, mit der das Limit für die Nutzlastgröße von Anfragen und Antworten erhöht werden kann. Weitere Informationen finden Sie unter Grenzwert für die Nachrichtengröße im Router oder Message Processor festlegen.
Limits
Apigee erwartet, dass die Clientanwendung und der Backend-Server keine Nutzlastgrößen senden, die das zulässige Limit überschreiten, wie für
Request/response size in den
Apigee Edge-Limits dokumentiert.
- Wenn Sie ein Public Cloud-Nutzer sind, gilt für die maximale Größe der Anfrage- und Antwortnutzlast das Limit, das für
Request/response sizein den Apigee Edge-Limits dokumentiert ist. - Wenn Sie ein Private Cloud-Nutzer sind, haben Sie möglicherweise das standardmäßige maximale Limit für die Größe der Anfrage- und Antwortnutzlast geändert, obwohl dies nicht empfohlen wird. Wie Sie das Limit für die maximale Größe der Anfragenutzlast ermitteln, erfahren Sie hier.
Aktuelles Limit prüfen
In diesem Abschnitt wird erläutert, wie Sie prüfen, ob die Property HTTPResponse.body.buffer.limit in den Message Processors mit einem neuen Wert aktualisiert wurde.
Suchen Sie auf der Message Processor-Maschine im Verzeichnis
/opt/apigee/edge-message- processor/confnach der PropertyHTTPResponse.body.buffer.limitund prüfen Sie, welcher Wert festgelegt wurde (siehe unten):grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
Das Beispielergebnis des oben genannten Befehls sieht so aus:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
In der obigen Beispielausgabe sehen Sie, dass die Property
HTTPResponse.body.buffer.limitmit dem Wert10minhttp.propertiesfestgelegt wurde.Das bedeutet, dass das in Apigee for Private Cloud konfigurierte Limit für die Größe der Anfrage-Nutzlast 10 MB beträgt.
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 zum Reproduzieren des
502-Fehlers - Trace-Datei für die API-Anfragen
- Vollständige Ausgabe der Antwort vom Ziel-/Backend-Server zusammen mit der Größe der Nutzlast
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
- Name der Organisation
- Name der Umgebung
- API-Proxy-Bundle
- Trace-Datei für die fehlgeschlagenen API-Anfragen
- Vollständiger curl-Befehl zum Reproduzieren des
502-Fehlers - Vollständige Ausgabe der Antwort vom Ziel-/Backend-Server zusammen mit der Größe der Nutzlast
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