Stai visualizzando la documentazione di Apigee Edge.
Vai alla
documentazione di Apigee X. informazioni
Sintomo
L'applicazione client riceve un codice di stato HTTP 502 Bad Gateway
con codice di errore
protocol.http.DuplicateHeader
come risposta per le chiamate API.
Messaggio di errore
L'applicazione client riceve il seguente codice di risposta:
HTTP/1.1 502 Bad Gateway
Inoltre, potrebbe essere visualizzato 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, che non può avere duplicati in Apigee Edge, appare più di una volta con valori uguali o diversi, nell'ambito della risposta HTTP inviata dal server di backend ad Apigee Edge.
Secondo
RFC 7230, sezione 3.2.2: Ordine dei campi, un mittente NON DEVE generare più campi di intestazione con lo stesso nome di campo in un messaggio, a meno che l'intero valore del campo per tale campo di intestazione non sia definito come un elenco separato da virgole, [ad es. #(values)] o il campo dell'intestazione è un'eccezione nota. Se Apigee Edge rileva che una stessa intestazione specifica, che non può avere duplicati, viene inviata più di una volta nella risposta HTTP inviata dal server di destinazione/backend, risponde con 502 Bad Gateway
e il codice di errore
protocol.http.DuplicateHeader
Di seguito sono riportate le possibili cause di questo errore:
Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili a |
---|---|---|
Intestazione duplicata nella risposta | La risposta del server di backend contiene intestazioni duplicate. | Utenti di cloud pubblico e privato perimetrale |
Passaggi di diagnosi più comuni
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando il monitoraggio delle API:
- Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai alla pagina Analizza > Monitoraggio API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai riscontrato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia Codice di errore su 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 sopra. - Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
Nella finestra Log, tieni presente i seguenti dettagli:
- Codice di stato:
502
- Origine errore:
target
- Codice di errore:
protocol.http.DuplicateHeader
.
- Codice di stato:
- L'origine dell'errore è
target
, che indica che la risposta del server di backend conteneva intestazioni duplicate.
Strumento Traccia
Per diagnosticare l'errore utilizzando lo strumento Trace:
- Abilita la sessione di traccia e
- Attendi che si verifichi l'errore
502 Bad Gateway
oppure - Se riesci a riprodurre il problema, effettua la chiamata API e riproduci l'errore
502 Bad Gateway
- 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 tra le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
In genere, l'errore si trova in un flusso successivo alla fase Richiesta inviata al server di destinazione, come mostrato di seguito:
Prendi nota del valore dell'errore della traccia.
La traccia di esempio precedente mostra l'errore come
Duplicate Header "Expires"
. Poiché 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 (Analytics Data Recorded) della traccia e fai clic su quest'ultima.
Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni della risposta e determina 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
, a indicare che questo errore è causato dal fatto che il server di backend ha trasmesso intestazioni duplicate per l'intestazione della rispostaExpires
.Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Verifica se stai utilizzando il concatenamento del proxy, ovvero se il server o l'endpoint di destinazione sta richiamando un altro proxy in Apigee.
Per determinare, torna alla fase del server Richiesta inviata al target. Fai clic su Mostra arricciatura.
Si apre la finestra Curl per la richiesta inviata 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 host virtuale, si tratta di un concatenamento dei proxy. In questo caso, devi ripetere tutti i passaggi precedenti per il proxy concatenato fino a determinare la causa effettiva dell'errore
502 Bad Gateway
. - Se l'alias dell'host del server di destinazione rimanda al tuo server di backend, significa che il server di backend sta inviando intestazioni duplicate nella risposta ad Apigee.
NGINX
Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:
- Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave sugli errori HTTP
502
. Controlla i log degli accessi di NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Cerca per vedere se si sono verificati errori
502
durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che continuano a non riuscire con502
. Se riscontri errori
502
con X-Apigee-fault-code corrispondenti al valore diX-Apigee-fault-code , determina il valore di X-Apigee-fault-codeEsempio di errore 502 dal log degli accessi di NGINX:
La voce di esempio sopra riportata dal log di accesso NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:
Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Causa: intestazione duplicata nella risposta
Diagnostica
- Determina il codice di errore e l'origine dell'errore per l'errore osservato utilizzando i log di accesso dell'API Monitoring o NGINX, come spiegato nella sezione Passaggi comuni di diagnosi.
- Se l'Origine dell'errore ha il valore
target
, significa che la risposta inviata dal server di destinazione contiene 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
Tramite il messaggio di errore:
Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento all'
faultstring
.faultstring
contiene il nome dell'intestazione che è 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ù di una volta, come mostrato infaultstring
.
Richiesta effettiva
Tramite la richiesta effettiva:
- Se non hai accesso alla richiesta effettiva inviata al server di destinazione, recupera il comando
curl
corrispondente dai passaggi 10.a e 10.b di Utilizzo dello strumento Trace. Se hai accesso alla richiesta effettiva fatta all'applicazione server di destinazione, segui questi passaggi:
Chiama il server di destinazione.
Esempio di richiesta 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.
Risposta di esempio 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 sopra, l'intestazione
Expires
viene inviata più di una volta. Pertanto, questa richiesta non riesce e restituisce l'errore502 Bad Gateway
e il codice di errore:protocol.http.DuplicateHeader
.Se l'intestazione il cui nome compare nel
faultstring
compare più di una volta nella risposta del server di backend, è questa la causa di questo errore. Nel caso precedente, l'intestazioneExpires
viene inviata più di una volta.
Risoluzione
Correggi duplicazione
Opzione 1 [opzione consigliata] Correggi il server di backend in modo che non includa intestazioni duplicate
- Analizza il motivo per cui il server di backend specifico invia l'intestazione duplicata
Expires
e verifica se i proxy API possono accettarlo. Nella maggior parte dei casi, non sarà auspicabile secondo la specifica HTTP RFC7230. - Se non è desiderabile, modifica l'applicazione server di destinazione in modo che non invii intestazioni duplicate.
Nell'esempio discusso sopra, si nota che l'intestazione
Expires
viene inviata due volte con lo stesso valore, il che non è desiderabile. Puoi risolvere il problema assicurandoti che il server di destinazione passi l'intestazioneExpires
solo una volta. - Se lo ritieni opportuno e vuoi consentire le intestazioni duplicate, vai a Opzione 2 utilizzando la proprietà CwC.
CwC
Opzione 2: utilizzo della proprietà CwC
Apigee fornisce una proprietà CwC
HTTPHeader.<HeaderName>
,che consente alle applicazioni client e ai server di destinazione
di 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 duplicati
e più valori per l'intestazione Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Se sei un utente Private Cloud, puoi configurare la proprietà in modo da impedire ad Apigee Edge di generare un errore
502 Bad Gateway
, anche se la richiesta contiene intestazioni duplicate utilizzando la guida illustrativa sulla 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 questa proprietà per la tua organizzazione.
Specifiche
Apigee risponde con la risposta di errore 502 Bad Gateway
poiché prevede che il
server di backend si comporti in base alle seguenti specifiche RFC:
Specifiche |
---|
RFC 7230, sezione 3.2.2: Ordine dei campi |
RFC 7230, sezione 3.2: campi intestazione |
Se hai ancora bisogno di aiuto dall'Assistenza Apigee, vai a È necessario raccogliere dati diagnostici.
Devi raccogliere dati diagnostici
Raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge.
Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome dell'organizzazione.
- Nome ambiente
- Nome proxy API
- Comando
curl
completo utilizzato per riprodurre l'errore502
- File di traccia per le richieste API
Se sei un utente Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le richieste non riuscite
- Nome ambiente
- Bundle di proxy API
- File di traccia per le richieste API
Log degli accessi NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.
- Log di sistema del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.log