Installer PHP-FPM pour un site
Nginx ne sait pas exécuter PHP : il transmet les requêtes à un service dédié, PHP-FPM. Cette séparation permet de redémarrer PHP sans couper Nginx, de limiter les ressources par pool et d'éviter les fichiers exécutés avec les droits du serveur web. Voici l'installation de PHP 8.4-FPM sur Debian 13, la configuration du socket et le bloc Nginx correspondant.
Installer PHP 8.4
sudo apt update
sudo apt install -y php8.4-fpm php8.4-cli php8.4-mysql
systemctl status php8.4-fpm
ls -l /run/php/Le paquet crée le socket /run/php/php8.4-fpm.sock et le service php8.4-fpm. Installez uniquement les extensions nécessaires (php8.4-curl, php8.4-mbstring, php8.4-xml, php8.4-gd), puis rechargez le service. php -v en ligne de commande utilise le client CLI, pas nécessairement la même configuration que FPM.
Le pool et le socket
/etc/php/8.4/fpm/pool.d/www.conf définit user = www-data, group = www-data et listen = /run/php/php8.4-fpm.sock. Le socket Unix évite d'exposer PHP sur un port TCP. listen.owner, listen.group et listen.mode = 0660 doivent permettre à Nginx, qui tourne aussi sous www-data, d'y accéder.
sudo php-fpm8.4 -t
sudo systemctl reload php8.4-fpmphp-fpm8.4 -t teste la syntaxe de la configuration. Si vous changez listen, adaptez immédiatement le bloc Nginx : un socket absent produit une erreur 502.
Nginx vers PHP-FPM
server {
listen 80;
listen [::]:80;
server_name votre-domaine.fr;
root /var/www/site;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
}
}snippets/fastcgi-php.conf contient notamment try_files et le calcul de SCRIPT_FILENAME. Ne le remplacez pas par une version incomplète. Sans try_files, une URL PHP inexistante peut être transmise à FPM. Validez et rechargez :
sudo nginx -t
sudo systemctl reload nginxPermissions
Les fichiers appartiennent à l'utilisateur de déploiement, avec le groupe www-data. Les dossiers sont en 750, les fichiers en 640. PHP n'a besoin que de lire le code. Un dossier d'uploads doit être accessible en écriture à www-data, mais jamais exécutable.
sudo chown -R deploy:www-data /var/www/site
sudo find /var/www/site -type d -exec chmod 750 {} \;
sudo find /var/www/site -type f -exec chmod 640 {} \;Des permissions 777 ne sont pas une solution : elles ouvrent le code à tous les comptes du serveur.
Tester et dépanner
Créez info.php avec <?php phpinfo();, ouvrez-le, puis supprimez-le immédiatement. Un 502 signifie socket absent, mauvais chemin ou permission ; 403, index ou droits ; 404, racine ou try_files. Consultez /var/log/nginx/error.log, /var/log/php8.4-fpm.log et journalctl -u php8.4-fpm. Vérifiez que www-data peut traverser chaque dossier parent avec namei -l /var/www/site/index.php.
Publicité
Cet article vous a-t-il aidé ?
À lire aussi
- Activer HTTPS avec CertbotObtenir et renouveler un certificat Let's Encrypt avec Certbot et Nginx, puis activer HSTS prudemment.
- Installer et sécuriser RedisInstaller Redis, le limiter à l'écoute locale, ajouter une authentification et sauvegarder ses données.
- Garder une application Node.js en ligne avec PM2Faire tourner une application Node.js sous PM2, la relancer au démarrage et lire ses journaux.