Comment augmenter les limites de timeout de PHP-FPM et Nginx ?

Publié 13 octobre 2024

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 :

  1. Ouvrez le fichier de configuration PHP-FPM avec un éditeur de texte.
  2. Trouvez la ligne request_terminate_timeout.
  3. Définissez la valeur en secondes (par exemple, request_terminate_timeout = 300 pour un timeout de 5 minutes).
  4. 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 :

  1. Ouvrez le fichier de configuration du pool (souvent nommé www.conf).
  2. Trouvez le paramètre request_terminate_timeout.
  3. Définissez la valeur en secondes pour ce pool spécifique.
  4. 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 :

  1. Ouvrez votre fichier de configuration Nginx (souvent à /etc/nginx/nginx.conf ou dans le répertoire /etc/nginx/sites-available/).
  2. Trouvez le bloc server ou location.
  3. 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 :

  1. Trouvez le bloc server pour votre site web. Il se trouve généralement dans un fichier dans /etc/nginx/sites-available/.
  2. 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;
    }
  3. 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 :

  1. 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.
  2. 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.
  3. 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
  4. 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 :

  1. 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.
  2. 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.

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 :

  1. 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.
  2. Logs Nginx :

    • Examinez /var/log/nginx/error.log pour les erreurs spécifiques à Nginx.
    • Utilisez nginx-debug pour une journalisation plus détaillée.
  3. Surveillance système :

    • Utilisez top ou htop pour surveiller les ressources système et les processus PHP-FPM.
    • Essayez strace pour tracer les appels système et les signaux.

Gestion des problèmes de timeout persistants

Si les problèmes de timeout persistent, examinez ces domaines :

  1. 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.
  2. Appels API externes :

    • Surveillez les temps de réponse des services externes.
    • Implémentez des timeouts pour les appels API pour éviter les blocages.
  3. 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.
  4. 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 :

  1. L'utilisation des ressources atteint constamment des niveaux élevés.
  2. Les optimisations n'améliorent pas les performances.
  3. 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.