Prevenire il timeout del gateway nginx 504 utilizzando PHP set_time_limit ()


116

Ricevo 504 messaggi di timeout da nginx quando il mio script PHP è in esecuzione più a lungo del solito. set_time_limit(0)non sembra impedirlo! Non funziona quando si esegue php5-fpm su nginx? In caso affermativo, qual è il modo corretto di impostare il limite di tempo?

Errore:

504 Gateway Time-out
nginx/1.2.7

Risposte:


193

Esistono diversi modi in cui è possibile impostare il timeout per php-fpm. In /etc/php5/fpm/pool.d/www.confho aggiunto questa riga:

request_terminate_timeout = 180

Inoltre, /etc/nginx/sites-available/defaultho aggiunto la seguente riga al blocco di posizione del server in questione:

fastcgi_read_timeout 180;

L'intero blocco di posizione ha questo aspetto:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Ora riavvia semplicemente php-fpm e nginx e non dovrebbero esserci più timeout per le richieste che impiegano meno di 180 secondi.


2
nel caso in cui qualcun altro se lo stesse chiedendo, il valore predefinito per il mio (nginx + php5-fpm) era di 60 secondi, quindi se vedi "gateway timeout" per uno script a 60 secondi, dovrebbe essere aggiunta l'impostazione "fastcgi_read_timeout"
Michael Nguyen

1
Ho cercato di capirlo per giorni e la risposta di @pymkin è ciò che ha funzionato per me. Per altri dilettanti come me che si stanno chiedendo come riavviare nginx e php5-fpm, esegui i seguenti due comandi: sudo service nginx restart & sudo service php5-fpm restart L'unica cosa che ho fatto diversamente è che ho applicato queste impostazioni solo a uno di i miei siti Web piuttosto che la configurazione per tutti i siti Web sul mio server.
Pamela

4
Purtroppo, indipendentemente da ciò che ho impostato fastcgi_read_timeoutin quel locationblocco, scade ancora dopo 60 secondi.
Spencer Williams

questa dovrebbe essere la risposta accettata. provato tante soluzioni ma solo questo funziona. Stavo usando Laravel Homestead e ho riscontrato un errore di timeout del gateway 504 e questo lo ha risolto.
Anbu369

Se si utilizza Laravel, è necessario impostarlo nel locationblocco che gestisce gli script php, piuttosto che nel docroot.
Ryan DuVal

50

