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 protocol.http.TooBigBody
.
Fehlermeldung
Die Clientanwendung ruft den folgenden Antwortcode ab:
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-/Back-End-Server an Apigee Edge als Teil der HTTP-Antwort gesendet wird, das zulässige Limit in Apigee Edge überschreitet.
Das kann folgende Ursachen haben:
Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
---|---|---|
Die Nutzlastgröße der Antwort ist größer als das zulässige Limit | Die Nutzlastgröße, die vom Ziel-/Back-End-Server als Teil der HTTP-Antwort an Apigee gesendet wird, überschreitet das in Apigee zulässige Limit. | Nutzer von Edge Public und Private Cloud |
Die Größe der Antwortnutzlast überschreitet nach der Dekomprimierung das zulässige Limit | Die Nutzlastgröße, die vom Ziel-/Back-End-Server als Teil der HTTP-Antwort an Apigee in komprimierter Form gesendet wird, übersteigt bei der Dekomprimierung durch Apigee das zulässige Limit. | 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.
- Sie können den Filter Proxy auswählen, um den Fehlercode einzugrenzen.
- Stellen Sie den Fehlercode der Zeit gegenüber.
Wählen Sie eine Zelle mit dem Fehlercode
protocol.http.TooBigBody
aus, wie unten dargestellt:Sie sehen die Informationen zum Fehlercode
protocol.http.TooBigBody
wie 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 die Fehlerquelle den Wert
target
und der Fehlercode den Wertprotocol.http.TooBigBody
hat, weist dies darauf hin, dass die Nutzlastgröße der Antwort vom Ziel-/Back-End-Server größer als das zulässige Limit in Apigee Edge ist.
Trace
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 den Fehler
502 Bad Gateway
.
- Warten Sie, bis der Fehler
- Wählen Sie eine der fehlgeschlagenen Anfragen aus und prüfen Sie den Trace.
- Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
Gehen Sie, wie unten dargestellt, direkt nach der Phase Antwort vom Zielserver erhalten in die Phase Error (Fehler):
Notieren Sie sich die Fehlerwerte 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 Back-End-Server empfangen wird, da die Nutzlastgröße das zulässige Limit überschreitet.
- Fehler:
Sie sehen den Fehler in der Phase Response Sent to Client (Antwort an Kunden gesendet):
- Notieren Sie sich die Fehlerwerte aus dem Trace. Das obige Beispiel-Trace zeigt:
- Fehler:
502 Bad Gateway
- Fehlerinhalt:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- Fehler:
Gehen Sie für verschiedene Szenarien wie unten dargestellt zur Phase Antwort vom Zielserver erhalten:
Unkomprimiert
Szenario 1: Unkomprimierte Antwortnutzlast
Notieren Sie sich die Fehlerwerte aus dem Trace:
- Antwort vom Zielserver erhalten:
200 OK
- Content-Length (aus dem Abschnitt Response Headers): ~11 MB
Komprimiert
Szenario 2: In komprimierter Form gesendete Anfragenutzlast
Notieren Sie sich die Fehlerwerte aus dem Trace:
- Antwort vom Zielserver erhalten:
200 OK
- Content-Encoding: Wenn dieser Header im Abschnitt Response Headers angezeigt wird, notieren Sie sich den Wert. In diesem Beispiel lautet der Wert beispielsweise
gzip
.
- Antwort vom Zielserver erhalten:
Beachten Sie den Text im Abschnitt Response Content:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
Navigieren Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf, um die zugehörigen Details zu sehen.
- Scrollen Sie unter Phasendetails nach unten zum Abschnitt Variables Read (Variablen lesen) und bestimmen Sie die Werte von
target.received.content.length
. Dies bedeutet:- Die tatsächliche Größe der Antwortnutzlast, wenn diese in unkomprimiertem Format gesendet wird.
- Die Größe der Antwortnutzlast nach der Dekomprimierung durch Apigee, wenn die Nutzlast in komprimiertem Format gesendet wird. Er entspricht in diesem Szenario immer dem zulässigen Limit (10 MB).
Unkomprimiert
Szenario 1: Unkomprimierte Antwortnutzlast
Beachten Sie den Wert von target.received.content.length:
Anfrageheader Wert target.received.content.length ~11 MB Komprimiert
Szenario 2: In komprimierter Form gesendete Anfragenutzlast
Beachten Sie den Wert von target.received.content.length:
Anfrageheader Wert target.received.content.length ~10 MB In der folgenden Tabelle wird erläutert, warum Apigee in den beiden Szenarien basierend auf dem Wert von target.received.content.length den Fehler
502
zurückgibt:Szenario Wert von target.received.content.length Fehlerursache Antwortnutzlast in unkomprimiertem Format ~11 MB Größe > Maximal 10 MB zulässig Antwortnutzlast in komprimiertem Format ~10 MB Größenbeschränkung bei der Dekomprimierung überschritten
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.
- Suchen Sie nach
502
-Fehlern innerhalb eines bestimmten Zeitraums (falls das Problem in der Vergangenheit aufgetreten ist) oder ob es immer noch Anfragen mit502
gibt, die fehlschlagen. - Wenn Sie
502
-Fehler mit dem X-Apigee-fault-code finden, der dem Wert vonprotocol.http.TooBigBody
entspricht, bestimmen 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-Fehler-Code und X-Apigee-Fehler-Quelle:
Antwortheader Wert X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source target
Ursache: Die Nutzlastgröße der Antwort ist größer als das zulässige Limit
Diagnose
- Bestimmen Sie den Fehlercode,die Fehlerquelle und die Größe der Antwortnutzlast für den Fehler, der mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs beobachtet wird, wie unter Allgemeine Diagnoseschritte in Szenario 1 erläutert.
- Wenn die Fehlerquelle den Wert
target
hat, weist dies darauf hin, dass die vom Ziel-/Back-End-Server an Apigee gesendete Antwortnutzlastgröße das zulässige Limit in Apigee Edge überschreitet. - Prüfen Sie die Antwortnutzlastgröße (siehe Schritt 1).
- Wenn die Nutzlastgröße über 10 MB liegt, ist das die Fehlerursache.
- Wenn die Nutzlastgröße maximal 10 MB beträgt, kann die Antwortnutzlast in komprimiertem Format übergeben werden. Gehen Sie zu Ursache: Größe der Antwortnutzlast überschreitet den zulässigen Grenzwert nach der Dekomprimierung.
- Prüfen Sie, ob die Größe der Antwortnutzlast tatsächlich größer als 10 MB ist. Gehen Sie dazu so vor:
- Wenn Sie keinen Zugriff auf die eigentliche Anfrage an den Ziel-/Back-End-Server haben, gehen Sie zu Lösung.
- Wenn Sie Zugriff auf die eigentliche Anfrage an den Ziel-/Back-End-Server 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 Processor an den Back-End-Server stellen.
- Prüfen Sie die Größe der in der Antwort übergebenen Nutzlast, indem Sie den Header Content-Length prüfen.
- Wenn Sie feststellen, dass die Größe der Nutzlast das zulässige Limit in Apigee Edge überschreitet, ist dies die Ursache des Problems.
Beispielantwort vom Back-End-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 er den zulässigen Grenzwert in Apigee Edge überschreitet.
Auflösung
Siehe Lösung.
Ursache: Die Größe der Antwortnutzlast überschreitet nach der Dekomprimierung den zulässigen Grenzwert
Wenn die Antwortnutzlast in einem komprimierten Format gesendet wird und der Antwortheader Content-Encoding
auf gzip,
gesetzt ist, dekomprimiert Apigee die Antwortnutzlast. Wenn Apigee während des Dekomprimierungsvorgangs feststellt, dass die Größe der Nutzlast größer als das zulässige Limit in Apigee Edge. ist, stoppt es die weitere Dekomprimierung und antwortet sofort mit 502 Bad Gateway
und dem Fehlercode protocol.http.TooBigBody
.
Diagnose
- Bestimmen Sie den Fehlercode, die Fehlerquelle und die Größe der Antwortnutzlast für den Fehler, der mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs beobachtet wird, wie unter Allgemeine Diagnoseschritte in Szenario 2 erläutert.
- Wenn die Fehlerquelle den Wert
target
hat, zeigt dies an, dass die von der Ziel-/Back-End-Anwendung an Apigee gesendete Antwortnutzlastgröße das zulässige Limit in Apigee Edge überschreitet. - Prüfen Sie die Antwortnutzlastgröße (siehe Schritt 1).
- Wenn die Nutzlastgröße über 10 MB liegt, ist das die Fehlerursache.
- Wenn die Nutzlastgröße maximal 10 MB beträgt, kann die Antwortnutzlast in komprimiertem Format übergeben werden. Prüfen Sie in diesem Fall die unkomprimierte Größe der komprimierten Antwortnutzlast.
- Mit einer der folgenden Methoden können Sie überprüfen, ob die Antwort vom Ziel/Back-End in komprimiertem Format gesendet wurde und die nicht komprimierte Größe das zulässige Limit überschreitet:
Trace
Trace-Tool verwenden:
- Wenn Sie ein Trace für die fehlgeschlagene Anfrage erfasst haben, lesen Sie die Schritte unter Trace und
- Ermitteln Sie den Wert von target.received.content.length.
- Prüfen Sie, ob die Anfrage vom Client den Header Content-Encoding:
gzip
enthält.
- Wenn der Wert für target.received.content.length etwa die zulässige Grenze von 10 MB und der Antwortheader Content-Encoding:
gzip
liegt, ist das die Ursache für diesen Fehler.
Tatsächliche Anfrage
Tatsächliche Anfrage:
- Wenn Sie keinen Zugriff auf die eigentliche Anfrage an den Ziel-/Back-End-Server haben, gehen Sie zu Lösung.
- Wenn Sie Zugriff auf die eigentliche Anfrage an den Ziel-/Back-End-Server haben, führen Sie die folgenden Schritte aus:
- Prüfen Sie die Größe der Nutzlast, die in der Antwort zusammen mit dem in der Antwort gesendeten Header
Content-Encoding
übergeben wird. - Wenn Sie feststellen, dass der Antwortheader
Content-Encoding
aufgzip
gesetzt ist und die unkomprimierte Größe der Nutzlast das zulässige Limit in Apigee Edge überschreitet, ist das die Ursache für diesen Fehler.Beispielantwort vom Back-End-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: gzip
gesendet und die Größe der Dateitestzippedfile.gz
in der Antwort liegt unter dem Limit. Die Größe der unkomprimierten Dateitestzippedfile
betrug jedoch ca. 15 MB.
- Prüfen Sie die Größe der Nutzlast, die in der Antwort zusammen mit dem in der Antwort gesendeten Header
Message Processor-Protokolle
Nachrichtenprozessor-Protokolle verwenden:
- 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 der Message Processor-Protokolle
/opt/apigee/var/log/edge-message-processor/logs/system.log
Suchen Sie nach
502
-Fehlern innerhalb eines bestimmten Zeitraums (ob das Problem in der Vergangenheit aufgetreten ist) oder ob es immer noch Anfragen mit502
gibt, die fehlschlagen. Sie können die folgenden Suchzeichenfolgen verwenden:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Die Zeilen von
system.log
sehen in etwa so aus (TotalRead
undchunkCount
kö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)
Sobald der Message Processor feststellt, dass die Gesamtzahl der Lesebyte größer als 10 MB ist, wird während des Dekomprimierungsvorgangs die folgende Zeile ausgegeben:
Message is too large. TotalRead 10489856 chunkCount 2571
Dies impliziert, dass die Antwortutzlastgröße größer als 10 MB ist und Apigee den Fehler ausgibt, wenn die Größe beginnt, die Grenze von 10 MB mit dem Fehlercode
protocol.http.TooBigBody
zu überschreiten.
- Wenn Sie ein Trace für die fehlgeschlagene Anfrage erfasst haben, lesen Sie die Schritte unter Trace und
Auflösung
Größe korrigieren
Option 1 [empfohlen]: Problem mit der Zielserveranwendung so beheben, dass die Nutzlastgröße das Apigee-Limit nicht überschreitet
- Analysieren Sie den Grund für das Senden der Antwort / die Nutzlastgröße des jeweiligen Zielservers, die das unter Limits definierte Limit überschreitet.
- Wenn dies nicht gewünscht ist, ändern Sie Ihre Zielserveranwendung 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 der signierten URL
Option 2 [empfohlen]: Muster mit signierten URLs in einem Apigee-JavaCallout verwenden
Für Nutzlasten, die größer als 10 MB sind, empfiehlt Apigee, ein signiertes URL-Muster in einem Apigee JavaCallout zu verwenden, wie im Beispiel Edge Callout: Signed URL Generator auf GitHub veranschaulicht.
Livestreams
Option 3: Streaming verwenden
Wenn Ihr API-Proxy sehr große Anfragen und/oder Antworten verarbeiten muss, können Sie das Streaming in Apigee aktivieren.
CwC
Option 4: CwC-Attribut verwenden, um das Pufferlimit zu erhöhen
Verwenden Sie diese Option nur, wenn Sie keine der empfohlenen Optionen verwenden können, da es zu Leistungsproblemen kommen kann, wenn die Standardgröße erhöht wird.
Apigee bietet das Attribut CwC, mit dem die Nutzlastgröße für Anfragen und Antworten erhöht werden kann. Weitere Informationen finden Sie unter Größenbeschränkung für Nachrichten auf dem Router oder Message Processor festlegen.
Einschränkungen
Apigee erwartet, dass die Clientanwendung und der Back-End-Server keine Nutzlastgrößen senden, die das zulässige Limit überschreiten, wie unter
Apigee Edge-Limits für
Request/response size
dokumentiert.
- Wenn Sie ein Public Cloud-Nutzer sind, ist die Obergrenze für die Nutzlastgröße von Anfragen und Antworten wie unter
Request/response size
unter Apigee Edge-Limits dokumentiert. - Wenn Sie ein Private Cloud-Nutzer sind, haben Sie möglicherweise die standardmäßige Höchstgrenze für die Nutzlastgröße von Anfragen und Antworten geändert (obwohl dies nicht empfohlen wird). Sie können das Limit für die maximale Nutzlast von Anfragen ermitteln. Folgen Sie dazu der Anleitung unter Aktuelles Limit prüfen.
Wie überprüfe ich das aktuelle Limit?
In diesem Abschnitt wird erläutert, wie Sie überprüfen können, ob das Attribut HTTPResponse.body.buffer.limit
mit einem neuen Wert auf den Message Processors aktualisiert wurde.
Suchen Sie auf dem Message Processor-Computer im Verzeichnis
/opt/apigee/edge-message- processor/conf
nach der EigenschaftHTTPResponse.body.buffer.limit
und prüfen Sie, welcher Wert wie unten dargestellt festgelegt wurde:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
Das Ergebnis des obigen Befehls sieht so aus:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
In der obigen Beispielausgabe wurde das Attribut
HTTPResponse.body.buffer.limit
mit dem Wert10m
inhttp.properties
festgelegt.Dies weist darauf hin, dass das Limit für die in Apigee für Private Cloud konfigurierte Größe der Anfragenutzlast 10 MB beträgt.
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
- Schließen Sie den curl-Befehl ab, mit dem der Fehler
502
reproduziert wird - Ablaufverfolgungsdatei für die API-Anfragen
- Vollständige Ausgabe der Antwort vom Ziel-/Back-End-Server zusammen mit der Größe der Nutzlast
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
- Name der Organisation
- Name der Umgebung
- API-Proxy-Bundle
- Ablaufverfolgungsdatei für fehlgeschlagenen API-Anfragen
- Schließen Sie den curl-Befehl ab, mit dem der Fehler
502
reproduziert wird - Vollständige Ausgabe der Antwort vom Ziel-/Back-End-Server zusammen mit der Größe der Nutzlast
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