Evite el tiempo de espera de la puerta de enlace nginx 504 usando PHP set_time_limit ()

116

Recibo un mensaje de 504 tiempos de espera de nginx cuando mi script PHP se está ejecutando más de lo habitual. set_time_limit(0)¡No parece evitarlo! ¿No funciona cuando se ejecuta php5-fpm en nginx? Si es así, ¿cuál es la forma correcta de establecer el límite de tiempo?

Error:

504 Gateway Time-out
nginx/1.2.7
Nyxynyx
fuente

Respuestas:

193

Hay varias formas en las que puede establecer el tiempo de espera para php-fpm. En /etc/php5/fpm/pool.d/www.confagregué esta línea:

request_terminate_timeout = 180

Además, /etc/nginx/sites-available/defaultagregué la siguiente línea al bloque de ubicación del servidor en cuestión:

fastcgi_read_timeout 180;

El bloque de ubicación completo se ve así:

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;
} 

Ahora simplemente reinicie php-fpm y nginx y no debería haber más tiempos de espera para las solicitudes que toman menos de 180 segundos.

pymkin
fuente
2
en caso de que alguien más se lo pregunte, el valor predeterminado para el mío (nginx + php5-fpm) era de 60 segundos, por lo que si ve "tiempo de espera de puerta de enlace" para un script a 60 segundos, se debe agregar la configuración "fastcgi_read_timeout"
Michael Nguyen
1
He estado tratando de resolver esto durante días, y la respuesta de @ pymkin es lo que funcionó para mí. Para otros aficionados como yo que se preguntan cómo reiniciar nginx y php5-fpm, ejecute los siguientes dos comandos: sudo service nginx restart y sudo service php5-fpm restart Lo único que hice de manera diferente es que apliqué estas configuraciones solo a uno de mis sitios web en lugar de la configuración de todos los sitios web de mi servidor.
Pamela
4
Lamentablemente, no importa lo que establezca fastcgi_read_timeouten ese locationbloque, aún se agota después de 60 segundos.
Spencer Williams
esta debería ser la respuesta aceptada. Probé tantas soluciones pero solo esto funciona. Estaba usando laravel homestead y tenía un error de tiempo de espera de puerta de enlace 504 y esto lo solucionó.
Anbu369
Si usa Laravel, debe configurar esto en el locationbloque que maneja los scripts php, en lugar de docroot.
Ryan DuVal
50

