Combien de sites peuvent cohabiter sur un même serveur mutualisé avant qu’un seul d’entre eux, mal codé ou simplement plus fréquenté, ne finisse par ralentir tous les autres ? Sur ce serveur qui héberge six sites WordPress pour une agence, la réponse s’est imposée le jour où un des sites, victime d’une boucle de requêtes mal optimisée après une mise à jour d’extension, a consommé la quasi-totalité des processus PHP disponibles, ralentissant du même coup les cinq autres sites hébergés sur la même machine.
La configuration initiale reposait sur un pool PHP-FPM unique, partagé par l’ensemble des sites du serveur, une pratique fréquente sur les configurations mises en place rapidement, sans anticiper la montée en charge progressive du nombre de projets hébergés.
Le problème d’un pool unique partagé
Avec un seul pool, tous les sites puisent dans la même réserve de processus enfants PHP-FPM. Si un site consomme la totalité des processus disponibles, les autres sites se retrouvent en attente, jusqu’à afficher eux-mêmes des erreurs 502 Bad Gateway, alors que rien ne clochait de leur côté.
; Configuration initiale, un seul pool pour tout le serveur
[www]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm.sock
pm = dynamic
pm.max_children = 20
La solution : un pool PHP-FPM distinct par site
La correction consiste à créer un fichier de configuration de pool séparé pour chaque site, avec son propre socket Unix, ses propres limites de processus, et surtout ses propres réglages PHP ajustés à ses besoins réels :
; /etc/php/7.4/fpm/pool.d/client-boulangerie.conf
[client-boulangerie]
user = client-boulangerie
group = client-boulangerie
listen = /run/php/php7.4-fpm-boulangerie.sock
pm = dynamic
pm.max_children = 6
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[memory_limit] = 256M
php_admin_value[open_basedir] = /home/client-boulangerie/www:/tmp

Le bloc serveur Nginx correspondant doit ensuite être mis à jour pour référencer le socket propre à ce pool, plutôt que le socket partagé utilisé précédemment :
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm-boulangerie.sock;
include fastcgi_params;
}
L’apport de open_basedir et des utilisateurs système distincts
Au-delà de l’isolation des ressources, chaque pool a été associé à un utilisateur système propre au client concerné, avec une directive open_basedir restreignant l’accès aux fichiers du site correspondant uniquement. Cette combinaison limite fortement les conséquences d’une compromission éventuelle d’un site : même en cas d’exécution de code malveillant, l’accès reste cantonné au dossier de ce site précis.
- Un utilisateur système dédié par site, propriétaire exclusif de ses fichiers
open_basedirconfiguré pour interdire toute lecture ou écriture en dehors du dossier du site- Des limites de mémoire et de temps d’exécution ajustées individuellement, selon les besoins réels observés
Un serveur mutualisé maison hébergeant plusieurs sites n’a d’intérêt que si chaque site y est réellement isolé des autres. Un pool PHP-FPM partagé annule une bonne partie des bénéfices attendus d’une telle mutualisation, en réintroduisant un couplage que l’isolation était censée éviter.
Le résultat observé après la mise en place
Lors d’un nouvel incident similaire survenu quelques mois plus tard sur un autre site du même serveur, seul le site concerné a été affecté, atteignant la limite de son propre pool sans consommer la moindre ressource allouée aux cinq autres. Les journaux, désormais séparés par pool, ont également permis d’identifier beaucoup plus rapidement quel site était à l’origine du pic de charge.
Ce que cette isolation coûte en administration
Cette organisation multiplie le nombre de fichiers de configuration à maintenir, et impose une discipline lors de l’ajout d’un nouveau site sur le serveur : créer systématiquement un utilisateur dédié, un pool dédié, et un bloc serveur Nginx référençant le bon socket. Ce coût d’administration reste largement compensé par la réduction du risque qu’un incident isolé sur un site ne se propage à l’ensemble du parc hébergé sur la même machine.