Prova questo link , ha una soluzione migliore su come risolvere questo problema. Quindi i passaggi sono:

  1. Apri il tuo nginx.conffile che si trova nella /etc/nginxdirectory.
  2. Aggiungi questo pezzo di codice sotto nella http {sezione:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Nota: se è già presente, modificare i valori in base.

  3. Ricarica Nginx e php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Se l'errore persiste, valutare la possibilità di aumentare i valori.


1
Questo non fa trovare la causa, aumenta solo i tempi fino all'errore. Ma sarebbe meglio trovare la soluzione per cui si carica così a lungo. Quando su localhost sono l'unico client e si carica così a lungo, che non va bene aspettare durante lo sviluppo.
Darius.V

16
La domanda non sta chiedendo una causa dello script lento, sta chiedendo un modo per far aspettare il server più a lungo. A volte è necessario eseguire script speciali che eseguono attività che richiedono molto tempo, e non è una cosa negativa.
orrd

Link aggiornato (sopra): codetweet.com/nginx/…
nadavkav

2
Per coloro che potrebbero chiedersi cosa richiederebbe legittimamente così tanto tempo, potrebbe essere ad esempio uno script di installazione da un'interfaccia web che tenta di stabilire una connessione a un database e quindi crea molte tabelle iniziali e lo riempie di dati .. che potrebbe volerci un po 'di tempo prima di una risposta.
imme

Tieni presente che queste impostazioni globali verranno sovrascritte dalle impostazioni per sito in /etc/nginx/sites-available/mysite.com.
Mac

11

Non puoi usare PHP per prevenire un timeout emesso da nginx.

Per configurare nginx per consentire più tempo vedere la proxy_read_timeoutdirettiva .


Questo ha risolto il problema che stavo riscontrando in cui i 504 avrebbero iniziato a comparire sulla mia scatola vagabonda (usando vaprobash).
Andy Fleming il

2
Credo che questa risposta si applichi solo se stai usando Nginx come server proxy. Questo non funzionerebbe se utilizzi Nginx come server web principale (con PHP-FPM).
orrd

10

La risposta corretta è aumentare fastcgi_read_timeout nella configurazione di Nginx.
Semplice come quella!


7
 sudo nano /etc/nginx/nginx.conf

Aggiungi queste variabili al file nginx.conf:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

E poi riavvia:

service nginx reload

4

Ci sono tre tipi di timeout che possono verificarsi in questo caso. Si può vedere che ogni risposta si concentra su un solo aspetto di queste possibilità. Quindi, ho pensato di scriverlo in modo che qualcuno che visiterà qui in futuro non abbia bisogno di controllare a caso ogni risposta e ottenere successo senza sapere quale ha funzionato.

  1. Timeout della richiesta dal richiedente: è necessario impostare l'intestazione del timeout (vedere la configurazione dell'intestazione nella libreria richiedente)
  2. Timeout da nginx durante la richiesta inoltro (prima dell'inoltro al server proxy), ad esempio: file enorme in fase di caricamento
  3. Timeout dopo l'inoltro al server proxy , il server non risponde in tempo nginx. ad esempio: script che richiedono tempo in esecuzione sul server

Quindi le soluzioni per ogni problema sono le seguenti.

  1. imposta l'intestazione del timeout ad esempio: in ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx Client timeout

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. Timeout del server proxy nginx

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Quindi usa quello di cui hai bisogno. Forse in alcuni casi sono necessarie tutte queste configurazioni. Avevo bisogno.


1

È necessario aggiungere una direttiva nginx extra (for ngx_http_proxy_module) nginx.conf, ad esempio:

proxy_read_timeout 300;

Fondamentalmente la proxy_read_timeoutdirettiva nginx cambia il timeout del proxy, FcgidIOTimeoutè per gli script che sono troppo lunghi e silenziosi eFcgidBusyTimeout è per gli script che richiedono troppo tempo per essere eseguiti.

Inoltre, se stai utilizzando l'applicazione FastCGI, aumenta anche queste opzioni:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Quindi ricaricare nginx e PHP5-FPM.

Plesk

In Plesk, puoi aggiungerlo in Impostazioni server web sotto Direttive nginx aggiuntive .

Per FastCGI controllare in Impostazioni server Web in Direttive aggiuntive per HTTP .

Vedi: Come risolvere i problemi di timeout di FastCGI in Plesk?


La FcgidBusyTimeoutvariabile non esiste solo per Apache?
Slavik

0

Dato che stai usando php-fpm dovresti sfruttare fastcgi_finish_request () per elaborare le richieste che sai può richiedere più tempo.


-1

L'uso set_time_limit(0)è inutile quando si usa php-fpm o un gestore di processi simile.

La linea di fondo non è da utilizzare set_time_limitdurante l'utilizzo php-fpm, per aumentare il timeout di esecuzione, controlla questo tutorial .


8
può essere fornita una spiegazione della risposta qui così come questa risposta potrebbe diventare obsoleta se il collegamento scade.
Lakshmi,

-7

Risolvo questo problema con la configurazione APACHE! Tutti i metodi (in questo argomento) non sono corretti per me ... Quindi provo a chanche apache config:

Timeout 3600

Quindi il mio script ha funzionato!


5
La domanda afferma nginx, se hai problemi con Apache dovresti cercarlo.
Hogan,

La domanda è su Nginx e php-fpm non su Apache.
Kevin Kaburu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.