Nginx et PHP-FPM sur Linux
DOG&DEV · 25/01/2025
Nginx et PHP-FPM sur Linux
Nginx et PHP-FPM forment une stack courante pour servir des sites PHP (WordPress, Laravel, etc.) avec de bonnes performances. Ce guide décrit l’installation sur Debian/Ubuntu, la configuration d’un pool PHP-FPM et d’un bloc server Nginx avec fastcgi_pass.
Prérequis
- Debian 11/12 ou Ubuntu 20.04/22.04
- Accès root ou sudo
- Connexion Internet
Installation
sudo apt update
sudo apt install nginx php-fpm
Choisir la version de PHP souhaitée (ex. 8.2) :
sudo apt install php8.2-fpm
Extensions courantes pour PHP :
sudo apt install php8.2-mysql php8.2-xml php8.2-mbstring php8.2-curl php8.2-zip php8.2-gd
Démarrer et activer les services
sudo systemctl enable nginx php8.2-fpm
sudo systemctl start nginx php8.2-fpm
sudo systemctl status nginx php8.2-fpm
Configuration de PHP-FPM (pool)
Fichier type : /etc/php/8.2/fpm/pool.d/www.conf (ou www.conf dans le répertoire de votre version).
- user et group : l’utilisateur sous lequel tourne PHP (souvent
www-data). - listen :
listen = /run/php/php8.2-fpm.sock(socket) oulisten = 127.0.0.1:9000(TCP).
Pour un site dédié, on peut créer un pool séparé (ex. monapp.conf) :
[monapp]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm-monapp.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Puis :
sudo systemctl restart php8.2-fpm
Configuration Nginx : bloc server
Exemple pour un site PHP (document root /var/www/html ou /var/www/monsite) :
server {
listen 80;
server_name monsite.com www.monsite.com;
root /var/www/monsite;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
-
fastcgi_pass :
- socket :
unix:/run/php/php8.2-fpm.sock - TCP :
127.0.0.1:9000
- socket :
-
Pour Laravel :
rootpointe vers le dossierpublicdu projet ettry_filesenvoie tout versindex.php:
root /var/www/monsite/public;
try_files $uri $uri/ /index.php?$query_string;
Placez la config dans /etc/nginx/sites-available/monsite, activez le site et rechargez Nginx :
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Vérification
- Créer un
info.phpdans la racine :<?php phpinfo(); ?>(à supprimer ensuite). - Ouvrir
http://IP_ou_domaine/info.php: la page PHP doit s’afficher.
Dépannage
| Symptôme | Cause possible | Correctif |
|---|---|---|
| 502 Bad Gateway | PHP-FPM arrêté, mauvais fastcgi_pass (socket/port) |
systemctl status php8.2-fpm ; vérifier le chemin du socket ou le port dans la config Nginx |
| 404 sur les routes (Laravel, etc.) | try_files ou root incorrect |
root vers public/ ; try_files ... /index.php?$query_string |
| Fichiers PHP téléchargés | fastcgi_pass non pris en compte pour \.php$ |
Vérifier le location ~ \.php$ et que Nginx a bien été rechargé |
Bonnes pratiques
- Ne pas exposer
phpinfo()en production. - Ajuster pm (PHP-FPM) selon la RAM et la charge.
- Utiliser HTTPS (Let’s Encrypt, reverse proxy) en production.
- Pour WordPress : wordpress-debian13 ; pour Laravel sur un panel : laravel-plesk-website ; pour Froxlor : froxlor-linux.
Ressources
Cet article s’inscrit dans notre série de guides hébergement et gaming. Pour un serveur sur-mesure, contact.