PHP-FPM (FastCGI Process Manager) est la méthode standard pour exécuter PHP sur des serveurs web modernes. Une configuration PHP-FPM bien faite peut faire la différence entre un site lent et un site rapide. Chez Theory7, nous constatons régulièrement que les configurations par défaut ne sont pas optimales pour la charge de travail spécifique. Dans ce guide, vous apprendrez à configurer PHP-FPM correctement.

Qu'est-ce que PHP-FPM ?

PHP-FPM gère un pool de processus de travail PHP. Lorsqu'une page PHP est demandée, l'un de ces travailleurs traite la requête. La manière dont les travailleurs sont gérés détermine en grande partie les performances.

Avantages de PHP-FPM :

  • Meilleure gestion des ressources que mod_php
  • Isolation des processus par site web possible
  • Redémarrages gracieux sans temps d'arrêt
  • Options de journalisation avancées

Configuration du pool

La configuration du pool détermine combien de processus PHP sont en cours d'exécution. Ce fichier se trouve généralement à :

/etc/php/8.2/fpm/pool.d/www.conf

Remplacez 8.2 par votre version PHP.

Modes du gestionnaire de processus

PHP-FPM a trois modes :

static - Nombre fixe de travailleurs

pm = static
pm.max_children = 20

Meilleur pour les serveurs dédiés avec une charge prévisible.

dynamic - Mise à l'échelle automatique

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Meilleur pour la plupart des situations.

ondemand - Travailleurs uniquement lors des requêtes

pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s

Meilleur pour les serveurs avec peu de trafic ou une mémoire limitée.

Calcul de max_children

La valeur max_children dépend de votre mémoire disponible :

max_children = (RAM disponible - Autre utilisation) / Taille moyenne du processus PHP

Exemple de calcul :

  • Serveur 4 Go RAM
  • 1 Go pour OS et base de données
  • Taille moyenne du processus PHP : 50 Mo
  • max_children = 3000 Mo / 50 Mo = 60

Vérifiez l'utilisation moyenne de la mémoire par processus PHP :

ps --no-headers -o "rss" -C php-fpm | awk '{ sum+=$1 } END { print sum/NR/1024 " Mo" }'

Limites de requêtes

Évitez les fuites de mémoire en rafraîchissant périodiquement les processus :

pm.max_requests = 500

Après 500 requêtes, un travailleur est redémarré. Cela évite la croissance de la mémoire due à un code mal écrit.

Optimisation de php.ini

En plus de la configuration du pool, le php.ini est également important.

Limites de mémoire et d'exécution

memory_limit = 256M
max_execution_time = 300
max_input_time = 300

Adaptez ces valeurs à votre application. WordPress nécessite souvent 256 Mo, les grandes importations en nécessitent plus.

Limites de téléchargement

upload_max_filesize = 64M
post_max_size = 64M
max_file_uploads = 20

post_max_size doit être égal ou supérieur à upload_max_filesize.

Configuration d'OPcache

OPcache stocke le code PHP compilé en mémoire :

opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.validate_timestamps = 1
opcache.fast_shutdown = 1

Pour la production, vous pouvez mettre validate_timestamps à 0 pour plus de rapidité, mais vous devrez vider OPcache manuellement lors des modifications de code.

Cache de chemin réel

realpath_cache_size = 4M
realpath_cache_ttl = 600

Cela réduit les appels au système de fichiers pour les instructions include/require.

Appliquer la configuration

Après les modifications, vous devez redémarrer PHP-FPM :

# Systemd
sudo systemctl restart php8.2-fpm

Ou pour d'autres versions

sudo systemctl restart php7.4-fpm

Testez si la configuration est valide :

sudo php-fpm8.2 -t

Plusieurs pools pour plusieurs sites

Pour une meilleure isolation, vous pouvez créer un pool séparé par site web :

sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/monsite.conf

Modifiez dans monsite.conf :

[monsite]
user = monuser
group = monuser
listen = /run/php/php8.2-fpm-monsite.sock

Configurez votre serveur web pour utiliser le bon socket par site.

Surveiller l'état de PHP-FPM

Activez la page d'état pour le monitoring :

pm.status_path = /fpm-status

Configurez votre serveur web pour la servir (uniquement local) :

location /fpm-status {
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    include fastcgi_params;
    allow 127.0.0.1;
    deny all;
}

Dépannage

502 Bad Gateway

PHP-FPM ne fonctionne pas ou le socket est mal configuré.

sudo systemctl status php8.2-fpm

Performances lentes

Vérifiez si max_children est trop bas :

sudo tail -f /var/log/php8.2-fpm.log

Cherchez "server reached max_children".

Erreurs de mémoire

Augmentez memory_limit ou optimisez votre code.

Articles connexes

Besoin d'aide ?

Nous sommes là pour vous ! Vous rencontrez un problème ou avez des questions ? Notre équipe de support est prête à vous aider personnellement. Envoyez-nous un message via le système de tickets - nous répondons généralement dans quelques heures et sommes heureux de vous aider.