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.DuplicateHeader
.
Fehlermeldung
Die Clientanwendung ruft den folgenden Antwortcode ab:
HTTP/1.1 502 Bad Gateway
Außerdem wird möglicherweise eine Fehlermeldung wie die folgende angezeigt:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
Mögliche Ursachen
Dieser Fehler tritt auf, wenn ein bestimmter HTTP-Header, der keine Duplikate in Apigee Edge enthalten darf, mehr als einmal mit denselben oder unterschiedlichen Werten als Teil der HTTP-Antwort angezeigt wird, die vom Back-End-Server an Apigee Edge gesendet wird.
Gemäß
RFC 7230, Abschnitt 3.2.2: Feldreihenfolge Dürfen Absender in einer Nachricht NICHT mehrere Headerfelder mit demselben Feldnamen generieren, es sei denn, der gesamte Feldwert für dieses Headerfeld ist als durch Kommas getrennte Liste definiert, z.B. #(values)] oder das Header-Feld eine bekannte Ausnahme. Wenn Apigee Edge feststellt, dass ein bestimmter Header, der keine Duplikate enthalten darf, mehr als einmal in der HTTP-Antwort gesendet wird, die vom Ziel-/Back-End-Server gesendet wird, antwortet er mit 502 Bad Gateway
und dem Fehlercode protocol.http.DuplicateHeader
Mögliche Ursachen für diesen Fehler:
Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
---|---|---|
Doppelter Header in Antwort | Die Antwort vom Back-End-Server enthält doppelte Header. | 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.
- Achten Sie darauf, dass der Filter Proxy auf Alle festgelegt ist.
- Stellen Sie den Fehlercode der Zeit gegenüber.
Wählen Sie eine Zelle mit dem Fehlercode
protocol.http.DuplicateHeader
aus, wie unten dargestellt:Informationen zum Fehlercode
protocol.http.DuplicateHeader
werden wie unten dargestellt angezeigt:- Achten Sie darauf, dass der Statuscode
502
ist, wie im Beispiel oben gezeigt. - Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.
Beachten Sie im Fenster "Logs" die folgenden Details:
- Statuscode:
502
- Fehlerquelle:
target
- Fehlercode:
protocol.http.DuplicateHeader
.
- Statuscode:
- Die Fehlerquelle ist
target
. Dies bedeutet, dass die Antwort vom Back-End-Server doppelte Header enthielt.
Trace-Tool
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
Achten Sie darauf, dass Alle Ablaufinformationen anzeigen aktiviert ist:
- 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.
Der Fehler tritt normalerweise in einem Ablauf nach der Phase Anfrage an Zielserver gesendet auf, wie unten dargestellt:
Notieren Sie sich den Wert des Fehlers aus dem Trace.
Das obige Beispiel-Trace zeigt den Fehler als
Duplicate Header "Expires"
. Da der Fehler von Apigee ausgelöst wird, nachdem die Anfrage an den Back-End-Server gesendet wurde, weist er darauf hin, dass der Back-End-Server den HeaderExpires
mehr als einmal gesendet hat.- Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
Scrollen Sie nach unten zum Abschnitt Phase Details – Response Headers (Phasendetails – Antwortheader) und ermitteln Sie wie unten dargestellt die Werte von X-Apigee-Fehler-Code und X-Apigee-Fehler-Quelle:
- Die Werte von X-Apigee-fault-code und X-Apigee-fault-code werden als
protocol.http.DuplicateHeader
undtarget
angezeigt. Dies weist darauf hin, dass dieser Fehler verursacht wird, weil vom Back-End-Server doppelte Header für den AntwortheaderExpires
übergeben wurden.Antwortheader Wert X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Prüfen Sie, ob Sie Proxy-Verkettung verwenden, d. h., ob der Zielserver oder Zielendpunkt einen anderen Proxy in Apigee aufruft.
Um dies zu ermitteln, kehren Sie zur Serverphase Anfrage an Ziel gesendet zurück. Klicken Sie auf Curl anzeigen.
Das Fenster Curl for Request Sent to Target Server (Curl für an Zielserver gesendete Anfrage) wird geöffnet, in dem Sie den Alias des Zielserver-Hosts bestimmen können.
- Wenn der Hostalias des Zielservers auf einen virtuellen Hostalias verweist, handelt es sich um eine Proxyverkettung. In diesem Fall müssen Sie alle oben genannten Schritte für den verketteten Proxy wiederholen, bis Sie feststellen, was den Fehler
502 Bad Gateway
tatsächlich verursacht. - Wenn der Hostalias des Zielservers auf Ihren Back-End-Server verweist, gibt er an, dass Ihr Back-End-Server die doppelten Header in der Antwort an Apigee sendet.
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
Hierbei gilt: ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
- 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. Wenn Sie
502
-Fehler mit dem X-Apigee-fault-code finden, der dem Wert von X-Apigee-fault-code 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.DuplicateHeader
X-Apigee-fault-source target
Ursache: Doppelter Header als Antwort
Diagnose
- Bestimmen Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API-Monitoring oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte erläutert.
- Wenn die Fehlerquelle den Wert
target
hat, weist dies darauf hin, dass die vom Zielserver gesendete Antwort doppelte Header enthält. Sie können den tatsächlichen Header, der mehr als einmal als Teil der Antwort gesendet wird, mit einer der folgenden Methoden ermitteln:
Fehlermeldung
Über die Fehlermeldung:
Wenn Sie Zugriff auf die vollständige Fehlermeldung von Apigee Edge haben, lesen Sie die
faultstring
.faultstring
enthält den Headernamen, der mehrmals gesendet wurde.Beispiel für eine Fehlermeldung:
"faultstring":"Duplicate Header \"Expires\""
- In der obigen Fehlermeldung sehen Sie, dass der Header
Expires
mehr als einmal gesendet wird, wie infaultstring
zu sehen.
Tatsächliche Anfrage
Tatsächliche Anfrage verwenden:
- Wenn Sie keinen Zugriff auf die eigentliche Anfrage an den Zielserver haben, rufen Sie den entsprechenden
curl
-Befehl aus Schritt 10.a und 10.b unter Trace-Tool verwenden ab. Wenn Sie Zugriff auf die eigentliche Anfrage an die Zielserveranwendung haben, führen Sie die folgenden Schritte aus:
Rufen Sie den Zielserver auf.
Beispielanfrage an den in diesem Beispiel verwendeten Zielserver:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
Überprüfen Sie die Liste der Header, die in der Antwort enthalten sind.
Beispielantwort des in diesem Beispiel verwendeten Zielservers:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
In der obigen Beispielanfrage wird der Header
Expires
mehrmals gesendet. Daher schlägt diese Anfrage mit dem Fehler502 Bad Gateway
und dem Fehlercodeprotocol.http.DuplicateHeader
fehl.Wenn der Header, dessen Name im
faultstring
vorkommt, in der Antwort des Back-End-Servers mehr als einmal vorkommt, ist das die Ursache für diesen Fehler. Im obigen Fall wird der HeaderExpires
mehr als einmal gesendet.
Auflösung
Probleme mit Duplikaten beheben
Option 1 [Empfohlene Option] Back-End-Server korrigieren, sodass er keine doppelten Header enthält
- Analysieren Sie den Grund für den spezifischen Back-End-Server, den doppelten Header
Expires
zu senden, und prüfen Sie, ob die API-Proxys dies akzeptieren. In den meisten Fällen ist dies gemäß der HTTP-Spezifikation RFC7230 nicht empfehlenswert. - Wenn dies nicht gewünscht ist, ändern Sie Ihre Zielserveranwendung so, dass keine doppelten Header gesendet werden.
Im oben beschriebenen Beispiel wird festgestellt, dass der Header
Expires
zweimal mit demselben Wert gesendet wird, was nicht wünschenswert ist. Sie können das Problem beheben, indem Sie dafür sorgen, dass der Zielserver den HeaderExpires
nur einmal übergibt. - Wenn dies sinnvoll ist und Sie die doppelten Header zulassen möchten, fahren Sie mit Option 2 – CwC-Attribut verwenden fort.
CwC
Option 2: „CwC“-Property verwenden
Apigee bietet das Attribut CwC HTTPHeader.<HeaderName>
,mit dem Clientanwendungen und Zielserver doppelte Header an API-Proxys in Apigee Edge senden können.
CwC-Property | Werte |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Die folgende Eigenschaft kann beispielsweise für die Message Processors festgelegt werden, um Duplikate und mehrere Werte für den Header Expires
zuzulassen.
HTTPHeader.Expires=allowDuplicates, multiValued
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie das Attribut konfigurieren, um zu verhindern, dass Apigee Edge den Fehler
502 Bad Gateway
ausgibt, auch wenn die Anfrage doppelte Header enthält. Verwenden Sie dazu die Anleitung Nachrichtenprozessoren für die Verwendung doppelter Header konfigurieren. - Wenn Sie ein Nutzer der öffentlichen Cloud sind, wenden Sie sich an den Apigee Edge-Support, um dieses Attribut für Ihre Organisation zu konfigurieren.
Spezifikation
Apigee antwortet mit der Fehlerantwort 502 Bad Gateway
, da erwartet wird, dass sich der Back-End-Server gemäß den folgenden RFC-Spezifikationen verhalten würde:
Spezifikation |
---|
RFC 7230, Abschnitt 3.2.2: Feldreihenfolge |
RFC 7230, Abschnitt 3.2: Headerfelder |
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
- Führen Sie den Befehl
curl
aus, mit dem der Fehler502
reproduziert wurde - Ablaufverfolgungsdatei für die API-Anfragen
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
- Name der Umgebung
- API-Proxy-Bundle
- Ablaufverfolgungsdatei für die API-Anfragen
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