Problème : Limites de timeout de PHP-FPM et Nginx
Les limites de timeout dans PHP-FPM et Nginx peuvent causer des problèmes lors du traitement de scripts longs ou de gestion de téléchargements de gros fichiers. Ces paramètres par défaut peuvent entraîner des timeouts de connexion, aboutissant à des opérations inachevées et des messages d'erreur pour les visiteurs du site web.
Configuration des paramètres de timeout PHP-FPM
Modification du fichier de configuration PHP-FPM
Le fichier de configuration PHP-FPM se trouve généralement à /etc/php/[version]/fpm/php-fpm.conf
. Pour modifier les paramètres de timeout, modifiez le paramètre request_terminate_timeout
. Ce paramètre définit le temps maximum d'exécution d'un script avant que PHP-FPM ne l'arrête.
Pour définir ce paramètre :
- Ouvrez le fichier de configuration PHP-FPM avec un éditeur de texte.
- Trouvez la ligne
request_terminate_timeout
. - Définissez la valeur en secondes (par exemple,
request_terminate_timeout = 300
pour un timeout de 5 minutes). - Si la ligne est absente, ajoutez-la au fichier.
Conseil: Sauvegarde avant modification
Avant de modifier votre fichier de configuration PHP-FPM, créez une sauvegarde. Cela vous permettra de revenir en arrière si nécessaire. Utilisez cette commande :
sudo cp /etc/php/[version]/fpm/php-fpm.conf /etc/php/[version]/fpm/php-fpm.conf.backup
Ajustement des paramètres du pool PHP-FPM
Les pools PHP-FPM sont des groupes de processus PHP qui gèrent les requêtes. Chaque pool peut avoir sa propre configuration, y compris les paramètres de timeout. Les fichiers de configuration des pools se trouvent généralement dans /etc/php/[version]/fpm/pool.d/
.
Pour modifier les paramètres de timeout spécifiques à un pool :
- Ouvrez le fichier de configuration du pool (souvent nommé
www.conf
). - Trouvez le paramètre
request_terminate_timeout
. - Définissez la valeur en secondes pour ce pool spécifique.
- Si le paramètre est absent, ajoutez-le au fichier.
Configuration des paramètres de timeout Nginx
Définition du timeout Nginx Fastcgi
La directive fastcgi_read_timeout
contrôle le temps d'attente de Nginx pour que PHP-FPM traite une requête. Ce paramètre aide à prévenir les erreurs 504 Gateway Timeout lorsque les scripts prennent du temps à s'exécuter.
Pour définir le fastcgi_read_timeout
dans Nginx :
- Ouvrez votre fichier de configuration Nginx (souvent à
/etc/nginx/nginx.conf
ou dans le répertoire/etc/nginx/sites-available/
). - Trouvez le bloc server ou location.
- Ajoutez ou modifiez la directive
fastcgi_read_timeout
:fastcgi_read_timeout 300s;
Cela définit le timeout à 300 secondes (5 minutes).
Conseil: Ajuster le timeout en fonction des besoins du script
Tenez compte des besoins spécifiques de votre application lors de la définition du fastcgi_read_timeout
. Pour les scripts qui traitent de grandes quantités de données ou effectuent des opérations complexes, vous pourriez avoir besoin d'augmenter cette valeur. Surveillez les performances de votre application et ajustez en conséquence.
Modification du bloc server Nginx
Pour appliquer les paramètres de timeout, modifiez le bloc server dans votre configuration Nginx :
- Trouvez le bloc server pour votre site web. Il se trouve généralement dans un fichier dans
/etc/nginx/sites-available/
. - Localisez le bloc location pour le traitement PHP, qui ressemble souvent à ceci :
location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
- Ajoutez les paramètres de timeout à ce bloc location :
location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 300s; }
Mise en œuvre de la solution
Guide étape par étape pour augmenter les limites de timeout
Pour augmenter les limites de timeout pour PHP-FPM et Nginx, suivez ces étapes :
-
Modifiez la configuration PHP-FPM :
- Ouvrez le fichier de configuration du pool PHP-FPM (
/etc/php/[version]/fpm/pool.d/www.conf
) avec un éditeur de texte. - Ajoutez ou modifiez le paramètre
request_terminate_timeout
:request_terminate_timeout = 300
- Sauvegardez le fichier.
- Ouvrez le fichier de configuration du pool PHP-FPM (
-
Modifiez les paramètres Nginx :
- Ouvrez votre fichier de configuration Nginx (
/etc/nginx/nginx.conf
ou/etc/nginx/sites-available/
). - Trouvez le bloc server pour votre site web.
- Ajoutez ou mettez à jour la directive
fastcgi_read_timeout
dans le bloc location de traitement PHP :location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 300s; }
- Sauvegardez le fichier.
- Ouvrez votre fichier de configuration Nginx (
-
Redémarrez les services pour appliquer les changements :
- Redémarrez PHP-FPM :
sudo systemctl restart php7.4-fpm
- Redémarrez Nginx :
sudo systemctl restart nginx
- Redémarrez PHP-FPM :
-
Testez la nouvelle configuration :
- Exécutez un script qui prend plus de temps que le timeout par défaut pour vous assurer qu'il se termine sans erreur.
- Vérifiez vos logs d'erreur pour tout problème lié au timeout.
Résolution des problèmes courants
Vérification des changements de configuration
Pour vérifier si vos nouveaux paramètres sont appliqués :
-
Vérifiez la configuration PHP-FPM :
- Exécutez
php-fpm -tt
pour tester le fichier de configuration pour les erreurs de syntaxe. - Utilisez
php -i | grep max_execution_time
pour vérifier le paramètre de temps d'exécution maximum.
- Exécutez
-
Vérifiez la configuration Nginx :
- Exécutez
nginx -t
pour tester la configuration Nginx pour les erreurs de syntaxe. - Utilisez la commande
curl -I
pour vérifier les en-têtes de réponse et voir si les nouveaux paramètres de timeout sont reflétés.
- Exécutez
Conseil: Vérifier la configuration du pool PHP-FPM
Pour vérifier si la configuration de votre pool PHP-FPM est correcte, utilisez la commande suivante :
php-fpm -d --fpm-config=/etc/php-fpm.d/www.conf
Cette commande affichera toutes les erreurs de configuration dans votre fichier de pool.
Outils de débogage pour PHP-FPM et Nginx :
-
Logs PHP-FPM :
- Vérifiez
/var/log/php-fpm/error.log
pour les problèmes liés à PHP-FPM. - Activez le slow log dans la configuration PHP-FPM pour suivre les scripts lents.
- Vérifiez
-
Logs Nginx :
- Examinez
/var/log/nginx/error.log
pour les erreurs spécifiques à Nginx. - Utilisez
nginx-debug
pour une journalisation plus détaillée.
- Examinez
-
Surveillance système :
- Utilisez
top
ouhtop
pour surveiller les ressources système et les processus PHP-FPM. - Essayez
strace
pour tracer les appels système et les signaux.
- Utilisez
Gestion des problèmes de timeout persistants
Si les problèmes de timeout persistent, examinez ces domaines :
-
Requêtes de base de données :
- Vérifiez les requêtes lentes en utilisant le log des requêtes lentes de la base de données.
- Optimisez les index de base de données et la structure des requêtes.
-
Appels API externes :
- Surveillez les temps de réponse des services externes.
- Implémentez des timeouts pour les appels API pour éviter les blocages.
-
Opérations sur le système de fichiers :
- Vérifiez les E/S disque lentes à l'aide d'outils comme
iotop
. - Envisagez de passer à des solutions de stockage plus rapides si nécessaire.
- Vérifiez les E/S disque lentes à l'aide d'outils comme
-
Utilisation de la mémoire :
- Surveillez l'utilisation de la mémoire PHP avec des outils comme New Relic ou Blackfire.
- Augmentez la limite de mémoire PHP si les scripts atteignent la limite.
Envisagez la mise à l'échelle du serveur ou l'optimisation du code lorsque :
- L'utilisation des ressources atteint constamment des niveaux élevés.
- Les optimisations n'améliorent pas les performances.
- La croissance du trafic dépasse la capacité actuelle du serveur.
Pour l'optimisation du code :
- Utilisez des outils de profilage pour identifier les goulots d'étranglement.
- Refactorisez le code pour améliorer l'efficacité.
- Implémentez des stratégies de mise en cache pour réduire le temps de traitement.
Pour la mise à l'échelle du serveur :
- Envisagez une mise à l'échelle verticale (augmentation des ressources du serveur).
- Explorez la mise à l'échelle horizontale (ajout de serveurs supplémentaires).
- Examinez les solutions de répartition de charge pour distribuer le trafic.
Exemple: Mise en œuvre du cache pour l'amélioration des performances
Pour réduire le temps de traitement et améliorer les performances, implémentez la mise en cache 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) {
// Données non en cache, récupération depuis la base de données
$data = fetchUserDataFromDatabase($user_id);
// Stockage en cache pour une utilisation future
$redis->set($key, serialize($data), 3600); // Cache pour 1 heure
} else {
$data = unserialize($cached_data);
}
Cet exemple montre comment implémenter la mise en cache Redis pour stocker et récupérer les données utilisateur, réduisant ainsi la charge de la base de données et améliorant les temps de réponse.