502 Bad Gateway – DuplicateHeader

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 Fehlercode protocol.http.DuplicateHeader als Antwort auf API-Aufrufe.

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 502 Bad Gateway

Außerdem wird möglicherweise eine Fehlermeldung ähnlich der folgenden 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 haben darf, mehrmals mit denselben oder unterschiedlichen Werten als Teil der HTTP-Antwort auftritt, die vom Backend-Server an Apigee Edge gesendet wird.

Gemäß RFC 7230, Abschnitt 3.2.2: Feldreihenfolge, darf ein Absender in einer Nachricht nicht mehrere Header felder mit demselben Feldnamen generieren, es sei denn, der gesamte Feldwert für dieses Headerfeld ist als durch Kommas getrennte Liste definiert ( #(values)]) oder das Headerfeld ist eine bekannte Ausnahme. Wenn Apigee Edge feststellt, dass ein bestimmter Header, der keine Duplikate haben darf, mehrmals in der HTTP-Antwort gesendet wird, die vom Ziel-/Backend-Server gesendet wird, antwortet Apigee Edge 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 der Antwort Die Antwort vom Backend-Server enthält doppelte Header. Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

Verwenden Sie eines der folgenden Tools/Verfahren, um diesen Fehler zu diagnostizieren:

API-Monitoring

So diagnostizieren Sie den Fehler mit API-Monitoring:

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

  3. Rufen Sie die Seite Analysieren > API-Monitoring > Untersuchen auf.
  4. Wählen Sie den Zeitraum aus, in dem die Fehler aufgetreten sind.
  5. Achten Sie darauf, dass der Filter Proxy auf Alle gesetzt ist.
  6. Stellen Sie Fehlercode im Verhältnis zu Zeit dar.
  7. Wählen Sie eine Zelle mit dem Fehlercode protocol.http.DuplicateHeader aus, wie unten gezeigt:

    (größeres Bild anzeigen)

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

    (größeres Bild anzeigen)

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

    • Statuscode:502
    • Fehlerquelle:target
    • Fehlercode:protocol.http.DuplicateHeader.
  12. Die Fehlerquelle ist target. Das bedeutet, dass die Antwort vom Backend-Server doppelte Header enthielt.

Trace-Tool

So diagnostizieren Sie den Fehler mit dem Trace-Tool:

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

  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus und untersuchen Sie den Trace.
  4. Navigieren Sie durch die verschiedenen Phasen des Traces und suchen Sie nach der Stelle, an der der Fehler aufgetreten ist.
  5. Der Fehler tritt in der Regel in einem Ablauf nach der Phase Anfrage an Zielserver gesendet auf, wie unten gezeigt:

    (größeres Bild anzeigen)

  6. Notieren Sie sich den Wert des Fehlers aus dem Trace.

    Im obigen Beispiel-Trace wird der Fehler als Duplicate Header "Expires" angezeigt. Da der Fehler von Apigee ausgelöst wird, nachdem die Anfrage an den Backend-Server gesendet wurde, bedeutet dies, dass der Backend-Server den Header Expires mehrmals gesendet hat.

  7. Rufen Sie im Trace die Phase AX (Analysedaten aufgezeichnet) auf und klicken Sie darauf.
  8. Scrollen Sie nach unten zum Abschnitt Phasendetails – Antwortheader und ermitteln Sie die Werte von X-Apigee-fault-code und X-Apigee-fault-source wie unten gezeigt:

    (größeres Bild anzeigen)

  9. Die Werte von X-Apigee-fault-code und X-Apigee-fault-source sind protocol.http.DuplicateHeader und target. Das bedeutet, dass dieser Fehler dadurch verursacht wird, dass der Backend-Server doppelte Header für den Antwortheader Expires übergeben hat.
    Antwortheader Wert
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Prüfen Sie, ob Sie die Proxy-Verkettung verwenden; d. h., ob der Zielserver oder Zielendpunkt einen anderen Proxy in Apigee aufruft.

    1. Rufen Sie dazu die Phase Anfrage an Zielserver gesendet auf. Klicken Sie auf Curl anzeigen.

    2. Das Fenster Curl für Anfrage an Zielserver gesendet wird geöffnet. Hier können Sie den Hostalias des Zielservers ermitteln.

    3. Wenn der Hostalias des Zielservers auf einen Alias des virtuellen Hosts verweist, handelt es sich um eine Proxy Verkettung. In diesem Fall müssen Sie alle oben genannten Schritte für den verketteten Proxy wiederholen, bis Sie die tatsächliche Ursache für den Fehler 502 Bad Gateway ermittelt haben.
    4. Wenn der Hostalias des Zielservers auf Ihren Backend-Server verweist, bedeutet das, dass Ihr Backend-Server die doppelten Header in der Antwort an Apigee sendet.

NGINX

So diagnostizieren Sie den Fehler mit NGINX-Zugriffslogs:

  1. Wenn Sie ein Private Cloud-Nutzer sind, können Sie NGINX-Zugriffslogs verwenden, um die wichtigsten Informationen zu HTTP 502 Fehlern zu ermitteln.
  2. Prüfen Sie die NGINX-Zugriffslogs:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dabei werden ORG, ENV und PORT# durch tatsächliche Werte ersetzt.

  3. Suchen Sie nach 502-Fehlern in einem bestimmten Zeitraum (wenn das Problem in der Vergangenheit aufgetreten ist) oder nach Anfragen, die immer noch mit 502 fehlschlagen.
  4. Wenn Sie 502-Fehler finden, bei denen der X-Apigee-fault-code mit dem Wert protocol.http.DuplicateHeader übereinstimmt, ermitteln Sie den Wert von X-Apigee-fault-source.

    Beispiel für einen 502-Fehler aus dem NGINX-Zugriffslog:

    Der obige Beispiel-Eintrag aus dem NGINX-Zugriffslog hat die folgenden Werte für X- Apigee-fault-code und X-Apigee-fault-source:

    Antwortheader Wert
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Ursache: Doppelter Header in der Antwort

Diagnose

  1. Ermitteln Sie den Fehlercode und die Fehlerquelle für den beobachteten Fehler mithilfe von API Monitoring oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte beschrieben.
  2. Wenn die Fehlerquelle den Wert target hat, bedeutet das, dass die vom Zielserver gesendete Antwort doppelte Header enthält.
  3. Sie können den tatsächlichen Header, der mehrmals als Teil der Antwort gesendet wird, mit einer der folgenden Methoden ermitteln:

    Fehlermeldung

    Fehlermeldung verwenden :

    1. Wenn Sie Zugriff auf die vollständige Fehlermeldung haben, die Sie von Apigee Edge erhalten haben, sehen Sie sich den faultstring an. Der 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 mehrmals gesendet wurde, wie im faultstring zu sehen ist.

    Tatsächliche Anfrage

    Tatsächliche Anfrage verwenden :

    1. Wenn Sie keinen Zugriff auf die tatsächliche Anfrage an den Zielserver haben, rufen Sie den entsprechenden curl Befehl unter Trace-Tool verwenden, Schritt 10a und Schritt 10b ab.
    2. Wenn Sie Zugriff auf die tatsächliche Anfrage an die Zielserveranwendung haben, führen Sie die folgenden Schritte aus:

      1. Rufen Sie den Zielserver auf.

        Beispielanfrage für 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. Prüfen Sie die Liste der Header in der Antwort.

        Beispielantwort vom in diesem Beispiel verwendeten Zielserver:

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

      3. Wenn der Header, dessen Name im faultstring angezeigt wird, mehrmals in der Antwort des Backend-Servers vorkommt, ist das die Ursache für diesen Fehler. Im obigen Fall wird der Header Expires mehrmals gesendet.

Auflösung

Duplikate beheben

Option 1 [empfohlen]: Backend-Server so korrigieren, dass keine doppelten Header enthalten sind

  1. Analysieren Sie, warum der bestimmte Backend-Server den doppelten Header Expires sendet, und prüfen Sie, ob die API-Proxys das akzeptieren können. In den meisten Fällen ist das gemäß der HTTP-Spezifikation RFC7230 nicht erwünscht.
  2. Wenn das nicht erwünscht ist, ändern Sie Ihre Zielserveranwendung so, dass keine doppelten Header gesendet werden. Im oben beschriebenen Beispiel wird der Header Expires zweimal mit demselben Wert gesendet, was nicht erwünscht ist. Sie können das Problem beheben, indem Sie dafür sorgen, dass der Zielserver den Expires Header nur einmal übergibt.
  3. Wenn das erwünscht ist und Sie die doppelten Header zulassen möchten, lesen Sie Option 2: CwC-Attribut verwenden.

CwC

Option 2: CwC-Attribut verwenden

Apigee bietet ein CwC-Attribut HTTPHeader.<HeaderName> ,mit dem Clientanwendungen und Zielserver doppelte Header an API-Proxys in Apigee Edge senden können.

CwC-Attribut Werte
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Das folgende Attribut kann beispielsweise für die Nachrichtenverarbeiter 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 so konfigurieren, dass Apigee Edge keinen Fehler 502 Bad Gateway auslöst, auch wenn die Anfrage doppelte Header enthält. Eine Anleitung dazu finden Sie unter Nachrichtenverarbeiter für die Verwendung doppelter Header konfigurieren.
  2. Wenn Sie ein Public Cloud-Nutzer sind, wenden Sie sich an den Apigee Edge-Support, um dieses Attribut für Ihre Organisation zu konfigurieren.

Spezifikation

Apigee antwortet mit der 502 Bad Gateway Fehlermeldung, da der Backend-Server gemäß den folgenden RFC-Spezifikationen funktionieren sollte:

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 Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Erfassen 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 des Fehlers 502
  • Trace-Datei für die API-Anfragen

Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
  • Name der Umgebung
  • API-Proxy-Bundle
  • Trace-Datei für die API-Anfragen
  • NGINX-Zugriffslogs:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dabei werden: ORG, ENV und PORT# durch tatsächliche Werte ersetzt.

  • Systemprotokolle des Message Processors /opt/apigee/var/log/edge-message-processor/logs/system.log