Resolver Error 504 Gateway Timeout en Nginx

Error 504 Gateway timeout en Nginx

El error 504 gateway timeout en nginx viene causado porque el servidor HTTP envía una petición a un backend (generalmente PHP) y no obtiene una respuesta dentro de un tiempo predeterminado.

Esto suele deberse a que estamos pidiendo al backend que realice una operacion que lleva demasiado tiempo.

Error 504 Gateway Timeout Nginx

Como se presenta el error 504 gateway timeout

En algunos servidores web podemos encontrarnos con el error 504 Gateway timeout representado de las siguentes maneras:

  • 504 Gateway Time Out
  • HTTP 504 Timeout
  • 504 Gateway timed out
  • Error HTTP 504
  • HTTP 504 Nginx
  • 504 Timeout
  • HTTP Timeout Nginx

En realidad todos estos mensajes de error corresponden al mismo problema. Nginx tiene configurado un tiempo predeterminado para esperar por la respuesta del backend y no le está llegando a tiempo.

Como solucionar el error 504 Gateway Timeout en Nginx

Hay varios aspectos que podemos comprobar antes de cambiar la configuración de nuestro servidor para solucionar el error 504:

¿Esta saturado el servidor?

Si nuestro servidor está saturado puede tardar demasiado en responder desde el backend y causar los errores 504 gateway timeout.

¿Está bien el código que ejecutamos?

Si tenemos acceso al código que se ejecuta, deberíamos revisar que esté escrito de forma óptima. A veces realizar una misma cosa de distintas maneras puede hacer que se multiplique el tiempo de ejecución.

Error HTTP 504 con Nginx y PHP-FPM

Una vez comprobados los dos puntos anteriores, podemos comenzar a revisar la configuración de varios puntos en el servidor.

Cambiar el timeout de Nginx en la configuracion del site

Una cosa que debemos hacer para solucionar el error HTTP 504 es dar más tiempo al backend para responder. Para ello, editaremos la definición del sitio web nginx y añadiremos el parámetro fastcgi_read_timeout con el numero de segundos que deseamos esperar por una respuesta por parte del backend.

location ~ ^/*.php 
{
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  if (!-f $document_root$fastcgi_script_name) 
  {
    return 404;
  }
  include fastcgi_params;
  fastcgi_param HTTPS on;
  fastcgi_index index.php;
  fastcgi_pass unix:/var/run/php5-fpm.sock;
  fastcgi_read_timeout 300;
}

Cambiar el tiempo de ejecución máximo en PHP-FPM

Otra de las causas de que no se terminen de ejecutar las peticiones desde nginx al backend, generando errores HTTP 504 de gateway timeout es que el backend tenga algún límite de tiempo de ejecución. En el caso de PHP-FPM, por ejemplo, podemos ajustar el tiempo máximo de ejecución del código PHP mediante las siguientes configuraciones:

request_terminate_timeout dentro del archivo /etc/php5/fpm/pool/www.conf/etc/php7/fpm/pool/www.conf

request_terminate_timeout = 300

max_execution_time dentro del archivo /etc/php5/fpm/php.ini/etc/php7/fpm/php.ini

max_execution_time = 300

Ambos valores deberían tener el mismo valor.

Error HTTP 504 Gateway time out usando nginx como proxy

El error HTTP 504 tambien puede darse en los casos en que usamos nginx como un proxy para servir contenido desde otro servidor HTTP que actúa de backend. Este modo de funcionamiento se llama Proxy y deberemos ajustar los siguientes valores de configuración del site:

 proxy_connect_timeout 300;
 proxy_send_timeout 300;
 proxy_read_timeout 300;
 send_timeout 300;

Los valores que se especifican en estas configuraciones de nginx y php siempre se refieren a segundos. No son valores que seguir al pie de la letra. Ajusta los números a tu entorno.

Como recomendación final, si eres el responsable del código que tarda tanto en ejecutarse, considera segmentarlo para que no tenga una ejecución tan larga. También puedes ir dando actualizaciones de estado al servidor HTTP para que el usuario final pueda ver el progreso de la operación.

 

Puedes leer más sobre los codigos de estado HTTP en la pagina de W3.org