¿Cómo aumentar los límites de timeout de PHP-FPM y Nginx?

Publicado 13 de octubre de 2024

Problema: Límites de tiempo de espera en PHP-FPM y Nginx

Los límites de tiempo de espera en PHP-FPM y Nginx pueden causar problemas al procesar scripts largos o manejar cargas de archivos grandes. Estas configuraciones predeterminadas pueden provocar tiempos de espera de conexión, lo que resulta en operaciones incompletas y mensajes de error para los visitantes del sitio web.

Configuración de los ajustes de tiempo de espera de PHP-FPM

Modificación del archivo de configuración de PHP-FPM

El archivo de configuración de PHP-FPM suele estar en /etc/php/[versión]/fpm/php-fpm.conf. Para cambiar los ajustes de tiempo de espera, modifique el parámetro request_terminate_timeout. Este parámetro establece el tiempo máximo que un script puede ejecutarse antes de que PHP-FPM lo detenga.

Para configurar este parámetro:

  1. Abra el archivo de configuración de PHP-FPM con un editor de texto.
  2. Busque la línea request_terminate_timeout.
  3. Establezca el valor en segundos (por ejemplo, request_terminate_timeout = 300 para un tiempo de espera de 5 minutos).
  4. Si la línea no existe, agréguela al archivo.

Consejo: Hacer una copia de seguridad antes de editar

Antes de realizar cambios en su archivo de configuración de PHP-FPM, cree una copia de seguridad. Esto le permite revertir los cambios si es necesario. Utilice este comando:

sudo cp /etc/php/[versión]/fpm/php-fpm.conf /etc/php/[versión]/fpm/php-fpm.conf.backup

Ajuste de la configuración del pool de PHP-FPM

Los pools de PHP-FPM son grupos de procesos PHP que manejan las solicitudes. Cada pool puede tener su propia configuración, incluidos los ajustes de tiempo de espera. Los archivos de configuración del pool suelen estar en /etc/php/[versión]/fpm/pool.d/.

Para modificar los ajustes de tiempo de espera específicos del pool:

  1. Abra el archivo de configuración del pool (a menudo llamado www.conf).
  2. Busque el parámetro request_terminate_timeout.
  3. Establezca el valor en segundos para ese pool específico.
  4. Si el parámetro no existe, agrégelo al archivo.

Configuración de los ajustes de tiempo de espera de Nginx

Configuración del tiempo de espera Fastcgi de Nginx

La directiva fastcgi_read_timeout controla cuánto tiempo espera Nginx a que PHP-FPM procese una solicitud. Esta configuración ayuda a prevenir errores 504 Gateway Timeout cuando los scripts tardan mucho en ejecutarse.

Para configurar fastcgi_read_timeout en Nginx:

  1. Abra su archivo de configuración de Nginx (a menudo en /etc/nginx/nginx.conf o en el directorio /etc/nginx/sites-available/).
  2. Busque el bloque server o location.
  3. Agregue o cambie la directiva fastcgi_read_timeout:
    fastcgi_read_timeout 300s;

    Esto establece el tiempo de espera en 300 segundos (5 minutos).

Consejo: Ajuste el tiempo de espera según los requisitos del script

Considere las necesidades específicas de su aplicación al configurar fastcgi_read_timeout. Para scripts que procesan grandes cantidades de datos o realizan operaciones complejas, es posible que necesite aumentar este valor. Monitoree el rendimiento de su aplicación y ajuste en consecuencia.

Modificación del bloque de servidor de Nginx

Para aplicar los ajustes de tiempo de espera, modifique el bloque de servidor en su configuración de Nginx:

  1. Encuentre el bloque de servidor para su sitio web. Normalmente está en un archivo en /etc/nginx/sites-available/.
  2. Localice el bloque de ubicación de procesamiento PHP, que a menudo se ve así:
    location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
    }
  3. Agregue los ajustes de tiempo de espera a este bloque de ubicación:
    location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_read_timeout 300s;
    }

Implementación de la solución

Guía paso a paso para aumentar los límites de tiempo de espera

