Sie lesen gerade die Dokumentation zu Apigee Edge.
Zur Dokumentation zu
Apigee X. info
Symptom
Die Clientanwendung erhält nach einem API-Proxy-Aufruf den HTTP-Antwortstatus 503 mit der Meldung
Service Unavailable.
Fehlermeldung
Die Clientanwendung erhält den folgenden Antwortcode:
HTTP/1.1 503 Service Unavailable
Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}Mögliche Ursachen
| Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
|---|---|---|
| Zielserver schließt Verbindung vorzeitig | Der Zielserver beendet die Verbindung vorzeitig, während der Message Processor weiterhin die Anfragenutzlast sendet. | Nutzer von Edge Public und Private Cloud |
Allgemeine Diagnoseschritte
Nachrichten-ID der fehlgeschlagenen Anfrage ermitteln
Trace-Tool
So ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage mit dem Trace-Tool:
- Wenn das Problem weiterhin besteht, aktivieren Sie die Trace-Sitzung für die betroffene API.
- Führen Sie den API-Aufruf aus und reproduzieren Sie das Problem:
503 Service Unavailablemit dem Fehlercodemessaging.adaptors.http.flow.ServiceUnavailable. - Wählen Sie eine der fehlgeschlagenen Anfragen aus.
- Rufen Sie die AX-Phase auf und ermitteln Sie die Nachrichten-ID
(
X-Apigee.Message-ID) der Anfrage, indem Sie im Abschnitt Phasendetails nach unten scrollen, wie in der folgenden Abbildung gezeigt.
NGINX-Zugriffslogs
So ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage mit den NGINX-Zugriffslogs:
Sie können auch die NGINX-Zugriffslogs verwenden, um die Nachrichten-ID für die 503-Fehler 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. Führen Sie die folgenden Schritte aus, um diese Informationen aus den NGINX-Zugriffslogs zu ermitteln:
- Prüfen Sie die NGINX-Zugriffslogs: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - Suchen Sie nach
503-Fehlern für den jeweiligen API-Proxy während eines bestimmten Zeitraums (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, die immer noch mit503fehlschlagen. - Wenn
503Fehler mit X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, notieren Sie die Nachrichten-ID für eine oder mehrere solcher Anfragen, wie im folgenden Beispiel gezeigt:Beispiel für einen Eintrag mit dem
503Fehler
Ursache: Zielserver schließt Verbindung vorzeitig
Diagnose
- Wenn Sie Nutzer von Public Cloud oder Private Cloud sind:
- Verwenden Sie das Trace-Tool (wie unter Allgemeine Diagnoseschritte)
und prüfen Sie, ob im Bereich Erfasste Analysedaten beide folgenden Werte festgelegt sind:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Verwenden Sie das Trace-Tool (wie unter Allgemeine Diagnoseschritte) und prüfen Sie, ob im Bereich Fehler direkt nach der E4/} Eigenschaft Status beide folgenden Werte festgelegt sind:
- error.class::
com.apigee.errors.http.server.ServiceUnavailableException - error.cause::
Broken pipe
TARGET_REQ_FLOW
- error.class::
- Weitere Informationen finden Sie unter „tcpdump“ verwenden.
- Verwenden Sie das Trace-Tool (wie unter Allgemeine Diagnoseschritte)
und prüfen Sie, ob im Bereich Erfasste Analysedaten beide folgenden Werte festgelegt sind:
- Wenn Sie Nutzer von Private Cloud sind:
- Ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage.
- Suchen Sie im Message Processor-Log
(
/opt/apigee/var/log/edge-message-processor/logs/system.log) nach der Nachrichten-ID. - Eine der folgenden Ausnahmen wird angezeigt:
Ausnahme 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel
2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy rev:1 messageid:myorg-opdk-test-1-30312-13747-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1 bytesRead=0 bytesWritten=76295 age=2012ms lastIO=2ms isOpen=false)
oder
Ausnahme 2: onExceptionWrite exception: {}
java.io.IOException: Broken pipe2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() : ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms lastIO=2 ms isOpen=false.onExceptionWrite exception: {} java.io.IOException: Broken pipe
- Beide Ausnahmen weisen darauf hin, dass die Verbindung vorzeitig vom
Backend-Server geschlossen wurde, während der Message Processor noch die
Anfragenutzlast an den Backend-Server gesendet hat. Daher löst der Message Processor die Ausnahme
java.io.IOException: Broken pipeaus. - The
Remote:IP:PORTgibt die aufgelöste IP-Adresse und Portnummer des Backend-Servers an. - Das Attribut
bytesWritten=76295in der obigen Fehlermeldung gibt an, dass der Message Processor eine Nutzlast von76295Byte an den Backend-Server gesendet hat, als die Verbindung vorzeitig geschlossen wurde. - Das Attribut
bytesRead=0gibt an, dass der Message Processor keine Daten (Antwort) vom Backend-Server erhalten hat. - Um dieses Problem weiter zu untersuchen, erfassen Sie entweder auf dem Backend
Server oder auf dem Message Processor einen
tcpdumpund analysieren Sie ihn wie unten beschrieben.
„tcpdump“ verwenden
-
Erfassen Sie einen
tcpdumpentweder auf dem Backend-Server oder auf dem Message Processor mit den folgenden Befehlen:Befehl zum Erfassen von
tcpdumpauf dem Backend-Server:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Befehl zum Erfassen von
tcpdumpauf dem Message Processor:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Analysieren Sie den erfassten
tcpdump:Beispielausgabe von „tcpdump“ (auf dem Message Processor erfasst):

