Laravel Herd - Reparar errores 504 - 503 PHP y Nginx
Estaba haciendo unas operaciones en una aplicación en Laravel en modo producción. Como es habitual, en este entorno tengo ocultos los errores, y cualquier problema debería guardarse en un log.
Al realizar cierta operación, siempre se producía un error. Al principio era un 503, y luego se convirtió en un 504, lo cual era extraño porque no se generaba un log asociado.
Y eso es lo primero que debes revisar: si no se genera un log, puede ser que el problema no sea Laravel, sino otro componente, como PHP o el servidor web (Apache o Nginx, dependiendo de tu stack).
En mi caso, estoy utilizando Nginx. Ya más o menos sabía por dónde venía el problema: falta de recursos. A continuación, te explico cómo lo abordé.
Reproducción del error en desarrollo
Decidí replicar la operación en el entorno de desarrollo, donde tengo la ventaja de ver los errores directamente en pantalla.
Mi sorpresa fue que tampoco se generaba ningún log en desarrollo, lo cual reforzaba la hipótesis de que el problema no estaba en Laravel, sino en el servidor o en PHP.
Detectar el problema: operación + Error NO en pantalla/log
Con esa información, lo siguiente era analizar qué operación estaba ejecutando.
En mi caso, estaba generando un libro (como el que estás viendo en pantalla). Todos los libros los genero directamente en producción, donde tengo la data ya saneada.
Normalmente, esos libros tienen entre 400 y 500 páginas. Pero este en particular es un monstruo de 813 páginas, es decir, el doble del tamaño habitual.
Naturaleza del problema: recursos insuficientes
Esto implica dos cosas:
- La operación va a tardar bastante tiempo.
- Es mucho más pesada que las demás y demanda más recursos.
Por lo tanto, ya teníamos una idea más clara de cuál era el problema: una operación intensiva que excede los límites configurados por defecto.
Subir recursos de tiempo y memoria a PHP y nginx
Dado que no había logs generados por Laravel, pero sí un comportamiento anómalo (error 504), el siguiente paso fue revisar los límites configurados en PHP.
En mi caso, uso Laravel Herd, que emplea Nginx, así que el enfoque era un poco distinto a usar Apache.
Lo primero que hice fue aumentar los recursos en el archivo php.ini. Esto es lo típico que se intenta cuando tienes operaciones pesadas:
C:\Users\<user>\.config\herd\bin\php8X
max_execution_time = 600
memory_limit = 1024M
post_max_size = 256M
upload_max_filesize = 256M
¿Cómo accedí al archivo php.ini en Laravel Herd?
En Laravel Herd es muy fácil:
- Vas al icono de PHP en la interfaz.
- Clic derecho sobre la versión activa.
- Seleccionas la opción: "Open php.ini in directory".
Una vez abierto, buscas las líneas correspondientes y las modificas.
Después de hacer esos cambios... no funcionó.
Subir recursos de tiempo y memoria a nginx
Como PHP no resolvió el problema, era momento de mirar más profundo en el servidor.
Pasé a revisar el archivo de configuración de Nginx. En Laravel Herd, esto se encuentra dentro de:
C:\Users\<user>\.config\herd\config\nginx\herd.conf
location / {
rewrite ^ "C:/Program Files/Herd/resources/app.asar.unpacked/resources/valet/server.php" last;
#MIAS
proxy_read_timeout 3000;
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
}
Sin embargo, tampoco funcionó.
Logs de Nginx
Entonces me fui al log del servidor Nginx, que está en:
C:\Users\<user>\.config\herd\Log
Aquí es donde sí encontré información útil. Al revisar el log, me indicaba claramente que era un timeout, lo cual no aparecía en los logs de Laravel:
[error] 616#35124: *1 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: , request: "POST /livewire/update HTTP/1.1", upstream: "fastcgi://127.0.0.1:9084", host: "xx.test", referrer: "http://xx.test/dashboard/books/edit/1"
Copié el mensaje del error y se lo pasé a ChatGPT (aunque también podrías buscarlo en Google).
Esto me ayudó a confirmar que el problema era un timeout, y que los parámetros a modificar no eran solo los del php.ini, sino también los del archivo de configuración de Nginx.
Configuración final que solucionó el problema
Ajusté las siguientes líneas en Nginx:
C:\Users\<user>\.config\herd\config\nginx\herd.conf
location ~ [^/]\.php(/|$) {
***
#MIAS
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
send_timeout 600;
}
Resumen
- Identifica la operación que causa el error.
- Si no hay logs en Laravel, puede ser problema de PHP o del servidor.
- Ajusta primero los parámetros de php.ini: max_execution_time y memory_limit.
- Si no funciona, pasa a revisar los archivos de configuración de Nginx.
- Usa el log del servidor para obtener más pistas.
- Ajusta los timeouts en Nginx si es necesario.
- Siempre comenta tus cambios y haz copias de respaldo antes de modificar archivos críticos.
Acepto recibir anuncios de interes sobre este Blog.
Hablamos sobre como corregir el error de 503 y/o 504 para operaciones costosas y que NO generan Log o errores por pantalla en la app en Laravel.
- Andrés Cruz