Sie lesen gerade die Dokumentation zu Apigee Edge.
Zur Dokumentation zu
Apigee X. info
Symptom
Die Clientanwendung erhält den HTTP-Statuscode 502 Bad Gateway mit dem Code ECONNRESET als Antwort auf API-Aufrufe in Edge Microgateway.
Fehlermeldung
Der Client sieht den folgenden Antwortcode:
HTTP/1.1 502 Bad Gateway
Die Antwort enthält die folgende Fehlermeldung:
{"message":"socket hang up","code":"ECONNRESET"}Mögliche Ursachen
| Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
|---|---|---|
| Falsch konfiguriertes Keep-Alive-Zeitlimit | Keep-Alive-Zeitlimits zwischen Edge Microgateway und dem Zielserver sind falsch konfiguriert. | Nutzer von Edge Public und Private Cloud |
| Zielserver schließt die Verbindung vorzeitig | Der Zielserver schließt die Verbindung vorzeitig, während Edge Microgateway die Anfragenutzlast sendet. | Nutzer von Edge Public und Private Cloud |
Allgemeine Diagnoseschritte
- Prüfen Sie die Edge Microgateway-Logs:
/var/tmp/edgemicro-`hostname`-*.log
- Suchen Sie nach
502-Fehlern mit dem CodeECONNRESETinnerhalb eines bestimmten Zeitraums (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, bei denen weiterhin502-Fehler auftreten.2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test] [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684] [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
- Wenn die Logging-Ebene auf
warnoderinfofestgelegt ist, wird auch eine[warn]Meldung mit dem Hostnamen und Port des Zielservers im zweiten Element angezeigt. In diesem Beispiel ist dasX.X.X.X:8080. Dieser Wert kann später verwendet werden um einentcpdumpzu erfassen.2021-06-23T03:52:24.109Z [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup] [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware] [targetRequest error][GET][][socket hang up][ECONNRESET][395]
- Der Fehlercode
[socket hang up][ECONNRESET]gibt an, dass der Zielserver die Verbindung zu Edge Microgateway geschlossen hat. Sie können in den Logs danach suchen, um zu ermitteln, wie oft das passiert.
Ursache: Falsch konfiguriertes Keep-Alive-Zeitlimit
Diagnose
- Führen Sie die Schritte unter Allgemeine Diagnoseschritte aus und prüfen Sie, ob der
[socket hang up][ECONNRESET]Fehler aufgetreten ist. Wenn ja, untersuchen Sie das Problem mit
tcpdumpweiter, wie unten beschrieben:
„tcpdump“ verwenden
- Erfassen Sie ein
tcpdumpzwischen Edge Microgateway und dem Backend-Server im Betriebssystem des Edge Microgateway-Hosts mit dem folgenden Befehl:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Analysieren Sie den erfassten
tcpdump:Beispielausgabe von „tcpdump“: ( größere Ansicht)
Im obigen Beispiel für
tcpdumpsehen Sie Folgendes:- In Paket 250288 sendet der Client eine
POST-Anfrage. - In Paket 250371 antwortet der Server mit
200 OK. - In Paket 250559 sendet der Client ein
ACK. - In Paket 250560 sendet der Server die
ContinuationNachricht. - In Paket 250561 sendet der Client ein
ACK. - In Paket 262436 sendet der Server ein
FIN, ACKan den Client, um das Schließen der Verbindung zu initiieren. Das ist etwa fünf Sekunden nach dem vorherigen Paket (250561). - In Paket 262441 sendet der Client eine weitere
POSTAnfrage. Diese schlägt jedoch fehl, da der Server bereits das Schließen der Verbindung initiiert hat. Er antwortet mit einemRSTin Paket 262441.
Dieselbe Verbindung wurde in diesem Beispiel mindestens einmal erfolgreich wiederverwendet. Bei der letzten Anfrage initiiert der Server jedoch nach fünf Sekunden Inaktivität das Schließen der Verbindung. Das passiert gleichzeitig mit dem Senden einer neuen Anfrage durch den Client. Das deutet darauf hin, dass das Keep-Alive-Zeitlimit des Backend-Servers höchstwahrscheinlich kürzer oder gleich dem im Client festgelegten Wert ist. Informationen zum Prüfen finden Sie unter Keep-Alive-Zeitlimit in Edge Microgateway und auf dem Backend-Server vergleichen.
- In Paket 250288 sendet der Client eine
Keep-Alive-Zeitlimits vergleichen
- Edge Microgateway hat keine spezifische Keep-Alive-Zeitlimit-Eigenschaft. Sie wird durch das Betriebssystem bestimmt, auf dem es ausgeführt wird. Häufige Beispiele sind Windows, Linux- und Docker-Container.
- Möglicherweise wurde diese Einstellung im Betriebssystem angepasst. Wenden Sie sich an Ihren Systemadministrator. Standardmäßig haben Linux-Betriebssysteme ein Keep-Alive Zeitlimit von zwei Stunden.
- Prüfen Sie als Nächstes die Keep-Alive-Zeitlimit-Eigenschaft, die auf Ihrem Backend-Server konfiguriert ist. Angenommen, Ihr Backend-Server ist mit einem Wert von 10 Sekunden konfiguriert.
- Wenn Sie feststellen, dass der Wert des Keep-Alive-Zeitlimits im Betriebssystem
höher ist als der Wert der Keep-Alive-Zeitlimit-Eigenschaft auf dem Backend-Server (wie im
obigen Beispiel), ist das die Ursache für
502Fehler.
Auflösung
Die Keep-Alive-Zeitlimit-Eigenschaft muss im Betriebssystem, auf dem Edge Microgateway ausgeführt wird, immer niedriger sein als auf dem Backend-Server.
- Ermitteln Sie den für das Keep-Alive-Zeitlimit auf dem Backend-Server festgelegten Wert.
- Konfigurieren Sie einen geeigneten Wert für die Keep-Alive-Zeitlimit-Eigenschaft im Betriebssystem sodass die Keep-Alive-Zeitlimit-Eigenschaft niedriger ist als der auf dem Backend-Server festgelegte Wert. Verwenden Sie dazu die Schritte, die für Ihr Betriebssystem gelten.
Best Practice
Es wird dringend empfohlen, dass die Downstream-Komponenten immer einen niedrigeren Keep-Alive-Zeitlimit
Schwellenwert haben als die auf den Upstream-Servern konfigurierten Werte, um diese Art von Race-Bedingungen und
502 Fehler zu vermeiden. Jeder Downstream-Hop sollte niedriger sein als jeder Upstream-Hop. In Edge
Microgateway sollten Sie die folgenden Richtlinien verwenden:
Das Keep-Alive-Zeitlimit in der Clientanwendung oder im Load-Balancer sollte niedriger sein als das Keep-Alive-Zeitlimit von Edge Microgateway.
Wenn Sie das Keep-Alive-Zeitlimit in Edge Microgateway konfigurieren möchten, fügen Sie den
keep_alive_timeoutWert in der~/.edgemicro/org-env-config.yamlDatei hinzu.edgemicro: keep_alive_timeout: 65000
- Das Keep-Alive-Zeitlimit des Betriebssystems von Edge Microgateway sollte niedriger sein als das Keep-Alive-Zeitlimit des Ziel servers.
- Wenn Sie weitere Hops vor oder hinter Edge Microgateway haben, sollte dieselbe Regel angewendet werden. Es sollte immer in der Verantwortung des Downstream-Clients liegen, die Verbindung zum Upstream zu schließen.
Ursache: Zielserver schließt die Verbindung vorzeitig
Diagnose
- Führen Sie die Schritte unter Allgemeine Diagnoseschritte aus und prüfen Sie, ob der
[socket hang up][ECONNRESET]Fehler aufgetreten ist. - Wenn ja, untersuchen Sie das Problem mit
tcpdumpweiter, wie unten beschrieben.Die Fehlermeldung
[targetRequest error][GET][][socket hang up][ECONNRESET]im obigen Beispiel gibt an, dass dieser Fehler aufgetreten ist, als Edge Microgateway die Anfrage an den Backend-Server (Zielserver) gesendet hat. Das heißt, Edge Microgateway hat die API-Anfrage an den Backend-Server gesendet und auf die Antwort gewartet. Der Backend Server hat die Verbindung jedoch abrupt beendet, bevor Edge Microgateway eine Antwort erhalten hat. - Prüfen Sie die Logs Ihres Backend-Servers und suchen Sie nach Fehlern oder Informationen, die dazu geführt haben könnten, dass der Backend-Server die Verbindung abrupt beendet hat. Wenn Sie Fehler oder Informationen finden, lesen Sie den Abschnitt Auflösung und beheben Sie das Problem entsprechend auf Ihrem Backend-Server.
- Wenn Sie keine Fehler oder Informationen auf Ihrem Backend-Server finden, erfassen Sie die
tcpdumpAusgabe auf dem Edge Microgateway-Server:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Analysieren Sie den erfassten
tcpdump:Beispielausgabe von „tcpdump“: ( größere Ansicht)
Im obigen Beispiel für
tcpdumpsehen Sie Folgendes:- In Paket 4 hat Edge Microgateway eine
GETAnfrage an den Ziel server gesendet. - In Paket 5 hat der Zielserver mit
ACKgeantwortet, um die Anfrage zu bestätigen. - In Paket 6 sendet der Zielserver jedoch anstelle einer Antwortnutzlast ein
FIN, ACK, um das Schließen der Verbindung zu initiieren. - In den Paketen 7 und danach wird die Verbindung beidseitig geschlossen. Da die Verbindung geschlossen wurde, bevor die Antwort gesendet wurde, gibt Edge Microgateway den HTTP
502Fehler an den Client zurück. - Der Zeitstempel von Paket 8,
2021-06-23T03:52:24.110Zentspricht dem Zeitstempel, zu dem der Fehler in den Edge Microgateway Logs protokolliert wurde. Die Zeitstempel in den Logdateien und imtcpdumpkönnen oft verwendet werden, um die Fehler den tatsächlichen Paketen zuzuordnen.
Auflösung
Beheben Sie das Problem auf dem Backend-Server entsprechend.
Wenn das Problem weiterhin besteht und Sie Hilfe bei der Fehlerbehebung für
502 Bad Gateway Errorbenötigen oder vermuten, dass es sich um ein Problem in Edge Microgateway handelt, lesen Sie den Abschnitt Erfassen von Diagnoseinformationen erforderlich.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:
- Logdateien: Der Standardordner ist
/var/tmp. Er kann jedoch in der Hauptdateiconfig.yaml(logging > dir parameter) überschrieben werden. Es wird empfohlen,log > levelininfozu ändern, bevor Sie die Logdateien an den Apigee-Support senden. - Konfigurationsdatei: Die Hauptkonfiguration von Edge Microgateway befindet sich in der
YAML-Datei im Standardordner von Edge Microgateway,
$HOME/.edgemicro. Es gibt eine Standardkonfigurationsdatei namensdefault.yamlund dann eine für jede UmgebungORG-ENV-config.yaml. Laden Sie diese Datei vollständig für die betroffene Organisation und Umgebung hoch.
- In Paket 4 hat Edge Microgateway eine