Gateway non valido 502 - Intestazione duplicata

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP di 502 Bad Gateway con codice di errore protocol.http.DuplicateHeader in risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 502 Bad Gateway

Inoltre, potresti visualizzare un messaggio di errore simile a quello mostrato di seguito:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Possibili cause

Questo errore si verifica se un'intestazione HTTP specifica non può avere duplicati in Apigee Edge, compare più di una volta con valori uguali o diversi, come parte della risposta HTTP inviata il server di backend ad Apigee Edge.

Secondo RFC 7230, sezione 3.2.2: Ordine dei campi, un mittente NON DEVE generare intestazioni multiple campi con lo stesso nome campo in un messaggio, a meno che il valore del campo il campo di intestazione è definito come un elenco separato da virgole, [ad es. #(values)] oppure il campo di intestazione è un nota eccezione. Se Apigee Edge rileva una stessa intestazione specifica, non è consentito duplicati, viene inviato più di una volta nella risposta HTTP inviata dal server di destinazione/backend, poi risponde con 502 Bad Gateway e codice di errore protocol.http.DuplicateHeader

Ecco le possibili cause di questo errore:

Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
Intestazione duplicata nella risposta La risposta dal server di backend contiene intestazioni duplicate. Utenti perimetrali di cloud pubblici e privati

Passaggi diagnostici comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

  1. Accedi alla UI di Apigee Edge come utente con ruolo appropriato.
  2. Passa all'organizzazione in cui vuoi esaminare il problema.

  3. Vai al menu Analizza > Monitoraggio delle API > Esamina.
  4. Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
  5. Assicurati che il filtro Proxy sia impostato su Tutti.
  6. Traccia il codice di errore in base all'ora.
  7. Seleziona una cella con il codice di errore protocol.http.DuplicateHeader, come mostrato di seguito:

    (visualizza immagine più grande)

  8. Le informazioni sul codice di errore protocol.http.DuplicateHeader vengono visualizzate come mostrato di seguito:

    (visualizza immagine più grande)

  9. Assicurati che il Codice di stato sia 502, come mostrato nell'esempio riportato sopra.
  10. Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
  11. Nella finestra Log, prendi nota dei seguenti dettagli:

    • Codice di stato: 502
    • Origine errore:target
    • Codice di errore: protocol.http.DuplicateHeader.
  12. L'origine errore è target e indica che la risposta dal server di backend conteneva intestazioni duplicate.

Strumento Trace

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Attiva la sessione di traccia e
      .
    1. Attendi che si verifichi l'errore 502 Bad Gateway oppure
    2. Se riesci a riprodurre il problema, effettuare la chiamata API e riprodurre il 502 Bad Gateway errore
  2. Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia attivata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Naviga attraverso le diverse fasi della traccia e individua dove si è verificato l'errore.
  5. In genere troverai l'errore in un flusso successivo al messaggio Richiesta inviata al target server come mostrato di seguito:

    (visualizza immagine più grande)

  6. Prendi nota del valore dell'errore della traccia.

    La traccia di esempio riportata sopra mostra l'errore come Duplicate Header "Expires". Dal giorno l'errore viene generato da Apigee dopo l'invio della richiesta al server di backend, indica che il server di backend ha inviato l'intestazione Expires più di una volta.

  7. Vai alla fase AX (dati registrati di Analytics) della traccia e fai clic sulla fase.
  8. Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni della risposta e determina la i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    (visualizza immagine più grande)

  9. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source. come protocol.http.DuplicateHeader e target, per indicare che questo errore è dovuto al fatto che il server di backend ha trasmesso intestazioni duplicate per l'URL intestazione della risposta Expires.
    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Controlla se stai utilizzando proxy chaining; vale a dire se il server o l'endpoint di destinazione sta richiamando un altro proxy in Apigee.

    1. Per determinarlo, torna alla fase del server Richiesta inviata alla destinazione. Fai clic su Mostra arricciatura.

    2. Si apre la finestra Curl per richieste inviate al server di destinazione, dalla quale puoi determinare l'alias host del server di destinazione.

    3. Se l'alias dell'host del server di destinazione rimanda a un alias dell'host virtuale, si tratta di un proxy concatenamento. In questo caso, devi ripetere tutti i passaggi precedenti per il proxy concatenato fino a quando sei tu a determinare la causa dell'errore 502 Bad Gateway.
    4. Se l'alias dell'host del server di destinazione rimanda al tuo server di backend, indica che il tuo server di backend invia le intestazioni duplicate nella risposta ad Apigee.

NGINX

Per diagnosticare l'errore utilizzando i log di accesso NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log di accesso NGINX per determinare le informazioni chiave sugli errori HTTP 502.
  2. Controlla i log di accesso NGINX:

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

    Dove: ORG, ENV e PORT# vengono sostituiti con valori effettivi.

  3. Cerca per vedere se si sono verificati 502 errori durante un intervallo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che non vanno a buon fine 502.
  4. Se riscontri errori 502 con il codice X-Apigee-fault-code corrispondente al valore di protocol.http.DuplicateHeader, allora determinare il valore della X-Apigee-fault-source.

    Esempio di errore 502 nel log di accesso NGINX:

    La voce di esempio riportata sopra del log di accesso NGINX ha i seguenti valori per X- Codice di errore Apigee e fonte-fault-X-Apigee:

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Causa: intestazione duplicata nella risposta

Diagnosi

  1. Determinare il codice di errore e l'origine errore per l'errore osservato utilizzando l'API Log di accesso di Monitoring o NGINX come spiegato nella sezione Passaggi di diagnostica comuni.
  2. Se Origine errore ha il valore target, significa che la risposta inviate dal server di destinazione contengono intestazioni duplicate.
  3. Puoi determinare l'intestazione effettiva che viene inviata più di una volta come parte della risposta. utilizzando uno dei seguenti metodi:

    Messaggio di errore

    Utilizzo del messaggio di errore:

    1. Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, consulta al faultstring. faultstring contiene il nome dell'intestazione è stato inviato più di una volta.

      Esempio di messaggio di errore:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Nel messaggio di errore riportato sopra, puoi vedere che l'intestazione Expires è stata inviata più volte, come indicato nelle faultstring.

    Richiesta effettiva

    Mediante la richiesta effettiva:

    1. Se non hai accesso alla richiesta effettiva fatta al server di destinazione, ottieni il comando curl corrispondente Passaggio 10.a di Utilizzo dello strumento Trace e passaggio 10.b.
    2. Se hai accesso alla richiesta effettiva fatta all'applicazione del server di destinazione, segui questi passaggi:

      1. Effettuare una chiamata al server di destinazione.

        Richiesta di esempio per il server di destinazione utilizzato in questo esempio:

        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. Verifica l'elenco delle intestazioni visualizzate nella risposta.

        Esempio di risposta dal server di destinazione utilizzato in questo esempio:

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

        Nella richiesta di esempio precedente, l'intestazione Expires viene inviata più spesso più di una volta. Pertanto, questa richiesta non va a buon fine con 502 Bad Gateway e il codice di errore: protocol.http.DuplicateHeader.

      3. Se l'intestazione il cui nome appare in faultstring viene visualizzata più di una volta nella risposta del server di backend, . Nel caso precedente, l'intestazione Expires viene inviata più di una volta.

Risoluzione

Correggi i duplicati

Opzione 1 [Opzione consigliata] Correggi il server di backend per non includere intestazioni duplicate

  1. Analizza il motivo per cui lo specifico server di backend invia un'intestazione duplicata Expires e verifica se i proxy API accettano la richiesta. Nella nella maggior parte dei casi, non sarebbe opportuno come da specifica HTTP RFC7230.
  2. Se non è opportuno, modifica l'applicazione del server di destinazione in modo che non invii intestazioni duplicate. Nell'esempio discusso sopra, si nota che viene inviata l'intestazione Expires due volte con lo stesso valore, cosa non auspicabile. Puoi risolvere il problema assicurandoti che il server di destinazione superi l'intestazione Expires una sola volta.
  3. Se preferisci consentire le intestazioni duplicate, vai a Opzione 2: utilizzo della proprietà CwC.

CwC

Opzione 2: utilizzo della proprietà CwC

Apigee offre una proprietà CwC HTTPHeader.<HeaderName> ,che consente alle applicazioni client e agli strumenti per inviare intestazioni duplicate ai proxy API in Apigee Edge.

Proprietà CwC Valori
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Ad esempio, la seguente proprietà può essere impostata sui processori di messaggi per consentire i duplicati e più valori per l'intestazione Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Se sei un utente del Private Cloud, puoi configurare la proprietà per impedire ad Apigee Edge non genera un errore 502 Bad Gateway, anche se la richiesta contiene le intestazioni duplicate utilizzando Guida illustrativa alla configurazione dei processori di messaggi per l'utilizzo di intestazioni duplicate.
  2. Se sei un utente del cloud pubblico, contatta l'assistenza Apigee Edge per configurare questo per la tua organizzazione.

Specifica

Apigee risponde con la risposta di errore 502 Bad Gateway perché prevede che il server di backend si comporterebbe in base alle seguenti specifiche RFC:

Specifica
RFC 7230, sezione 3.2.2: Ordine sul campo
RFC 7230, sezione 3.2: campi intestazione

Se hai ancora bisogno di aiuto dall'assistenza Apigee, vai a Raccogliere dati diagnostici.

Raccogliere dati diagnostici

Raccogli le seguenti informazioni diagnostiche e contatta l'assistenza Apigee Edge.

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Completa il comando curl utilizzato per riprodurre l'errore 502
  • File di traccia per le richieste API

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle proxy API
  • File di traccia per le richieste API
  • Log di accesso NGINX:

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

    Dove: ORG, ENV e PORT# vengono sostituiti con valori effettivi.

  • Log di sistema del processore di messaggi /opt/apigee/var/log/edge-message-processor/logs/system.log