Codice di stato HTTP 504 (Timeout del gateway) - Amazon CloudFront

Codice di stato HTTP 504 (Timeout del gateway)

Un codice di stato HTTP 504 (Timeout del gateway) indica che quando CloudFront ha inoltrato una richiesta all'origine (perché l'oggetto richiesto non era nella cache edge), si è verificato uno dei seguenti eventi:

  • Il server di origine ha restituito un codice di stato HTTP 504 a CloudFront.

  • L'origine non ha risposto prima della scadenza della richiesta.

CloudFront restituirà un codice di stato HTTP 504 nel caso in cui il traffico è bloccato verso l'origine da un firewall o un gruppo di sicurezza, oppure se l'origine non è accessibile tramite Internet. Verifica prima se ci sono questi problemi. Quindi, se il problema non è l'accesso, concentrati sui ritardi delle applicazioni e i timeout dei server per identificare e risolvere i problemi.

Configurazione del firewall sul proprio server di origine in modo da consentire il traffico CloudFront

Se il firewall sul tuo server di origine blocca il traffico CloudFront, esso restituisce un codice di stato HTTP 504, perciò è bene accertarsi che non sia questo il problema prima di verificare la presenza di altri problemi.

Il metodo utilizzato per determinare se si tratta di un problema con il tuo firewall dipende da quale sistema utilizza il tuo server di origine:

Quando valuti la configurazione del firewall sul tuo server di origine, cerca qualsiasi firewall o regola di sicurezza che blocca il traffico dalle edge location CloudFront, in base all'intervallo di indirizzi IP pubblicato.

Se all'intervallo di indirizzi IP CloudFront è consentito connettersi al server di origine, aggiorna le regole di sicurezza dei tuoi server per integrare le modifiche. È possibile eseguire la sottoscrizione a un argomento Amazon SNS e ricevere notifiche quando il file dell'intervallo di indirizzi IP viene aggiornato. Dopo avere ricevuto la notifica, puoi utilizzare il codice per recuperare il file, analizzarlo e apportare le modifiche necessarie per l'ambiente locale. Per ulteriori informazioni, consulta Iscrizione a AWS Modifiche dell’indirizzo IP pubblico tramite Amazon SNS sul AWS News Blog.

Configurazione dei gruppi di sicurezza sul proprio server di origine in modo da permettere il traffico CloudFront

Se il server di origine usa Elastic Load Balancing, analizza i gruppi di sicurezza ELB e accertati che i gruppi di sicurezza consentano il traffico in entrata da CloudFront.

Puoi inoltre utilizzare AWS Lambda per aggiornare automaticamente i gruppi di sicurezza per consentire il traffico in entrata da CloudFront.

Rendere accessibile su Internet il proprio server di origine personale

Se CloudFront non è in grado di accedere al server di origine personalizzato perché non è pubblicamente disponibile su Internet, restituisce un errore HTTP 504.

Le edge location CloudFront si connettono ai server di origine tramite Internet. Se il server di origine personalizzato si trova in una rete privata, CloudFront non è in grado di raggiungerlo. Per questo motivo, non è possibile utilizzare i server privati, tra cui i Classic Load Balancer interni, come server di origine con CloudFront.

Per verificare che il traffico Internet possa connettersi al tuo server di origine, esegui i seguenti comandi (dove OriginDomainName è il nome di dominio del tuo server):

Per il traffico HTTPS:

  • nc -zv OriginDomainName 443

  • telnet OriginDomainName 443

Per il traffico HTTP:

  • nc -zv OriginDomainName 80

  • telnet OriginDomainName 80

Trovare e correggere il ritardo nelle risposte dalle applicazioni sul server di origine

I timeout del server sono spesso il risultato di un tempo di risposta molto lungo da parte di un'applicazione o di un valore di timeout impostato troppo basso.

Una soluzione rapida per evitare errori HTTP 504 è semplicemente quella di impostare un valore di timeout CloudFront più alto per la distribuzione. Tuttavia, ti consigliamo di verificare innanzitutto come risolvere eventuali problemi di prestazioni e latenza con l'applicazione e il server di origine. Quindi puoi impostare un valore di timeout ragionevole che aiuta a prevenire gli errori HTTP 504 e fornisce una buona reattività agli utenti.

