Installer PHP-FPM pour un site

2 min de lecture07 novembre 2026

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

Bash
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.

Bash
sudo php-fpm8.4 -t
sudo systemctl reload php8.4-fpm

php-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

Nginx
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 :

Bash
sudo nginx -t
sudo systemctl reload nginx

Permissions

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.

Bash
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