Un error 504 Gateway Timeout en Nginx significa que el servidor que ejecuta Nginx no pudo recibir una respuesta del servidor proxy dentro del período de tiempo especificado. Esto suele ocurrir porque el servidor proxy no puede procesar la solicitud dentro del tiempo especificado o por problemas de conexión entre Nginx y el servidor proxy.
El error se produce cuando el servidor Nginx se está ejecutando en modo proxy. Esto ocurre cuando se utiliza php-fpm o Apache. Si lo traducimos del inglés al ruso, obtendremos lo siguiente: se ha superado el tiempo de espera de una respuesta del servidor.
Varias razones para este comportamiento:
Ahora vamos a hablar de lo que puede hacer y cómo solucionar el error 504 Gateway Timeout.
Lo primero que debes intentar en la práctica es que si a tu servidor, php-fpm o apache le faltan recursos del sistema, como memoria o CPU, ve la RAM libre
usando el comando free:
$ free -h
Puedes averiguar la carga de CPU con el comando htop
:
$ htop
Si ves que PHP está ocupando todo el tiempo de CPU, significa que el problema está en los recursos del servidor. Usted puede tratar de lidiar con el motor del sitio, optimizar el recurso o elegir un potente servidor VPS.
La segunda opción - si estaba previsto para que el script funcionó durante mucho tiempo. En este caso, es necesario configurar Nginx para esperar una respuesta de Apache o php-fpm. Para resolver el problema en el caso de php-fpm, sólo tiene que añadir dos líneas al bloque de configuración fastgci:
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
300 significa 300 segundos, para la mayoría de los scripts, esto es suficiente, pero tampoco es difícil establecer más si es necesario. También el error 504 puede ocurrir cuando Nginx es usado como proxy para Apache o cualquier otro servidor web, entonces también necesitas configurar el tiempo de espera para el proxy.
Añade estas líneas a la sección del servidor
:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
En este caso tenemos un tiempo de espera de 600 segundos.
Ahora necesitamos reiniciar Nginx:
$ sudo systemctl restart nginx
Otra razón y su solución si el script se cuelga. Si ejecutas el script tú mismo, verás inmediatamente lo que se cuelga, pero si los usuarios encuentran un error de este tipo, es un problema más serio. Usted puede ver si sus usuarios están encontrando tales errores y dónde ocurren usando el comando:
$ fgrep -i " 504 " /var/log/nginx/access.log
A veces se puede ver información más detallada en error.log
:
$ fgrep -i " 504 " /var/log/nginx/error.log
Además, si php-fpm es el problema, puede rastrear qué scripts se están ejecutando lentamente usando la función slow-log
incorporada.
Para activarla, añada las siguientes líneas a la configuración de su pool:
$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Esto completa la instrucción.