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 è verificata una delle seguenti situazioni:
-
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.
Argomenti
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:
-
Se utilizzi un firewall IPTable su un server Linux, puoi cercare strumenti e informazioni per lavorare meglio con IPTables.
-
Se utilizzi Windows Firewall su un server Windows, consulta Add or Edit Firewall Rule (Aggiungere o modificare una regola del firewall)
nella documentazione Microsoft.
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. Per ulteriori informazioni, consulta Ubicazioni e intervalli di indirizzi IP dei server edge di CloudFront.
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
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 server di origine, esegui i seguenti comandi (dove OriginDomainName è il nome di dominio del server):
Per il traffico HTTPS:
-
nc -zv
OriginDomainName443 -
telnet
OriginDomainName443
Per il traffico HTTP:
-
nc -zv
OriginDomainName80 -
telnet
OriginDomainName80
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:
-
Misura la latenza tipica e a elevato carico (reattività) della tua applicazione Web.
-
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.
-
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 "DNS Lookup Time: %{time_namelookup} \nConnect time: %{time_connect} \nTLS Setup: %{time_appconnect} \nRedirect Time: %{time_redirect} \nTime to first byte: %{time_starttransfer} \nTotal 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 Elastic Load Balancing come origine, le seguenti sono le possibili cause di un errore 504:
-
Il bilanciatore del carico non è in grado di stabilire una connessione con la destinazione prima dello scadere del timeout della connessione (10 secondi).
-
Il bilanciatore del carico ha stabilito una connessione con la destinazione, ma la destinazione non ha risposto prima dello scadere del timeout di inattività.
-
La lista di controllo degli accessi alla rete (ACL) nella sottorete non ha consentito il traffico dalle destinazioni ai nodi del bilanciatore del carico sulle porte temporanee (1024-65535).
-
La destinazione ha restituito un'intestazione content-length più grande del corpo dell'entità. Il bilanciatore del carico è scaduto in attesa di byte mancanti.
-
La destinazione è una funzione Lambda e Lambda non ha risposto prima della scadenza del timeout della connessione.
Per ulteriori informazioni sulla riduzione della latenza, consulta Come posso risolvere i problemi di latenza elevata sul mio ELB Classic Load Balancer?
-
-
Se utilizzi MediaTailor come origine, le seguenti sono le possibili cause di un errore 504:
-
Se gli URL relativi vengono gestiti in modo errato, MediaTailor può ricevere URL non corretti dai lettori.
-
Se MediaPackage è l’origine del manifesto per MediaTailor, gli errori 404 del manifesto di MediaPackage possono causare la restituzione di un errore 504 da parte di MediaTailor.
-
La richiesta al server di origine MediaTailor richiede più di 2 secondi per essere completata.
-
-
Se utilizzi Gateway Amazon API come origine, le seguenti sono le possibili cause di un errore 504:
-
Una richiesta di integrazione richiede più tempo rispetto al parametro di timeout massimo di integrazione della REST API di Gateway API. Per ulteriori informazioni, consulta Come posso risolvere gli errori di timeout con codice di stato HTTP 504 di Gateway API?
-
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.