Ecco una panoramica delle fasi che puoi eseguire per individuare i problemi di prestazioni e correggerli:

  1. Misura la latenza tipica e a elevato carico (reattività) della tua applicazione Web.

  2. Aggiungi risorse aggiuntive, ad esempio CPU o memoria, se necessario. Adotta altre misure per risolvere i problemi, ad esempio il tuning delle query del database in base a scenari a elevato carico.

  3. Se necessario, regola il valore di timeout per la tua distribuzione CloudFront.

Di seguito sono riportati i dettagli di ciascuna fase.

Misura la latenza tipica e a elevato carico

Per determinare se uno o più server di applicazioni Web back-end riscontri elevata latenza, esegui il seguente comando curl Linux su ciascun server:

curl -w "Connect time: %{time_connect} Time to first byte: %{time_starttransfer} Total time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject

Nota

Se esegui Windows sui server, puoi cercare e scaricare curl per Windows per eseguire un comando simile.

Quando misuri e valuti la latenza di un'applicazione che viene eseguita sul server, tieni presente quanto segue:

  • I valori di latenza sono relativi a ogni applicazione. Tuttavia, un Time to First Byte (Tempo per il primo byte) in millisecondi anziché secondi o più, è più sensato.

  • Se misuri la latenza dell'applicazione sotto carico normale e non presenta problemi, tieni presente che i visualizzatori potrebbero ancora avere timeout sotto carico elevato. Quando la richiesta è elevata, i server possono avere risposte ritardate o non rispondere affatto. Per prevenire problemi di latenza a causa di un elevato carico, verifica le risorse del server, quali CPU, memoria e letture e scritture sul disco per assicurarti che i server abbiano la capacità di dimensionarsi per un carico elevato.

    Puoi eseguire il seguente comando Linux per verificare la memoria utilizzata dai processi Apache:

    watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"

  • L'elevato utilizzo della CPU sul server può ridurre in modo significativo le prestazioni di un'applicazione. Se utilizzi un'istanza Amazon EC2, ad esempio per il server di back-end, rivedi i parametri CloudWatch per il server per verificare l'utilizzo della CPU. Per ulteriori informazioni, consulta la Guida per l'utente di Amazon CloudWatch. Oppure, se utilizzi il tuo server, fai riferimento alla documentazione della Guida del server per istruzioni su come verificare l'utilizzo della CPU.

  • Verifica la presenza di altri potenziali problemi in presenza di carichi elevati, ad esempio query del database che vengono eseguite lentamente in presenza di un elevato volume di richieste.

Aggiungi le risorse e ottimizza i server e i database

Dopo aver valutato la reattività delle applicazioni e dei server, assicurati di disporre di risorse sufficienti per le situazioni di traffico tipiche e a elevato carico:

  • Se disponi di un tuo server, assicurati che abbia CPU, memoria e spazio su disco sufficiente per gestire le richieste del visualizzatore, in base alla tua valutazione

  • Se utilizzi un'istanza Amazon EC2 come server back-end, assicurati che il tipo di istanza disponga delle risorse appropriate per soddisfare le richieste in entrata. Per maggiori informazioni, consulta Tipi di istanza nella Guida per l'utente di Amazon EC2.

Inoltre, considera le seguenti fasi di tuning per evitare timeout:

  • Se il valore Time to First Byte (Tempo per il primo byte) restituito dal comando curl sembra alto, adotta le misure necessarie per migliorare le prestazioni dell'applicazione. Il miglioramento della reattività delle applicazioni contribuirà a sua volta a ridurre gli errori di timeout.

  • Esegui il tuning delle query del database per assicurarti che siano in grado di gestire volumi di richieste elevate senza rallentare le prestazioni.

  • Configura le connessioni keep-alive (persistenti) sul tuo server di back-end. Questa opzione aiuta a evitare le latenze che si verificano quando le connessioni devono essere ristabilite per le richieste o per gli utenti successivi.

  • Se utilizzi ELB come server di origine, scopri in che modo è possibile ridurre la latenza rivedendo i suggerimenti nel seguente articolo del Knowledge Center: Come posso risolvere i problemi di alta latenza sul mio ELB Classic Load Balancer?

Se necessario, regola il valore di timeout di CloudFront

Se hai valutato e risolto rallentamenti di prestazioni delle applicazioni, anomalie nella capacità del server di origine e altri problemi, ma i visualizzatori riscontrano ancora errori HTTP 504, considera la possibilità di modificare il tempo specificato nella distribuzione per il timeout della risposta del server di origine. Per ulteriori informazioni, consulta Timeout di risposta (solo origini personalizzate).