2016-05-17 26 views
5

Ho un servizio distribuito su Amazon Web Services (AWS), in particolare 2 istanze dietro un Elastic Load Balancer (ELB). Le zone di disponibilità sono selezionate come tutte e tre us-west-2a, b, c ma solo 2 delle 3 zone precedenti hanno istanze in esecuzione al suo interno.Errori HTTP 504 restituiti da ELB anche quando gli host sono in buona salute e in grado di servire la richiesta

Il problema è che anche se il traffico/carico non è troppo alto, tuttavia ricevo ancora errori HTTP 504 da ELB abbastanza spesso.

Le linee di registro legge come questa

-1 -1 -1 504 0 0 0

Al fine, --request_processing_time --backend_processing_time --response_processing_time --elb_status_code --backend_status_code --received_bytes --sent_bytes. Description of what each field and response means can be found here

Il tempo di attesa minimo ELB è 60 secondi. KeepAlive è 'On' su istanze di back-end. La latenza delle richieste da parte di ELB è sotto controllo. Ho provato ad aumentare KeepAliveTimeout ma senza successo.

Qualcuno ha qualche idea su come procedere? Non conosco nemmeno la causa principale di questo problema.

PS: Più come una seconda domanda, ci sono alcuni casi (molto meno di 504 restituiti da ELB quando il backend non accetta nemmeno la richiesta) dove anche il backend sta restituendo un 504 e poi ELB sta inoltrando lo stesso a cliente. Per quanto ne so, HTTP 504 dovrebbe essere restituito da un proxy solo quando il back-end sta scadendo. Come può un server stesso restituire un 504?

+0

Puoi condividere le metriche del cloudwatch disponibili su ELB? Inoltre, puoi condividere il tipo di assistenza sanitaria ELB che hai a disposizione e quante istanze sono disponibili su ELB? – Shibashis

+0

Hai 'MaxRequestsPerChild' configurato nell'istanza di _e.g._ Apache?Se la connessione persistente dell'ELB a un'istanza di backend viene interrotta proprio come l'ELB sta usando quella connessione per una richiesta dal client frontend, anche questo può comportare un HTTP 504 visto dal client. – Castaglia

+0

@Shibashis 2 istanze sono allegate a ELB come menzionato nella domanda. È abilitato il monitoraggio dettagliato che arresta Backend_5xx, ELB_5xx, Latenza, HealthyHosts, RequestCount e così via. Healthcheck è una semplice chiamata HTTP con timeout di 5 secondi e frequenza di 10 secondi. – Harshdeep

risposta

6

in modo che possa aiutare gli altri in futuro, sto pubblicando il mio risultato (s) qui:

1) Questo 504 0 errori HTTP sono stati principalmente a causa di logrotate ricaricare Apache invece di riavviare grazioso. L'attuale configurazione AWS fa la seguente

/sbin/service httpd reload > /dev/null 2>/dev/null || true 

quindi sostituire il comando di servizio con la posizione sia apachectl -k graceful o /sbin/service httpd graceful

file a mia istanza EC2: /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.httpd.conf

2) A causa della frequenza logrotate era troppo alto per predefinito in AWS (una volta ogni ora), almeno per il mio caso d'uso, e che a sua volta stava ricaricando apache ogni ora, quindi ho ridotto anche quello.

+0

Quindi, come hai cambiato la configurazione predefinita di Beanstalk per usare 'apachectl -k graceful'? –

+2

@MaartenSander usando icomando_combandi elasticbeanstalk in ebextensions, qualcosa come questo 'comando: sed -i '/ reload/graceful/g'/etc/logrotate.d/logrotate.elasticbeanstalk.httpd.conf'. Ciò avverrà con ogni distribuzione in modo che ogni macchina che entra in seguito alla scalabilità automatica abbia le stesse proprietà. Inoltre, se si aggiorna l'ambiente EBS, il percorso del file potrebbe cambiare da '/ etc/logrotate.d/logrotate.elasticbeanstalk.httpd.conf', pertanto è necessario prestare attenzione quando si aggiorna la versione EBS. – Harshdeep

0

Quando timeout della connessione back-end, ELB inserisce -1 nella colonna backend_processing_time nel proprio registro di accesso. Pensa che quello che sta succedendo è che alcune delle tue richieste impiegano più di 60 secondi per l'elaborazione del tuo back-end. Per confermare questo, puoi verificare le tue metriche di latenza? Si prega di passare al massimo durante la visualizzazione di questa metrica. Confermerà la mia ipotesi se vedi che la latenza raggiunge spesso gli anni '60.

Dopo aver confermato, è possibile che si desideri aumentare il timeout di inattività del proprio ELB e back-end.

+0

come indicato nella domanda, la latenza delle richieste è sotto controllo. Nell'ultimo caso, vedo la massima latenza per l'ELB di soli 3 secondi. – Harshdeep