Optimisation PHP-FPM — Guide de tuning d’un pool

23 avril 2026 — par

Voici un article technique détaillé sur le tuning de PHP-FPM (FastCGI Process Manager), un élément essentiel pour optimiser les performances PHP dans les environnements à charge variable (sites web, applications, API, etc.).

🎯 Objectifs

  • Comprendre le fonctionnement des pools PHP-FPM

  • Ajuster correctement les paramètres de gestion des processus (pm.*)

  • Optimiser l’utilisation CPU et RAM

  • Éviter la saturation ou le sous-emploi des ressources

  • Adapter PHP-FPM selon la charge réelle

📁 Localisation des fichiers de configuration

  • Ubuntu/Debian :
    /etc/php/X.X/fpm/pool.d/www.conf
    (ou un fichier par site/pool personnalisé)

🧠 Rappel : comment fonctionne PHP-FPM ?PHP-FPM gère des processus PHP.

  • Chaque requête PHP (via Apache, Nginx…) est traitée par un processus FPM.

  • Ces processus sont gérés par un pool dont les paramètres sont tuneables.

 

⚙️ Paramètres principaux de tuning (www.conf ou autres pools)

🛠️ 1. pm (Process Manager)

pm = dynamic

Types disponibles :

  • static : nombre fixe de processus (concurrent requis constant)

  • dynamic : s’adapte à la charge (le plus courant)

  • ondemand : ne crée de processus que sur requête

 

🧮 2. Paramètres liés à pm = dynamic

pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
  • pm.max_children : nombre maximal de processus PHP (important)

  • start_servers : nombre de processus au démarrage

  • min_spare_servers / max_spare_servers : fourchette des « processus dormants »

⚠️ Cas critique

Si pm.max_children est trop faible :

  • PHP refuse des connexions → Erreurs 502 / lenteurs

Si pm.max_children est trop élevé :

  • Surcharge mémoire → OOM (Out Of Memory)

🔁 Exemple de tuning pour un site avec charge moyenne (2 Go de RAM)

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

🔁 Exemple de tuning pour un serveur mutualisé avec charge élevée (8 Go RAM)

pm = dynamic
pm.max_children = 80
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

🌱 Exemple pour ondemand (faible trafic)

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

💡 Moins réactif, mais très léger pour de petits sites (admin, landing page…)

📏 Calculer pm.max_children

Étapes :

  1. Lancer un site PHP réel

  2. Observer la mémoire moyenne d’un process PHP-FPM :

ps -ylC php-fpm8.1 --sort:rss | awk '{ SUM += $8 } END { print SUM/NR/1024 " MB" }'

Exemple : chaque process prend 40 Mo

  1. Si serveur = 2 Go RAM, on garde ~1 Go pour le reste :

Disponible pour FPM : 1024 Mo
Processus PHP : 40 Mo chacun

pm.max_children = 1024 / 40 = ~25

Surveillance de la charge PHP-FPM (Apache + Nginx)

Le module status de PHP-FPM vous permet de surveiller en temps réel les processus PHP, la file d’attente, le nombre de connexions, etc.

📍 Étape 1 — Activer pm.status_path dans le pool FPM concerné

Dans /etc/php/8.1/fpm/pool.d/www.conf ou tout autre pool :

pm.status_path = /status

Ensuite, redémarrez PHP-FPM :

sudo systemctl restart php8.1-fpm
🔗 Pour Nginx

Ajoutez cette section dans votre server {} (ex : /etc/nginx/sites-available/default) :

location ~ ^/(status|ping)$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    allow 127.0.0.1;
    deny all;
}
/status : renvoie les stats du pool
/ping : simple "pong" pour vérification de vie

📌 N’oubliez pas de recharger Nginx :

sudo systemctl reload nginx
🔗 Pour Apache
Étape 1 : Activer les modules nécessaires
sudo a2enmod proxy_fcgi setenvif
sudo systemctl reload apache2
Étape 2 : Ajouter un bloc Location dans votre VirtualHost
<VirtualHost *:80>
    ServerName example.local
    DocumentRoot /var/www/html
<Directory /var/www/html> Require all granted </Directory>
<LocationMatch "^/(status|ping)$"> SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/" Require ip 127.0.0.1 </LocationMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
  • On protège /status et /ping via l’adresse IP locale (127.0.0.1)

  • On utilise la connexion par socket Unix au pool PHP-FPM

Recharger Apache :

sudo systemctl reload apache2

✅ Vérification

Depuis le serveur, testez avec :

curl http://127.0.0.1/status

Sortie typique :

pool: www
process manager: dynamic
start time: 29/Jul/2025:12:34:56 +0000
start since: 3600
accepted conn: 2134
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 8
active processes: 2
total processes: 10
max active processes: 4
max children reached: 0
slow requests: 0

🔐 Astuce sécurité : restreindre plus strictement l’accès

Pour Apache :

<LocationMatch "^/(status|ping)$">
    SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
    Require ip 127.0.0.1
    # Ou pour une IP admin :
    # Require ip 192.168.1.10
</LocationMatch>

Pour Nginx : 

allow 127.0.0.1;
# allow 192.168.1.10;
deny all;

 

🧼 Autres options utiles

request_terminate_timeout

request_terminate_timeout = 30s
  • Tuer les scripts PHP qui s’exécutent trop longtemps (défense anti boucle infinie, DoS)

rlimit_files et rlimit_core

rlimit_files = 1024
rlimit_core = 0
  • Limite le nombre de fichiers ouverts par processus

  • Empêche le dump mémoire

php_admin_value[memory_limit]

php_admin_value[memory_limit] = 128M
  • Définir une limite mémoire par pool

📋 Fichier exemple complet de pool www.conf

[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 30
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.status_path = /status

request_terminate_timeout = 30s
rlimit_files = 1024
php_admin_value[memory_limit] = 128M
php_admin_flag[display_errors] = off

 

📊 Outils utiles pour suivre le comportement PHP-FPM

Outil Usage
top, htop Charge système, mémoire
ps, smem RAM par processus PHP
curl /status Charge FPM live
ngxtop, goaccess Suivi des requêtes Nginx/Apache.    
prometheus + exporter.           Monitoring à grande échelle

 

📎 En résumé

Paramètre Utilisation
pm.max_children Nombre max de requêtes PHP simultanées
pm = ondemand Sites très légers ou occasionnels
request_terminate_timeout.            Tue les scripts trop longs
memory_limit Évite la saturation mémoire par script
status_path Suivi live des processus PHP-FPM

 

✅ Conclusion

Un bon tuning PHP-FPM permet de :

  • Gagner en stabilité

  • Réduire la consommation RAM

  • Éviter les goulets d’étranglement

  • S’adapter à la charge réelle

Index complet

Tous les articles (41)

Date Article Tags
07/06/2026 Docker : comment récupérer de l'espace disque cache conteneurs debian 07/06/2026 Graylog 7 — Centralisation et analyse de logs : l'alternative à ELK sur Debian/Ubuntu centralisation debian elk 07/06/2026 OpenZFS : tiering avec L2ARC et SLOG pour les workloads mixtes cache l2arc nvme 07/06/2026 Scripting Bash avancé — pièges, bonnes pratiques et optimisation automatisation bash bonnes-pratiques 07/06/2026 AppArmor sur Debian/Ubuntu : profils, modes et confinement applicatif apparmor audit confinement 07/06/2026 Durcissement SSH — au-delà des clés publiques 2fa authentification cryptographie 27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs