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 mit der Meldung Bad Gateway.
Der HTTP-Statuscode 502 bedeutet, dass der Client keine gültige Antwort von den Backend-Servern erhält, die die Anfrage eigentlich ausführen sollten.
Fehlermeldungen
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 502 Bad Gateway
Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:
{
"fault": {
"faultstring": "Unexpected EOF at target",
"detail": {
"errorcode": "messaging.adaptors.http.UnexpectedEOFAtTarget"
}
}
}Mögliche Ursachen
Eine der typischen Ursachen für 502 Bad Gateway Error ist der Fehler Unexpected EOF, der folgende Ursachen haben kann:
| Ursache | Details | Schritte für |
|---|---|---|
| Falsch konfigurierter Zielserver | Der Zielserver ist nicht ordnungsgemäß für die Unterstützung von TLS/SSL-Verbindungen konfiguriert. | Nutzer der Edge Public und Private Cloud |
| EOFException vom Back-End-Server | Der Backend-Server sendet möglicherweise abrupt EOF. | Nur für Edge Private Cloud-Nutzer |
| Falsch konfigurierte Keep-Alive-Zeitüberschreitung | Auf Apigee und auf dem Backend-Server falsch konfigurierte Zeitüberschreitungen beibehalten. | Nutzer der Edge Public und Private Cloud |
Allgemeine Diagnoseschritte
Zur Diagnose des Fehlers können Sie eine der folgenden Methoden verwenden:
API-Monitoring
So diagnostizieren Sie den Fehler mit API Monitoring:
Mit API-Monitoring können Sie die 502-Fehler untersuchen. Folgen Sie dazu der Anleitung unter Probleme untersuchen. Das bedeutet:
- Rufen Sie das Dashboard „Untersuchen“ auf.
- Wählen Sie im Drop-down-Menü den Statuscode aus und achten Sie darauf, dass der richtige Zeitraum ausgewählt ist, in dem die
502-Fehler aufgetreten sind. - Klicken Sie auf das Feld in der Matrix, wenn eine hohe Anzahl von
502-Fehlern angezeigt wird. - Klicken Sie rechts bei den
502-Fehlern, die in etwa so aussehen, auf Logs ansehen: - Fehlerquelle ist
target - Der Fehlercode lautet
messaging.adaptors.http.UnexpectedEOFAtTarget.

Hier sehen wir folgende Informationen:
Dies weist darauf hin, dass der 502-Fehler durch das Ziel aufgrund eines unerwarteten EOF verursacht wird.
Notieren Sie sich außerdem die Request Message ID für den 502-Fehler, um ihn weiter zu untersuchen.
Trace-Tool
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die
Trace-Sitzung und führen Sie den API-Aufruf aus, um das Problem
502 Bad Gatewayzu reproduzieren. - 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.
-
Der Fehler sollte nach dem Senden der Anfrage an den Zielserver angezeigt werden, wie unten dargestellt:


-
Ermitteln Sie den Wert von X-Apigee.fault-source und X-Apigee.fault-code in der AX-Phase (Analytics Data Recorded) im Trace.
Wenn die Werte von X-Apigee.fault-source und X-Apigee.fault-code mit den Werten in der folgenden Tabelle übereinstimmen, können Sie bestätigen, dass der Fehler
502vom Zielserver stammt:Antwortheader Wert X-Apigee.fault-source targetX-Apigee.fault-code messaging.adaptors.http.flow.UnexpectedEOFAtTargetNotieren Sie sich außerdem die
X-Apigee.Message-IDfür den Fehler502, um ihn weiter zu untersuchen.
NGINX-Zugriffslogs
So diagnostizieren Sie den Fehler mit NGINX:
Sie können auch die NGINX-Zugriffsprotokolle aufrufen, um die Ursache des Statuscodes 502 zu ermitteln. Dies ist besonders hilfreich, wenn das Problem in der Vergangenheit aufgetreten ist oder wenn es sich um ein nur gelegentlich auftretendes Problem handelt und Sie den Trace nicht in der Benutzeroberfläche erfassen können. So ermitteln Sie diese Informationen aus den NGINX-Zugriffsprotokollen:
- Prüfen Sie die NGINX-Zugriffslogs.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Suchen Sie nach
502-Fehlern für den jeweiligen API-Proxy in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, bei denen weiterhin502-Fehler auftreten. - Wenn
502-Fehler auftreten, prüfen Sie, ob der Fehler durch das Senden einesUnexpected EOFdurch das Ziel verursacht wird. Wenn die Werte von X-Apigee.fault-source und X-Apigee.fault-code mit den Werten in der Tabelle unten übereinstimmen, wird der502-Fehler durch das unerwartete Schließen der Verbindung durch das Ziel verursacht:Antwortheader Wert X-Apigee.fault-source targetX-Apigee.fault-code messaging.adaptors.http.flow.UnexpectedEOFAtTargetHier ist ein Beispiel für einen Eintrag, der den Fehler
502zeigt, der durch den Zielserver verursacht wurde:
Notieren Sie sich außerdem die Nachrichten-IDs für die 502-Fehler, um sie weiter zu untersuchen.
Ursache: Falsch konfigurierter Zielserver
Der Zielserver ist nicht ordnungsgemäß für die Unterstützung von TLS/SSL-Verbindungen konfiguriert.
Diagnose
- Verwenden Sie API-Monitoring, das Trace-Tool oder NGINX-Zugriffsprotokolle, um die Nachrichten-ID, den Fehlercode und die Fehlerquelle für den
502-Fehler zu ermitteln. - Aktivieren Sie den Trace in der Benutzeroberfläche für die betroffene API.
- Wenn der Trace für die fehlgeschlagene API-Anfrage Folgendes zeigt:
- Der Fehler
502 Bad Gatewaywird angezeigt, sobald die Anfrage für den Zielfluss gestartet wurde. - Auf dem
error.classwirdmessaging.adaptors.http.UnexpectedEOF.angezeigt.Dann ist es sehr wahrscheinlich, dass dieses Problem durch eine falsche Konfiguration des Zielservers verursacht wird.
- Der Fehler
- Rufen Sie die Zielserverdefinition mit dem Edge Management API-Aufruf ab:
- Wenn Sie ein Public Cloud-Nutzer sind, verwenden Sie diese API:
curl -v https://api.enterprise.apigee.com/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
- Wenn Sie ein Private Cloud-Nutzer sind, verwenden Sie diese API:
curl -v http://<management-server-host>:<port #>/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
Beispiel für eine fehlerhafte
TargetServer-Definition:<TargetServer name="target1"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer >
- Wenn Sie ein Public Cloud-Nutzer sind, verwenden Sie diese API:
-
Die abgebildete
TargetServer-Definition ist ein Beispiel für eine der typischen Fehlkonfigurationen, die so erklärt werden:Angenommen, der Zielserver
mocktarget.apigee.netist so konfiguriert, dass er sichere (HTTPS) Verbindungen über Port443akzeptiert. Wenn Sie sich jedoch die Definition des Zielservers ansehen, gibt es keine anderen Attribute/Flags, die darauf hinweisen, dass er für sichere Verbindungen vorgesehen ist. Dadurch behandelt Edge die API-Anfragen, die an den jeweiligen Zielserver gesendet werden, als HTTP-Anfragen (nicht sicher). Edge initiiert daher keinen SSL-Handshake mit diesem Zielserver.Da der Zielserver so konfiguriert ist, dass er nur HTTPS-Anfragen (SSL) auf
443akzeptiert, wird die Anfrage von Edge abgelehnt oder die Verbindung geschlossen. Daher erhalten Sie im Message Processor den FehlerUnexpectedEOFAtTarget. Der Message Processor sendet502 Bad Gatewayals Antwort an den Client.
Auflösung
Achten Sie immer darauf, dass der Zielserver gemäß Ihren Anforderungen konfiguriert ist.
Wenn Sie im obigen Beispiel Anfragen an einen sicheren (HTTPS/SSL) Zielserver senden möchten, müssen Sie die SSLInfo-Attribute mit dem Flag enabled auf true festlegen. Es ist zwar zulässig, die Attribute SSLInfo für einen Zielserver in der Zielendpunktdefinition selbst hinzuzufügen, es wird jedoch empfohlen, die Attribute SSLInfo als Teil der Zielserverdefinition hinzuzufügen, um Verwirrung zu vermeiden.
- Wenn für den Backend-Dienst unidirektionale SSL-Kommunikation erforderlich ist, gilt Folgendes:
- Sie müssen TLS/SSL in der
TargetServer-Definition aktivieren, indem Sie dieSSLInfo-Attribute einfügen, bei denen das Flagenabledauf „true“ gesetzt ist, wie unten dargestellt:<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer> - Wenn Sie das Zertifikat des Zielservers in Edge validieren möchten, müssen wir auch den Truststore (mit dem Zertifikat des Zielservers) einfügen, wie unten gezeigt:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Ciphers/> <ClientAuthEnabled>false</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <Protocols/> <TrustStore>mocktarget-truststore</TrustStore> </SSLInfo> </TargetServer>
- Sie müssen TLS/SSL in der
- Wenn für den Backend-Dienst bidirektionale SSL-Kommunikation erforderlich ist, gilt Folgendes:
- Sie benötigen
SSLInfo-Attribute mit den FlagsClientAuthEnabled,Keystore,KeyAliasundTruststore, die wie unten dargestellt richtig festgelegt sind:<TargetServer name="mocktarget"> <IsEnabled>true</IsEnabled> <Host>www.example.com</Host> <Port>443</Port> <SSLInfo> <Ciphers/> <ClientAuthEnabled>true</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <KeyAlias>keystore-alias</KeyAlias> <KeyStore>keystore-name</KeyStore> <Protocols/> <TrustStore>truststore-name</TrustStore> </SSLInfo> </TargetServer >
- Sie benötigen
Verweise
Load-Balancing über Back-End-Server
Ursache: EOFException vom Backend-Server
Der Backend-Server sendet möglicherweise abrupt EOF (End of File).
Diagnose
- Verwenden Sie API-Monitoring, das Trace-Tool oder NGINX-Zugriffsprotokolle, um die Nachrichten-ID, den Fehlercode und die Fehlerquelle für den
502-Fehler zu ermitteln. - Sehen Sie sich die Message Processor-Logs (
/opt/apigee/var/log/edge-message-processor/logs/system.log) an und suchen Sie nacheof unexpectedfür die jeweilige API oder nach der eindeutigenmessageidfür die API-Anfrage.Beispiel für einen Ausnahme-Stacktrace aus dem Message Processor-Log
"message": "org:myorg env:test api:api-v1 rev:10 messageid:rrt-1-14707-63403485-19 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : SSLClientChannel[C:193.35.250.192:8443 Remote host:0.0.0.0:50100]@459069 useCount=6 bytesRead=0 bytesWritten=755 age=40107ms lastIO=12832ms .onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) ~[nio-1.0.0.jar:na] at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:79) ~[http-1.0.0.jar:na] at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) [nio-1.0.0.jar:na] at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:123) [nio-1.0.0.jar:na]"
Im obigen Beispiel sehen Sie, dass der Fehler
java.io.EOFException: eof unexpectedaufgetreten ist, als der Message Processor versucht hat, eine Antwort vom Backend-Server zu lesen. Diese Ausnahme weist auf das Dateiende (End of File, EOF) oder das unerwartete Ende des Streams hin.Das bedeutet, dass der Message Processor die API-Anfrage an den Back-End-Server gesendet und auf die Antwort gewartet oder sie gelesen hat. Der Backend-Server hat die Verbindung jedoch abrupt beendet, bevor der Message Processor die Antwort erhalten oder die vollständige Antwort lesen konnte.
- Prüfen Sie die Protokolle Ihres Backend-Servers auf Fehler oder Informationen, die dazu geführt haben könnten, dass der Backend-Server die Verbindung abrupt beendet hat. Wenn Sie Fehler oder Informationen finden, gehen Sie zum Abschnitt Lösung und beheben Sie das Problem auf Ihrem Backend-Server.
- Wenn Sie auf Ihrem Backend-Server keine Fehler oder Informationen finden, erfassen Sie die
tcpdump-Ausgabe auf den Message Processors:- Wenn Ihr Backend-Serverhost eine einzelne IP-Adresse hat, verwenden Sie den folgenden Befehl:
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
- Wenn der Host Ihres Back-End-Servers mehrere IP-Adressen hat, verwenden Sie den folgenden Befehl:
tcpdump -i any -s 0 host HOSTNAME -w FILE_NAME
Normalerweise wird dieser Fehler dadurch verursacht, dass der Backend-Server mit
[FIN,ACK]antwortet, sobald der Message Processor die Anfrage an den Backend-Server sendet.
- Wenn Ihr Backend-Serverhost eine einzelne IP-Adresse hat, verwenden Sie den folgenden Befehl:
-
Dazu ein Beispiel für
tcpdump:Stichprobe
tcpdumpwurde bei502 Bad Gateway Error(UnexpectedEOFAtTarget) entnommen.
- In der TCPDump-Ausgabe sehen Sie die folgende Ereignissequenz:
- Im Paket
985sendet der Message Processor die API-Anfrage an den Backend-Server. - Im Paket
986antwortet der Back-End-Server sofort mit[FIN,ACK]. - Im Paket
987antwortet der Message Processor mit[FIN,ACK]auf den Backend-Server. - Die Verbindungen werden schließlich mit
[ACK]und[RST]von beiden Seiten geschlossen. - Da der Backend-Server
[FIN,ACK]sendet, erhalten Sie die Ausnahmejava.io.EOFException: eof unexpectedim Message Processor.
- Im Paket
- Dies kann passieren, wenn auf dem Backend-Server ein Netzwerkproblem vorliegt. Wenden Sie sich an Ihr Netzwerkbetriebsteam, um das Problem genauer zu untersuchen.
Auflösung
Beheben Sie das Problem auf dem Backend-Server.
Wenn das Problem weiterhin besteht und Sie Unterstützung bei der Fehlerbehebung für 502 Bad Gateway Error benötigen oder vermuten, dass es sich um ein Problem in Edge handelt, wenden Sie sich an den Apigee Edge-Support.
Ursache: Falsch konfiguriertes Keep-Alive-Zeitlimit
Bevor Sie prüfen, ob dies die Ursache für die 502-Fehler ist, lesen Sie bitte die folgenden Konzepte.
Persistente Verbindungen in Apigee
Apigee verwendet standardmäßig (und gemäß dem HTTP/1.1-Standard) persistente Verbindungen für die Kommunikation mit dem Ziel-Backend-Server. Nichtflüchtige Verbindungen können die Leistung steigern, da eine bereits hergestellte TCP- und (falls zutreffend) TLS/SSL-Verbindung wiederverwendet werden kann. Dadurch wird der Latenzaufwand verringert. Die Dauer, für die eine Verbindung aufrechterhalten werden muss, wird über die Property keep alive timeout (keepalive.timeout.millis) gesteuert.
Sowohl der Backend-Server als auch der Apigee Message Processor verwenden Keep-Alive-Timeouts, um Verbindungen zueinander offen zu halten. Wenn innerhalb des Keep-Alive-Timeouts keine Daten empfangen werden, kann der Backend-Server oder Message Processor die Verbindung zum anderen schließen.
Für API-Proxys, die auf einem Message Processor in Apigee bereitgestellt werden, ist standardmäßig ein Keep-Alive-Zeitlimit von 60s festgelegt, sofern es nicht überschrieben wird. Wenn 60s lang keine Daten empfangen werden, schließt Apigee die Verbindung zum Backend-Server. Der Backend-Server behält auch ein Keep-Alive-Zeitlimit bei. Wenn dieses abläuft, schließt der Backend-Server die Verbindung zum Message Processor.
Auswirkungen einer falschen Konfiguration des Keep-Alive-Timeouts
Wenn entweder Apigee oder der Backend-Server mit falschen Keep-Alive-Zeitüberschreitungen konfiguriert ist, führt dies zu einer Race-Bedingung, bei der der Backend-Server als Reaktion auf eine Anfrage für eine Ressource einen unerwarteten End Of File
(FIN)-Statuscode sendet.
Wenn das Keep-Alive-Zeitlimit beispielsweise im API-Proxy oder im Message Processor mit einem Wert konfiguriert wird, der größer oder gleich dem Zeitlimit des Upstream-Backend-Servers ist, kann die folgende Race-Bedingung auftreten. Wenn der Message Processor also erst kurz vor dem Schwellenwert für das Keep-Alive-Zeitlimit des Backend-Servers Daten empfängt, wird eine Anfrage über die vorhandene Verbindung an den Backend-Server gesendet. Dies kann zu 502 Bad Gateway führen, da ein unerwarteter EOF-Fehler auftritt, wie unten beschrieben:
- Angenommen, das Keep-Alive-Zeitlimit, das sowohl für den Message Processor als auch für den Backend-Server festgelegt ist, beträgt 60 Sekunden und bis 59 Sekunden nach der Verarbeitung der vorherigen Anfrage durch den jeweiligen Message Processor ist keine neue Anfrage eingegangen.
- Der Message Processor verarbeitet die Anfrage, die in der 59. Sekunde eingegangen ist, über die bestehende Verbindung (da das Keep-Alive-Zeitlimit noch nicht abgelaufen ist) und sendet die Anfrage an den Backend-Server.
- Bevor die Anfrage jedoch beim Backend-Server eingeht, wurde der Keep-Alive-Timeout-Grenzwert auf dem Backend-Server überschritten.
- Die Anfrage des Message Processors für eine Ressource ist unterwegs, aber der Backend-Server versucht, die Verbindung zu schließen, indem er ein
FIN-Paket an den Message Processor sendet. - Während der Message Processor auf den Empfang der Daten wartet, empfängt er stattdessen das unerwartete
FINund die Verbindung wird beendet. - Dies führt zu einem
Unexpected EOFund anschließend wird ein502vom Message Processor an den Client zurückgegeben.
In diesem Fall ist der Fehler 502 aufgetreten, weil sowohl auf dem Message Processor als auch auf dem Backend-Server derselbe Keep-Alive-Zeitüberschreitungswert von 60 Sekunden konfiguriert war. Dieses Problem kann auch auftreten, wenn für das Keep-Alive-Zeitlimit im Message Processor ein höherer Wert konfiguriert ist als auf dem Backend-Server.
Diagnose
- Wenn Sie ein Public Cloud-Nutzer sind:
- Verwenden Sie API Monitoring oder das Trace-Tool (wie unter Häufige Diagnoseschritte beschrieben) und prüfen Sie, ob Sie beide der folgenden Einstellungen haben:
- Fehlercode:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget - Fehlerquelle:
target
- Fehlercode:
- Weitere Informationen finden Sie unter „tcpdump“ verwenden.
- Verwenden Sie API Monitoring oder das Trace-Tool (wie unter Häufige Diagnoseschritte beschrieben) und prüfen Sie, ob Sie beide der folgenden Einstellungen haben:
- Wenn Sie Private Cloud-Nutzer sind:
- Verwenden Sie das Trace-Tool oder NGINX-Zugriffsprotokolle, um die Nachrichten-ID, den Fehlercode und die Fehlerquelle für den
502-Fehler zu ermitteln. - Suchen Sie im Message Processor-Log
(/opt/apigee/var/log/edge-message-processor/logs/system.log) nach der Nachrichten-ID. - Sie sehen dann
java.io.EOFEXception: eof unexpectedwie unten dargestellt:2020-11-22 14:42:39,917 org:myorg env:prod api:myproxy rev:1 messageid:myorg-opdk-dc1-node2-17812-56001-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:51.254.225.9:80 Local:10.154.0.61:35326]@12972 useCount=7 bytesRead=0 bytesWritten=159 age=7872ms lastIO=479ms isOpen=true.onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:80) at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:220)
- Der Fehler
java.io.EOFException: eof unexpectedweist darauf hin, dass der Message Processor einEOFempfangen hat, während er noch auf eine Antwort vom Backend-Server gewartet hat. - Das Attribut
useCount=7in der obigen Fehlermeldung gibt an, dass der Message Processor diese Verbindung etwa sieben Mal wiederverwendet hat. Das AttributbytesWritten=159gibt an, dass der Message Processor die Anfragenutzlast von159Bytes an den Backend-Server gesendet hat. Es wurden jedoch null Byte zurückgegeben, als der unerwartete FehlerEOFauftrat. -
Das zeigt, dass der Message Processor dieselbe Verbindung mehrmals wiederverwendet hat. Bei dieser Gelegenheit wurden Daten gesendet, aber kurz danach wurde ein
EOFempfangen, bevor Daten empfangen wurden. Das bedeutet, dass das Keep-Alive-Zeitlimit des Backend-Servers mit hoher Wahrscheinlichkeit kürzer oder gleich dem im API-Proxy festgelegten Zeitlimit ist.Mit
tcpdumpkönnen Sie das Problem weiter untersuchen.
- Verwenden Sie das Trace-Tool oder NGINX-Zugriffsprotokolle, um die Nachrichten-ID, den Fehlercode und die Fehlerquelle für den
„tcpdump“ verwenden
- Erfassen Sie mit dem folgenden Befehl einen
tcpdumpauf dem Backend-Server:tcpdump -i any -s 0 host MP_IP_Address -w File_Name
- Analysieren Sie die erfassten
tcpdump:Hier ist ein Beispiel für eine tcpdump-Ausgabe:

