Un 504 significa que la página aún se estaba construyendo cuando Nginx dejó de esperar. No se ha caído nada. Algo tardó más de lo que se le permite, y la pregunta honesta es qué.

Encuentra la petición lenta

PHP-FPM escribe un registro de lentitud si se lo pides, y anota la función exacta que se estaba ejecutando cuando se acabó el tiempo. Esa es toda la respuesta: actívalo antes de cambiar cualquier otra cosa.

; in the pool config
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm-slow.log
  1. Recarga PHP-FPM — systemctl reload php8.3-fpm
  2. Reproduce la página lenta — Con una petición basta.
  3. Lee la traza — tail -60 /var/log/php8.3-fpm-slow.log: el marco de arriba es lo que se estaba ejecutando.

Las tres cosas que suele ser

  • Una llamada externa sin tiempo de espera. Una pasarela de pago o una API que ha dejado de responder retendrá tu página mientras el socket siga abierto. Cada petición saliente necesita su propio tiempo de espera, y cinco segundos ya es generoso.
  • Una consulta sin índice. Una tabla que el año pasado era pequeña ya no lo es. El registro de consultas lentas la nombra.
  • Un bucle sobre un directorio. Una carpeta que ha crecido hasta cien mil archivos tarda minutos en listarse.
Subir fastcgi_read_timeout hace desaparecer el error y deja al visitante mirando una pestaña en blanco cinco minutos en vez de uno. Arregla la espera, no el límite.

Cuándo subirlo SÍ es lo correcto

Un solo caso: un trabajo largo y deliberado que has lanzado tú mismo —una migración, una importación grande— en una página que solo usas tú. Súbelo para esa ubicación en concreto, nunca de forma global.

location = /admin/import.php {
    fastcgi_read_timeout 600;
}
Todo lo que pueda disparar un visitante pertenece a una cola. La página inicia el trabajo y responde de inmediato; el trabajo avisa cuando termina.