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:
- Abra el archivo de configuración de PHP-FPM con un editor de texto.
- Busque la línea
request_terminate_timeout. - Establezca el valor en segundos (por ejemplo,
request_terminate_timeout = 300para un tiempo de espera de 5 minutos). - 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:
- Abra el archivo de configuración del pool (a menudo llamado
www.conf). - Busque el parámetro
request_terminate_timeout. - Establezca el valor en segundos para ese pool específico.
- 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:
- Abra su archivo de configuración de Nginx (a menudo en
/etc/nginx/nginx.confo en el directorio/etc/nginx/sites-available/). - Busque el bloque server o location.
- 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:
- Encuentre el bloque de servidor para su sitio web. Normalmente está en un archivo en
/etc/nginx/sites-available/. - 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; } - 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:
-
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.
- Abra el archivo de configuración del pool de PHP-FPM (
-
Cambie la configuración de Nginx:
- Abra su archivo de configuración de Nginx (
/etc/nginx/nginx.confo/etc/nginx/sites-available/). - Encuentre el bloque de servidor para su sitio web.
- Agregue o actualice la directiva
fastcgi_read_timeouten 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.
- Abra su archivo de configuración de Nginx (
-
Reinicie los servicios para aplicar los cambios:
- Reinicie PHP-FPM:
sudo systemctl restart php7.4-fpm - Reinicie Nginx:
sudo systemctl restart nginx
- Reinicie PHP-FPM:
-
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:
-
Verifique la configuración de PHP-FPM:
- Ejecute
php-fpm -ttpara probar si hay errores de sintaxis en el archivo de configuración. - Use
php -i | grep max_execution_timepara verificar la configuración del tiempo máximo de ejecución.
- Ejecute
-
Verifique la configuración de Nginx:
- Ejecute
nginx -tpara probar si hay errores de sintaxis en la configuración de Nginx. - Use el comando
curl -Ipara verificar los encabezados de respuesta y ver si se reflejan los nuevos ajustes de tiempo de espera.
- Ejecute
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:
-
Registros de PHP-FPM:
- Revise
/var/log/php-fpm/error.logpara problemas relacionados con PHP-FPM. - Habilite el registro lento en la configuración de PHP-FPM para rastrear scripts lentos.
- Revise
-
Registros de Nginx:
- Revise
/var/log/nginx/error.logpara errores específicos de Nginx. - Use
nginx-debugpara un registro más detallado.
- Revise
-
Monitoreo del sistema:
- Use
topohtoppara monitorear los recursos del sistema y los procesos de PHP-FPM. - Pruebe
stracepara rastrear llamadas al sistema y señales.
- Use
Manejo de problemas persistentes de tiempo de espera
Si los problemas de tiempo de espera persisten, investigue estas áreas:
-
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.
-
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.
-
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.
- Verifique si hay E/S de disco lenta usando herramientas como
-
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:
- El uso de recursos alcanza constantemente niveles altos.
- Las optimizaciones no mejoran el rendimiento.
- 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.





