502 Bad Gateway – DuplicateHeader

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:

  1. Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
  2. Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.

  3. Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
  5. Achten Sie darauf, dass der Filter Proxy auf Alle festgelegt ist.
  6. Stellen Sie den Fehlercode der Zeit gegenüber.
  7. Wählen Sie eine Zelle mit dem Fehlercode protocol.http.DuplicateHeader aus, wie unten dargestellt:

    (größeres Bild anzeigen)

  8. Informationen zum Fehlercode protocol.http.DuplicateHeader werden wie unten dargestellt angezeigt:

    (größeres Bild anzeigen)

  9. Achten Sie darauf, dass der Statuscode 502 ist, wie im Beispiel oben gezeigt.
  10. Klicken Sie auf Logs ansehen und maximieren Sie die Zeile für die fehlgeschlagene Anfrage.
  11. Beachten Sie im Fenster "Logs" die folgenden Details:

    • Statuscode: 502
    • Fehlerquelle: target
    • Fehlercode: protocol.http.DuplicateHeader.
  12. 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:

  1. Aktivieren Sie die Trace-Sitzung und entweder
    1. Warten Sie, bis der Fehler 502 Bad Gateway auftritt, oder
    2. Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus und reproduzieren Sie den Fehler 502 Bad Gateway.
  2. Achten Sie darauf, dass Alle Ablaufinformationen anzeigen aktiviert ist:

  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus und prüfen Sie den Trace.
  4. Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
  5. Der Fehler tritt normalerweise in einem Ablauf nach der Phase Anfrage an Zielserver gesendet auf, wie unten dargestellt:

    (größeres Bild anzeigen)

  6. 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 Header Expires mehr als einmal gesendet hat.

  7. Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
  8. 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:

    (größeres Bild anzeigen)

  9. Die Werte von X-Apigee-fault-code und X-Apigee-fault-code werden als protocol.http.DuplicateHeader und target angezeigt. Dies weist darauf hin, dass dieser Fehler verursacht wird, weil vom Back-End-Server doppelte Header für den Antwortheader Expires übergeben wurden.
    Antwortheader Wert
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Prüfen Sie, ob Sie Proxy-Verkettung verwenden, d. h., ob der Zielserver oder Zielendpunkt einen anderen Proxy in Apigee aufruft.

    1. Um dies zu ermitteln, kehren Sie zur Serverphase Anfrage an Ziel gesendet zurück. Klicken Sie auf Curl anzeigen.

    2. 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.

    3. 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.
    4. 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:

  1. Wenn Sie ein Private Cloud-Nutzer sind, können Sie mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-502-Fehlern ermitteln.
  2. 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.

  3. Suchen Sie nach 502-Fehlern innerhalb eines bestimmten Zeitraums (ob das Problem in der Vergangenheit aufgetreten ist) oder ob es immer noch Anfragen mit 502 gibt, die fehlschlagen.
  4. 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

  1. 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.
  2. Wenn die Fehlerquelle den Wert target hat, weist dies darauf hin, dass die vom Zielserver gesendete Antwort doppelte Header enthält.
  3. 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:

    1. 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\""
      
    2. In der obigen Fehlermeldung sehen Sie, dass der Header Expires mehr als einmal gesendet wird, wie in faultstring zu sehen.

    Tatsächliche Anfrage

    Tatsächliche Anfrage verwenden:

    1. 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.
    2. Wenn Sie Zugriff auf die eigentliche Anfrage an die Zielserveranwendung haben, führen Sie die folgenden Schritte aus:

      1. 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
        
      2. Ü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 Fehler 502 Bad Gateway und dem Fehlercode protocol.http.DuplicateHeader fehl.

      3. 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 Header Expires 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

  1. 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.
  2. 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 Header Expires nur einmal übergibt.
  3. 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
  1. 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.
  2. 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 Fehler 502 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