Im obigen
tcpdumpsehen Sie Folgendes:- In Paket
4hat der Message Processor einePOST-Anfrage an den Backend-Server gesendet. - In den Paketen
5,8,9,10,11hat der Message Processor weiterhin die Anfragenutzlast an den Backend-Server gesendet. - In den Paketen
6und7hat der Backend-Server mitACKfür einen Teil der Anfragenutzlast geantwortet,die er vom Message Processor erhalten hat. - In Paket
12hat der Backend-Server jedoch nicht mitACKfür die empfangenen Anwendungsdatenpakete geantwortet und anschließend die Antwort nutzlast gesendet, sondern stattdessen mitFIN ACKgeantwortet und damit das Schließen der Verbindung eingeleitet. - Dies zeigt deutlich, dass der Backend-Server die Verbindung vorzeitig schließt während der Message Processor noch die Anfragenutzlast sendet.
- Dadurch zeichnet der Message Processor einen
IOException: Broken PipeFehler auf und gibt503an den Client zurück.
- In Paket
Auflösung
- Arbeiten Sie mit Ihrem Anwendungs- und Ihrem Netzwerkteam zusammen, um das Problem mit den vorzeitigen Verbindungsabbrüchen auf dem Backend-Server zu analysieren und zu beheben.
- Achten Sie darauf, dass für die Backend-Serveranwendung kein Zeitlimit überschritten wird und die Verbindung nicht zurückgesetzt wird, bevor die gesamte Anfragenutzlast empfangen wurde.
- Wenn Sie ein Netzwerkgerät oder eine Netzwerkschicht zwischen Apigee und dem Backend-Server haben, achten Sie darauf, dass das Zeitlimit nicht überschritten wird, bevor die gesamte Anfragenutzlast empfangen wurde.
Wenn das Problem weiterhin besteht, gehen Sie zu 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:
Wenn Sie 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 Fehlers503 - Trace-Datei mit der Anfrage, die den Fehler
503 Service Unavailableenthält - Wenn die
503-Fehler derzeit nicht auftreten, geben Sie den Zeitraum mit den Zeitzoneninformationen an, in dem die503-Fehler in der Vergangenheit aufgetreten sind.
Wenn Sie Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
- Name der Organisation, Name der Umgebung und Name des API-Proxys, für die
503Fehler auftreten - API-Proxy-Bundle
- Trace-Datei mit den Anfragen, die den Fehler
503 Service Unavailableenthalten - 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
503-Fehler aufgetreten sind Tcpdumpserfasst auf den Message Processors und dem Backend-Server, als der Fehler aufgetreten ist