Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
Sintomo
L'applicazione client riceve un codice di stato HTTP di 502 Bad Gateway con il
codice ECONNRESET come risposta per le chiamate API in Edge Microgateway.
Messaggio di errore
Il client visualizzerà il seguente codice di risposta:
HTTP/1.1 502 Bad Gateway
La risposta includerà il seguente messaggio di errore:
{"message":"socket hang up","code":"ECONNRESET"}Possibili cause
| Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili a |
|---|---|---|
| Timeout keep-alive configurato in modo errato | Timeout keep-alive configurati in modo errato tra Edge Microgateway e il server di destinazione. | Utenti di Edge Public e Private Cloud |
| Il server di destinazione chiude prematuramente la connessione | Il server di destinazione chiude prematuramente la connessione mentre Edge Microgateway invia il payload della richiesta. | Utenti di Edge Public e Private Cloud |
Passaggi di diagnostica comuni
- Controlla i log di Edge Microgateway:
/var/tmp/edgemicro-`hostname`-*.log
- Cerca se sono presenti errori
502con il codiceECONNRESETdurante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che ancora non vanno a buon fine con502.2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test] [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684] [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
- Se il livello di logging è impostato su
warnoinfo, sarà presente anche un messaggio[warn]che include il nome host e la porta del server di destinazione nel secondo elemento. In questo esempio èX.X.X.X:8080, che può essere utilizzato in un secondo momento per acquisire untcpdump.2021-06-23T03:52:24.109Z [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup] [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware] [targetRequest error][GET][][socket hang up][ECONNRESET][395]
- Il codice di errore
[socket hang up][ECONNRESET]indica che il server di destinazione ha chiuso la connessione con Edge Microgateway. Puoi cercare questo codice nei log per determinare la frequenza con cui si verifica.
Causa: timeout keep-alive configurato in modo errato
Diagnosi
- Segui i passaggi descritti in Passaggi di diagnostica comuni e verifica se hai ricevuto l'errore
[socket hang up][ECONNRESET]. In caso affermativo, approfondisci la questione con l'aiuto di
tcpdump, come spiegato di seguito:
Utilizzo di tcpdump
- Acquisisci un
tcpdumptra Edge Microgateway e il server di backend su il sistema operativo host di Edge Microgateway con il seguente comando:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Analizza il
tcpdumpacquisito:Esempio di output di tcpdump: ( visualizza l'immagine più grande)
Nell'esempio di
tcpdumpriportato sopra, puoi vedere quanto segue:- Nel pacchetto 250288, il client invia una
POSTrichiesta. - Nel pacchetto 250371, il server risponde con
200 OK. - Nel pacchetto 250559, il client invia un
ACK. - Nel pacchetto 250560, il server invia il
Continuationmessaggio. - Nel pacchetto 250561, il client invia un
ACK. - Nel pacchetto 262436, il server invia un
FIN, ACKa il client che avvia la chiusura della connessione. Tieni presente che questo pacchetto è stato inviato circa cinque secondi dopo il pacchetto precedente (250561). - Nel pacchetto 262441, il client invia un'altra
POSTrichiesta. Tuttavia, questa richiesta non va a buon fine perché il server ha già avviato la chiusura della connessione. Il server risponde con unRSTnel pacchetto 262441.
In questo esempio, la stessa connessione è stata riutilizzata almeno una volta, ma nella richiesta finale il server avvia la chiusura della connessione dopo cinque secondi di inattività, che coincide con il momento in cui il client ha inviato una nuova richiesta. Ciò suggerisce che il timeout keep-alive del server di backend è molto probabilmente inferiore o uguale a il valore impostato nel client. Per verificare questa ipotesi, consulta Confrontare i timeout keep-alive su Edge Microgateway e sul server di backend.
- Nel pacchetto 250288, il client invia una
Confrontare i timeout keep-alive
- Edge Microgateway non ha una proprietà di timeout keep-alive specifica. È determinato dal sistema operativo su cui è in esecuzione. Esempi comuni sono i container Windows, Linux e Docker.
- È possibile che questa impostazione sia personalizzata nel sistema operativo. Rivolgiti al tuo amministratore di sistema. Per impostazione predefinita, i sistemi operativi Linux hanno un timeout keep-alive predefinito di due ore.
- Poi, controlla la proprietà di timeout keep-alive configurata sul server di backend. Supponiamo che il server di backend sia configurato con un valore di 10 secondi.
- Se determini che il valore del timeout keep-alive sul sistema operativo è
superiore al valore della proprietà di timeout keep-alive sul server di backend, come nell'
esempio precedente, allora questa è la causa degli errori
502.
Risoluzione
Assicurati che la proprietà di timeout keep-alive sia sempre inferiore nel sistema operativo su cui è in esecuzione Edge Microgateway rispetto a quella del server di backend.
- Determina il valore impostato per il timeout keep-alive sul server di backend.
- Configura un valore appropriato per la proprietà di timeout keep-alive nel sistema operativo in modo che sia inferiore al valore impostato sul server di backend seguendo i passaggi applicabili al tuo sistema operativo.
Best practice
È vivamente consigliabile che i componenti downstream abbiano sempre una soglia di timeout keep-alive
inferiore a quella configurata sui server upstream per evitare questo tipo di condizioni di race e
502 errori. Ogni hop downstream deve essere inferiore a ogni hop upstream. In Edge
Microgateway, è buona norma utilizzare le seguenti linee guida:
Il timeout keep-alive dell'applicazione client o del bilanciatore del carico deve essere inferiore al timeout keep-alive di Edge Microgateway.
Per configurare il timeout keep-alive su Edge Microgateway, aggiungi il
keep_alive_timeoutvalore al tuo~/.edgemicro/org-env-config.yamlfile.edgemicro: keep_alive_timeout: 65000
- Il timeout keep-alive del sistema operativo di Edge Microgateway deve essere inferiore al timeout keep-alive del server di destinazione.
- Se hai altri hop davanti o dietro Edge Microgateway, devi applicare la stessa regola. Dovresti sempre lasciare al client downstream la responsabilità di chiudere la connessione con l'upstream.
Causa: il server di destinazione chiude prematuramente la connessione
Diagnosi
- Segui i passaggi descritti in Passaggi di diagnostica comuni e verifica se hai
ricevuto l'errore
[socket hang up][ECONNRESET]. - In caso affermativo, approfondisci la questione con l'aiuto di
tcpdump, come spiegato di seguito.Il messaggio di errore
[targetRequest error][GET][][socket hang up][ECONNRESET]nell'esempio precedente indica che questo errore si è verificato mentre Edge Microgateway inviava la richiesta al server di backend (di destinazione). Ovvero, Edge Microgateway ha inviato la richiesta API al server di backend e stava attendendo la risposta. Tuttavia, il server di backend ha interrotto bruscamente la connessione prima che Edge Microgateway ricevesse una risposta. - Controlla i log del server di backend e verifica se sono presenti errori o informazioni che potrebbero aver portato il server di backend a interrompere bruscamente la connessione. Se trovi errori o informazioni, vai a Risoluzione e correggi il problema in modo appropriato nel server di backend.
- Se non trovi errori o informazioni nel server di backend, raccogli l'
tcpdumpoutput sul server Edge Microgateway:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- Analizza il
tcpdumpacquisito:Esempio di output di tcpdump: ( visualizza l'immagine più grande)
Nell'esempio di
tcpdumpriportato sopra, puoi vedere quanto segue:- Nel pacchetto 4, Edge Microgateway ha inviato una richiesta
GETal server di destinazione. - Nel pacchetto 5, il server di destinazione ha risposto con
ACKper riconoscere la richiesta. - Tuttavia, nel pacchetto 6, anziché rispondere con un payload di risposta, il server di destinazione invia un
FIN, ACKche avvia la chiusura della connessione. - Nei pacchetti 7 e successivi, la connessione viene chiusa reciprocamente. Poiché la connessione è stata
chiusa prima dell'invio della risposta, Edge Microgateway restituirà l'errore HTTP
502al client. - Tieni presente che il timestamp del pacchetto 8,
2021-06-23T03:52:24.110Zcorrisponde al timestamp in cui è stato registrato l'errore nei log di Edge Microgateway logs. I timestamp nei file di log e intcpdumppossono spesso essere utilizzati per correlare gli errori con i pacchetti effettivi.
Risoluzione
Correggi il problema sul server di backend in modo appropriato.
Se il problema persiste e hai bisogno di assistenza per risolvere i problemi
502 Bad Gateway Erroro sospetti che si tratti di un problema all'interno di Edge Microgateway, vai a Informazioni di diagnostica da raccogliere.Informazioni di diagnostica da raccogliere
Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni di diagnostica e contatta l'assistenza Apigee Edge:
- File di log: la cartella predefinita è
/var/tmp, ma può essere sostituita nel fileconfig.yamlprincipale (logging > dir parameter). Ti consigliamo di modificarelog > levelininfoprima di fornire i file di log all'assistenza Apigee. - File di configurazione: la configurazione principale di Edge Microgateway si trova nel
file YAML nella cartella predefinita di Edge Microgateway,
$HOME/.edgemicro. Esiste un file di configurazione predefinito denominatodefault.yamle uno per ogni ambienteORG-ENV-config.yaml. Carica questo file per intero per l'organizzazione e l'ambiente interessati.
- Nel pacchetto 4, Edge Microgateway ha inviato una richiesta