La mayor parte del tiempo que se pierde con una avería se va leyendo el registro equivocado. Cada uno responde a una pregunta distinta, y elegir primero el archivo correcto suele hacer rápido todo lo demás.

  • /var/log/nginx/error.log: el servidor web no pudo hacer su trabajo: rechazo aguas arriba, permiso denegado, archivo no encontrado.
  • /var/log/nginx/access.log: qué se pidió y qué se devolvió. Aquí es donde encuentras el CUÁNDO.
  • /var/log/php8.3-fpm.log: procesos que mueren, problemas de pool.
  • el registro de la aplicación: tu propio código. La traza de ejecución vive aquí y en ningún otro sitio.

Míralo mientras reproduces el fallo

tail -f /var/log/nginx/error.log

Deja eso corriendo, carga la página rota y lee lo que aparece. Es el paso de depuración más eficaz que existe, y cuesta diez segundos.

Averigua la forma del problema

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
grep ' 500 ' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head

El primero muestra la mezcla de códigos de estado. El segundo nombra las direcciones que fallan, ordenadas por frecuencia, y una sola dirección suele ser la mayoría.

Acota por tiempo

sed -n '/04\/Sep\/2026:14:0/,/04\/Sep\/2026:14:2/p' access.log | grep ' 50'

La que importa es la primera aparición

Lee el PRIMER error de una ráfaga, no el último. Los posteriores suelen ser consecuencias —una cola que se acumula, un pool de conexiones que se agota— y arreglar una consecuencia no cambia nada.
Si el registro está vacío cuando algo ha fallado claramente, la petición nunca llegó a esa capa. Sal una capa hacia fuera: sin error de PHP, es que Nginx la rechazó; sin entrada de Nginx, es que nunca llegó.