Pruebe este enlace , tiene una mejor solución sobre cómo solucionar este problema. Entonces los pasos son:

  1. Abra su nginx.confarchivo ubicado en el /etc/nginxdirectorio.
  2. Agregue este código a continuación en la http {sección:

    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: Si ya está presente, cambie los valores según.

  3. Recargue Nginx y php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload
    

    Si el error persiste, considere aumentar los valores.

arp
fuente
1
Esto no hace encontrar la causa, solo aumenta las veces hasta el error. Pero sería mejor encontrar una solución por qué carga tanto tiempo. Cuando estoy en localhost, soy el único cliente y se carga tanto tiempo, que no es nada bueno esperar mientras se desarrolla.
Darius.V
16
La pregunta no es la causa de la lentitud del script, sino una forma de hacer que el servidor espere más. A veces es necesario ejecutar scripts especiales que realizan tareas que llevan mucho tiempo, y eso no es malo.
orrd
Enlace actualizado (arriba): codetweet.com/nginx/…
nadavkav
2
Para aquellos que se estén preguntando qué es lo que legítimamente tomaría tanto tiempo, podría ser, por ejemplo, un script de instalación de una interfaz web que intenta hacer una conexión a una base de datos y luego crea muchas tablas iniciales y las llena con datos. podría tomar bastante tiempo antes de una respuesta.
Imme el
Tenga en cuenta que esta configuración global será anulada por la configuración por sitio en /etc/nginx/sites-available/mysite.com.
Mac
11

No puede usar PHP para evitar un tiempo de espera emitido por nginx.

Para configurar nginx para permitir más tiempo, consulte la proxy_read_timeoutdirectiva .

Bart
fuente
Esto resolvió el problema que estaba experimentando donde los 504 comenzarían a aparecer en mi caja de vagabundos (usando vaprobash).
Andy Fleming
2
Creo que esta respuesta solo se aplica si solo está utilizando Nginx como servidor proxy. Esto no funcionaría si está utilizando Nginx como su servidor web principal (con PHP-FPM).
2016
10

La respuesta correcta es aumentar fastcgi_read_timeout en su configuración de Nginx.
¡Simple como eso!

tfont
fuente
7
 sudo nano /etc/nginx/nginx.conf

Agregue estas variables al archivo nginx.conf:

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

Y luego reiniciar:

service nginx reload
kabus
fuente
4

Hay tres tipos de tiempos de espera que pueden ocurrir en tal caso. Puede verse que cada respuesta se centra en un solo aspecto de estas posibilidades. Entonces, pensé en escribirlo para que alguien que visite aquí en el futuro no necesite verificar al azar cada respuesta y tener éxito sin saber cuál funcionó.

  1. Tiempo de espera de la solicitud del solicitante: es necesario establecer el encabezado de tiempo de espera (consulte la configuración del encabezado en la biblioteca de solicitudes)
  2. Tiempo de espera de nginx mientras se realiza la solicitud (antes de reenviar al servidor proxy), por ejemplo: Se está cargando un archivo enorme
  3. Tiempo de espera después del reenvío al servidor proxy , el servidor no responde nginx a tiempo. Ej .: Scripts que consumen mucho tiempo que se ejecutan en el servidor

Entonces, las soluciones para cada problema son las siguientes.

  1. establecer encabezado de tiempo de espera, por ejemplo: en 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. tiempo de espera del cliente nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
    
  2. tiempo de espera del servidor proxy nginx

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

Entonces usa el que necesites. Quizás, en algunos casos, necesite todas estas configuraciones. Lo necesitaba.

Gayan Kavirathne
fuente
1

Debe agregar una directiva nginx adicional (para ngx_http_proxy_module) en nginx.conf, por ejemplo:

proxy_read_timeout 300;

Básicamente, la proxy_read_timeoutdirectiva nginx cambia el tiempo de espera del proxy, FcgidIOTimeoutes para scripts que son silenciosos durante demasiado tiempo y FcgidBusyTimeoutes para scripts que tardan demasiado en ejecutarse.

Además, si está utilizando la aplicación FastCGI, aumente también estas opciones:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Luego recargue nginx y PHP5-FPM.

Plesk

En Plesk, puede añadirlo en Configuración del servidor Web bajo directivas nginx adicionales .

Para FastCGI, verifique la Configuración del servidor web en Directivas adicionales para HTTP .

Consulte: ¿Cómo solucionar problemas de tiempo de espera de FastCGI en Plesk?

Kenorb
fuente
¿No FcgidBusyTimeoutexiste la variable solo para Apache?
Slavik
0

Dado que está utilizando php-fpm, debe aprovechar fastcgi_finish_request () para procesar las solicitudes que sabe que pueden demorar más.

Kate
fuente
-1

Usar set_time_limit(0)es inútil cuando se usa php-fpm o un administrador de procesos similar.

La conclusión es que no se debe usar set_time_limitcuando se usa php-fpm, para aumentar el tiempo de espera de ejecución, consulte este tutorial .

pangkalizer
fuente
8
Puede proporcionar una explicación de la respuesta aquí, así como esta respuesta puede volverse obsoleta si el enlace caduca.
Lakshmi
-7

¡Resuelvo este problema con config APACHE! Todos los métodos (en este tema) son incorrectos para mí ... Luego intento cambiar la configuración de apache:

Timeout 3600

¡Entonces mi guión funcionó!

NeuroZ
fuente
5
La pregunta dice nginx, si tiene problemas con apache, debe buscarlo.
hogan
La pregunta está en Nginx y php-fpm, no en Apache.
Kevin Kaburu