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:
- Accedi alla UI di Apigee Edge come utente con ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai al menu Analizza > Monitoraggio delle API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia il codice di errore in base all'ora.
Seleziona una cella con il codice di errore
protocol.http.DuplicateHeader
, come mostrato di seguito:Le informazioni sul codice di errore
protocol.http.DuplicateHeader
vengono visualizzate come mostrato di seguito:- Assicurati che il Codice di stato sia
502
, come mostrato nell'esempio riportato sopra. - Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
Nella finestra Log, prendi nota dei seguenti dettagli:
- Codice di stato:
502
- Origine errore:
target
- Codice di errore:
protocol.http.DuplicateHeader
.
- Codice di stato:
- 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:
- Attiva la sessione di traccia e
- .
- Attendi che si verifichi l'errore
502 Bad Gateway
oppure - Se riesci a riprodurre il problema, effettuare la chiamata API e riprodurre il
502 Bad Gateway
errore
- Attendi che si verifichi l'errore
Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia attivata:
- Seleziona una delle richieste non riuscite ed esamina la traccia.
- Naviga attraverso le diverse fasi della traccia e individua dove si è verificato l'errore.
In genere troverai l'errore in un flusso successivo al messaggio Richiesta inviata al target server come mostrato di seguito:
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'intestazioneExpires
più di una volta.- Vai alla fase AX (dati registrati di Analytics) della traccia e fai clic sulla fase.
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:
- Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source.
come
protocol.http.DuplicateHeader
etarget
, per indicare che questo errore è dovuto al fatto che il server di backend ha trasmesso intestazioni duplicate per l'URL intestazione della rispostaExpires
.Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Controlla se stai utilizzando proxy chaining; vale a dire se il server o l'endpoint di destinazione sta richiamando un altro proxy in Apigee.
Per determinarlo, torna alla fase del server Richiesta inviata alla destinazione. Fai clic su Mostra arricciatura.
Si apre la finestra Curl per richieste inviate al server di destinazione, dalla quale puoi determinare l'alias host del server di destinazione.
- 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
. - 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:
- Se sei un utente Private Cloud, puoi utilizzare i log di accesso NGINX per
determinare le informazioni chiave sugli errori HTTP
502
. 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.
- 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 fine502
. Se riscontri errori
502
con il codice X-Apigee-fault-code corrispondente al valore diprotocol.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
- 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.
- Se Origine errore ha il valore
target
, significa che la risposta inviate dal server di destinazione contengono intestazioni duplicate. 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:
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\""
- Nel messaggio di errore riportato sopra, puoi vedere che l'intestazione
Expires
è stata inviata più volte, come indicato nellefaultstring
.
Richiesta effettiva
Mediante la richiesta effettiva:
- 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. Se hai accesso alla richiesta effettiva fatta all'applicazione del server di destinazione, segui questi passaggi:
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
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 con502 Bad Gateway
e il codice di errore:protocol.http.DuplicateHeader
.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'intestazioneExpires
viene inviata più di una volta.
Risoluzione
Correggi i duplicati
Opzione 1 [Opzione consigliata] Correggi il server di backend per non includere intestazioni duplicate
- 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. - 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'intestazioneExpires
una sola volta. - 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
- 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. - 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'errore502
- 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