Un errore 504 Gateway Timeout in Nginx significa che il server che esegue Nginx non è stato in grado di ricevere una risposta dal server proxy entro il periodo di tempo specificato. Di solito questo accade perché il server proxy non è in grado di elaborare la richiesta entro il tempo specificato o a causa di problemi di connessione tra Nginx e il server proxy.
L'errore si verifica quando il server Nginx funziona in modalità proxy. Questo accade quando si utilizza php-fpm o Apache. Se lo traduciamo dall'inglese al russo, otteniamo quanto segue: il tempo di attesa per una risposta dal server è stato superato.
Le ragioni di questo comportamento sono molteplici:
Vediamo ora cosa si può fare e come risolvere l'errore 504 Gateway Timeout.
La prima cosa da provare in pratica è che se il vostro server, php-fpm o apache manca di risorse di sistema, come la memoria o la CPU, vedete la RAM libera
usando il comando free:
$ free -h
È possibile conoscere il carico della CPU con il comando htop
:
$ htop
Se si nota che PHP occupa tutto il tempo della CPU, significa che il problema riguarda le risorse del server. Si può cercare di intervenire sul motore del sito, ottimizzare le risorse o scegliere un server VPS potente.
La seconda opzione - se è stata pianificata in modo che lo script funzionasse per molto tempo. In questo caso, è necessario configurare Nginx per attendere una risposta da Apache o da php-fpm. Per risolvere il problema nel caso di php-fpm, è sufficiente aggiungere due righe al blocco di configurazione di fastgci:
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 significa 300 secondi, per la maggior parte degli script è sufficiente, ma non è difficile impostarne di più se necessario. L'errore 504 può verificarsi anche quando Nginx è usato come proxy per Apache o qualsiasi altro server web, quindi è necessario configurare anche il timeout del proxy.
Aggiungere queste righe alla sezione server
:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
In questo caso abbiamo un timeout di 600 secondi.
Ora è necessario riavviare Nginx:
$ sudo systemctl restart nginx
Un altro motivo e la sua soluzione se lo script si blocca. Se si esegue lo script da soli, si vedrà subito cosa si blocca, ma se questo errore viene riscontrato dagli utenti, il problema è più serio. Potete vedere se i vostri utenti stanno incontrando tali errori e dove si verificano utilizzando il comando:
$ fgrep -i " 504 " /var/log/nginx/access.log
Informazioni più dettagliate possono essere viste in error.log
:
$ fgrep -i " 504 " /var/log/nginx/error.log
Inoltre, se il problema è php-fpm, è possibile individuare quali script vengono eseguiti lentamente utilizzando la funzione slow-log
integrata.
Per attivarla, aggiungere le seguenti righe alla configurazione del pool:
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Questo completa l'istruzione.