Retourner sur le site

Optimiser PHP-FPM

Réglez les pools PHP-FPM sur VPS HolyCloud : pm dynamic, mémoire, slowlog, OPcache et intégration Nginx ou Apache.

Optimiser PHP-FPM

PHP-FPM (FastCGI Process Manager) exécute PHP en processus séparés du serveur web, ce qui améliore stabilité et performances sur un VPS Linux HolyCloud. Ce guide ajuste le pool www, la gestion dynamique des workers, OPcache, les slow logs et l'intégration avec Nginx ou Apache.

Prérequis

  • VPS HolyCloud avec PHP-FPM installé (php8.2-fpm ou php8.3-fpm)
  • Serveur web Nginx ou Apache déjà configuré pour passer les .php au socket FPM
  • Connaissance approximative de la RAM disponible (free -h)
  • Accès sudo
  • Site de test ou trafic réel pour valider les réglages

Conseil : estimez ~30–80 Mo RAM par worker PHP selon votre application ; ne dépassez pas la RAM physique.

Étape 1 : identifier la version et le pool

php -v
systemctl status php8.2-fpm 2>/dev/null || systemctl status php8.3-fpm
ls /etc/php/
ls /run/php/

Fichier pool par défaut (adaptez la version) :

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

Sauvegarde :

sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/www.conf.bak.$(date +%F)

Étape 2 : mode pm et nombre de workers

Dans [www] :

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500

Formule indicative pour pm.max_children :

max_children ≈ (RAM disponible pour PHP) / mémoire moyenne par requête

Mesurer la mémoire d'un script :

ps -o rss,cmd -C php-fpm8.2 | head -10

Petit VPS 2 Go (site WordPress léger) :

pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 4

Étape 3 : slowlog et timeouts

sudo nano /etc/php/8.2/fpm/pool.d/www.conf
request_slowlog_timeout = 5s
slowlog = /var/log/php8.2-fpm-slow.log
request_terminate_timeout = 120s
sudo touch /var/log/php8.2-fpm-slow.log
sudo chown www-data:www-data /var/log/php8.2-fpm-slow.log

Étape 4 : OPcache (production)

sudo nano /etc/php/8.2/mods-available/opcache.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0

validate_timestamps=0 maximise les perfs mais exige un reload FPM après déploiement de code :

sudo systemctl reload php8.2-fpm

En développement, gardez validate_timestamps=1.

Étape 5 : php.ini — limites raisonnables

sudo nano /etc/php/8.2/fpm/php.ini
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
realpath_cache_size = 4096k

Étape 6 : intégration Nginx (extrait)

sudo nano /etc/nginx/sites-available/exemple.fr
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_read_timeout 120;
}
sudo nginx -t && sudo systemctl reload nginx

Étape 7 : status et ping (monitoring local)

Dans www.conf (restreindre à localhost) :

pm.status_path = /fpm-status
ping.path = /fpm-ping

Nginx :

location ~ ^/(fpm-status|fpm-ping)$ {
    access_log off;
    allow 127.0.0.1;
    deny all;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
curl http://127.0.0.1/fpm-ping
curl http://127.0.0.1/fpm-status?full
sudo systemctl restart php8.2-fpm

Vérification

php -i | grep -E 'opcache.enable|memory_limit'
ps aux | grep php-fpm | wc -l
free -h
ab -n 100 -c 10 http://127.0.0.1/ 2>/dev/null | tail -5

Sous charge, la RAM ne doit pas saturer (dmesg | grep -i oom) et les temps de réponse restent stables.

Besoin d'aide HolyCloud

  • 502 Bad Gateway : socket FPM incorrect (ls /run/php/), service FPM arrêté
  • Workers saturés : augmentez pm.max_children ou optimisez le code ; vérifiez slowlog
  • OPcache ne se met pas à jour : reload FPM ou validate_timestamps=1
  • Support HolyCloud : free -h, extrait www.conf, tail slowlog, version PHP