Para aumentar los límites de tiempo de espera de PHP-FPM y Nginx, siga estos pasos:

  1. Edite la configuración de PHP-FPM:

    • Abra el archivo de configuración del pool de PHP-FPM (/etc/php/[versión]/fpm/pool.d/www.conf) con un editor de texto.
    • Agregue o cambie el parámetro request_terminate_timeout:
      request_terminate_timeout = 300
    • Guarde el archivo.
  2. Cambie la configuración de Nginx:

    • Abra su archivo de configuración de Nginx (/etc/nginx/nginx.conf o /etc/nginx/sites-available/).
    • Encuentre el bloque de servidor para su sitio web.
    • Agregue o actualice la directiva fastcgi_read_timeout en el bloque de ubicación de procesamiento PHP:
      location ~ \.php$ {
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_read_timeout 300s;
      }
    • Guarde el archivo.
  3. Reinicie los servicios para aplicar los cambios:

    • Reinicie PHP-FPM:
      sudo systemctl restart php7.4-fpm
    • Reinicie Nginx:
      sudo systemctl restart nginx
  4. Pruebe la nueva configuración:

    • Ejecute un script que tarde más que el tiempo de espera predeterminado para asegurarse de que se complete sin errores.
    • Revise sus registros de errores en busca de problemas relacionados con tiempos de espera.

Solución de problemas comunes

Verificación de cambios de configuración

Para comprobar si se han aplicado sus nuevos ajustes:

  1. Verifique la configuración de PHP-FPM:

    • Ejecute php-fpm -tt para probar si hay errores de sintaxis en el archivo de configuración.
    • Use php -i | grep max_execution_time para verificar la configuración del tiempo máximo de ejecución.
  2. Verifique la configuración de Nginx:

    • Ejecute nginx -t para probar si hay errores de sintaxis en la configuración de Nginx.
    • Use el comando curl -I para verificar los encabezados de respuesta y ver si se reflejan los nuevos ajustes de tiempo de espera.

Consejo: Verificar la configuración del pool de PHP-FPM

Para verificar si la configuración de su pool de PHP-FPM es correcta, use el siguiente comando:

php-fpm -d --fpm-config=/etc/php-fpm.d/www.conf

Este comando mostrará cualquier error de configuración en su archivo de pool.

Herramientas de depuración para PHP-FPM y Nginx:

  1. Registros de PHP-FPM:

    • Revise /var/log/php-fpm/error.log para problemas relacionados con PHP-FPM.
    • Habilite el registro lento en la configuración de PHP-FPM para rastrear scripts lentos.
  2. Registros de Nginx:

    • Revise /var/log/nginx/error.log para errores específicos de Nginx.
    • Use nginx-debug para un registro más detallado.
  3. Monitoreo del sistema:

    • Use top o htop para monitorear los recursos del sistema y los procesos de PHP-FPM.
    • Pruebe strace para rastrear llamadas al sistema y señales.

Manejo de problemas persistentes de tiempo de espera

Si los problemas de tiempo de espera persisten, investigue estas áreas:

  1. Consultas de base de datos:

    • Verifique si hay consultas lentas usando el registro de consultas lentas de la base de datos.
    • Optimice los índices de la base de datos y la estructura de las consultas.
  2. Llamadas a API externas:

    • Monitoree los tiempos de respuesta de los servicios externos.
    • Implemente tiempos de espera para las llamadas a API para evitar bloqueos.
  3. Operaciones del sistema de archivos:

    • Verifique si hay E/S de disco lenta usando herramientas como iotop.
    • Considere cambiar a soluciones de almacenamiento más rápidas si es necesario.
  4. Uso de memoria:

    • Monitoree el uso de memoria de PHP con herramientas como New Relic o Blackfire.
    • Aumente el límite de memoria de PHP si los scripts están alcanzando el límite.

Considere escalar el servidor o optimizar el código cuando:

  1. El uso de recursos alcanza constantemente niveles altos.
  2. Las optimizaciones no mejoran el rendimiento.
  3. El crecimiento del tráfico supera la capacidad actual del servidor.

Para la optimización del código:

  • Use herramientas de perfilado para identificar cuellos de botella.
  • Refactorice el código para mejorar la eficiencia.
  • Implemente estrategias de caché para reducir el tiempo de procesamiento.

Para escalar el servidor:

  • Considere el escalado vertical (aumentar los recursos del servidor).
  • Explore el escalado horizontal (agregar más servidores).
  • Investigue soluciones de balanceo de carga para distribuir el tráfico.

Ejemplo: Implementación de caché para mejorar el rendimiento

Para reducir el tiempo de procesamiento y mejorar el rendimiento, implemente el caché de Redis:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = 'user_data_' . $user_id;
$cached_data = $redis->get($key);

if ($cached_data === false) {
    // Datos no en caché, obtener de la base de datos
    $data = fetchUserDataFromDatabase($user_id);

    // Almacenar en caché para uso futuro
    $redis->set($key, serialize($data), 3600); // Caché por 1 hora
} else {
    $data = unserialize($cached_data);
}

Este ejemplo muestra cómo implementar el caché de Redis para almacenar y recuperar datos de usuario, reduciendo la carga de la base de datos y mejorando los tiempos de respuesta.