Im obigen Beispiel
tcpdumpsehen Sie Folgendes:- Im Paket
5992,hat der Backend-Server eineGET-Anfrage erhalten. - Im Paket
6064antwortet es mit200 OK. - Im Paket
6084hat der Backend-Server eine weitereGET-Anfrage erhalten. - Im Paket
6154antwortet es mit200 OK. - Im Paket
6228hat der Backend-Server eine dritteGET-Anfrage erhalten. - Diesmal gibt der Backend-Server ein
FIN, ACKan den Message Processor zurück (Paket6285), wodurch die Verbindung geschlossen wird.
Dieselbe Verbindung wurde in diesem Beispiel zweimal erfolgreich wiederverwendet. Bei der dritten Anfrage leitet der Backend-Server jedoch das Schließen der Verbindung ein, während der Message Processor auf die Daten vom Backend-Server wartet. Das deutet darauf hin, dass das Keep-Alive-Zeitlimit des Backend-Servers höchstwahrscheinlich kürzer oder gleich dem im API-Proxy festgelegten Wert ist. Eine Anleitung dazu finden Sie unter Keep-Alive-Zeitüberschreitung auf Apigee und dem Backend-Server vergleichen.
- Im Paket
Keep-Alive-Zeitüberschreitung auf Apigee- und Backend-Server vergleichen
- Standardmäßig verwendet Apigee einen Wert von 60 Sekunden für das Keep-Alive-Zeitlimit.
-
Es ist jedoch möglich, dass Sie den Standardwert im API-Proxy überschrieben haben. Sie können dies überprüfen, indem Sie die spezifische
TargetEndpoint-Definition im fehlerhaften API-Proxy prüfen, der502-Fehler ausgibt.Beispiel für eine TargetEndpoint-Konfiguration:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="keepalive.timeout.millis">30000</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>Im obigen Beispiel wird das Keep-Alive-Zeitlimitattribut mit dem Wert 30 Sekunden (
30000Millisekunden) überschrieben. - Prüfen Sie als Nächstes die auf Ihrem Backend-Server konfigurierte Keep-Alive-Zeitüberschreitung. Angenommen, Ihr Backend-Server ist mit dem Wert
25 secondskonfiguriert. - Wenn Sie feststellen, dass der Wert der Keep-Alive-Zeitüberschreitungseigenschaft in Apigee höher ist als der Wert der Keep-Alive-Zeitüberschreitungseigenschaft auf dem Backend-Server (wie im obigen Beispiel), ist dies die Ursache für
502-Fehler.
Auflösung
Achten Sie darauf, dass das Keep-Alive-Zeitlimit-Attribut auf Apigee (im API-Proxy und in der Message Processor-Komponente) immer niedriger ist als auf dem Backend-Server.
- Ermitteln Sie den Wert, der für das Keep-Alive-Zeitlimit auf dem Backend-Server festgelegt ist.
- Konfigurieren Sie einen geeigneten Wert für das Keep-Alive-Zeitlimitattribut im API-Proxy oder Message Processor, sodass das Keep-Alive-Zeitlimitattribut niedriger ist als der auf dem Backend-Server festgelegte Wert. Folgen Sie dazu der Anleitung unter Keep-Alive-Zeitlimit für Message Processors konfigurieren.
Wenn das Problem weiterhin besteht, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.
Best Practice
Es wird dringend empfohlen, dass die Downstream-Komponenten immer einen niedrigeren Keep-Alive-Zeitüberschreitungsschwellenwert haben als auf den Upstream-Servern konfiguriert, um diese Art von Race-Bedingungen und 502-Fehlern zu vermeiden. Jeder Downstream-Hop sollte niedriger sein als jeder Upstream-Hop. In Apigee Edge sollten Sie die folgenden Richtlinien beachten:
- Das Keep-Alive-Zeitlimit des Clients sollte kürzer sein als das Keep-Alive-Zeitlimit des Edge-Routers.
- Die Edge-Router-Keep-Alive-Zeitüberschreitung sollte kürzer sein als die Keep-Alive-Zeitüberschreitung des Nachrichtenprozessors.
- Die Keep-Alive-Zeitüberschreitung des Message Processors sollte kürzer sein als die Keep-Alive-Zeitüberschreitung des Zielservers.
- Wenn Sie andere Hops vor oder nach Apigee haben, sollte dieselbe Regel angewendet werden. Es sollte immer in der Verantwortung des Downstream-Clients liegen, die Verbindung zum Upstream zu schließen.
Erfassen von Diagnoseinformationen erforderlich
Wenn das Problem auch nach Befolgen der obigen Anweisungen weiterhin besteht, 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 des502-Fehlers - Trace-Datei mit den Anfragen mit dem Fehler
502 Bad Gateway - Unexpected EOF - Wenn die
502-Fehler derzeit nicht auftreten, geben Sie den Zeitraum mit den Zeitzoneninformationen an, in dem502-Fehler in der Vergangenheit aufgetreten sind.
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
- Name der Organisation, Umgebung und des API-Proxys, für die Sie
502-Fehler beobachten - API-Proxy-Bundle
- Trace-Datei mit den Anfragen mit dem Fehler
502 Bad Gateway - Unexpected EOF - NGINX-Zugriffslogs
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Message Processor-Logs
/opt/apigee/var/log/edge-message-processor/logs/system.log - Der Zeitraum mit den Zeitzoneninformationen, in dem die
502-Fehler aufgetreten sind Tcpdumps, die auf den Message Processors oder dem Backend-Server oder beiden erfasst wurden, als der Fehler aufgetreten ist