Déploiement d'une Stack Web Performante : Nginx & PHP 8.2 FPM
Ce guide vous accompagne dans l'installation d'un environnement serveur robuste et sécurisé sur un VPS, idéal pour héberger des frameworks modernes comme Laravel, Symfony ou des CMS tels que WordPress.
🎯 Objectifs de la configuration
- Serveur Web : Nginx (performances élevées pour les connexions simultanées).
- Moteur PHP : PHP 8.2 via FPM (FastCGI Process Manager).
- Sécurité : HTTPS via Let's Encrypt, pare-feu UFW et protection contre le brute-force.
- Optimisation : Cache statique et gestion propre des droits d'accès.
📋 Prérequis
- Un serveur sous Debian 12 ou Ubuntu 22.04+.
- Accès SSH avec privilèges
sudo. - Un nom de domaine dont l'enregistrement "A" pointe vers l'IP de votre serveur.
Étape 1 : Préparation et installation de Nginx
Commencez par rafraîchir la liste des paquets et installez le serveur web.
# Mise à jour du système
sudo apt update && sudo apt upgrade -y
# Installation et activation de Nginx
sudo apt install -y nginx
sudo systemctl enable --now nginx
Configuration du Pare-feu (UFW) : Autorisez le trafic web pour que votre site soit accessible.
sudo ufw allow "Nginx Full"
Étape 2 : Installation et optimisation de PHP 8.2
Nous installons PHP 8.2 avec les extensions essentielles pour la majorité des applications modernes.
# Installation de PHP-FPM et des modules communs
sudo apt install -y php8.2-fpm php8.2-cli php8.2-mysql php8.2-curl \
php8.2-xml php8.2-gd php8.2-zip php8.2-mbstring php8.2-intl
🔒 Sécurisation de PHP
Par défaut, PHP peut tenter d'exécuter le fichier le plus proche s'il ne trouve pas le fichier exact demandé. Désactivons ce comportement risqué :
# Désactivation de cgi.fix_pathinfo
sudo sed -i 's/^\s*;*\s*cgi.fix_pathinfo\s*=.*/cgi.fix_pathinfo=0/' /etc/php/8.2/fpm/php.ini
sudo systemctl restart php8.2-fpm
Étape 3 : Structure des fichiers et permissions
Nous allons créer un dossier dédié à votre site et appliquer des permissions restrictives mais fonctionnelles. Remplacez mon-domaine.com par votre domaine réel.
# Création de l'arborescence
sudo mkdir -p /var/www/mon-domaine.com/public
# Attribution de la propriété à l'utilisateur web (www-data)
sudo chown -R www-data:www-data /var/www/mon-domaine.com
# Sécurisation des permissions (Dossiers en 750, Fichiers en 640)
sudo find /var/www/mon-domaine.com -type d -exec chmod 750 {} \;
sudo find /var/www/mon-domaine.com -type f -exec chmod 640 {} \;
Étape 4 : Configuration du Virtual Host Nginx
Créez un fichier de configuration propre pour indiquer à Nginx comment traiter les requêtes vers votre domaine.
sudo nano /etc/nginx/sites-available/mon-domaine.com
Copiez ce bloc de configuration :
server {
listen 80;
server_name mon-domaine.com www.mon-domaine.com;
root /var/www/mon-domaine.com/public;
index index.php index.html;
# Gestion des URLs propres (Laravel/Symfony)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Exécution des fichiers PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# Optimisation du cache pour les fichiers statiques
location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|ico|webp)$ {
expires 7d;
access_log off;
add_header Cache-Control "public";
}
# Interdire l'accès aux fichiers cachés (.env, .git, etc.)
location ~ /\. {
deny all;
}
}
Activation du site :
sudo ln -s /etc/nginx/sites-available/mon-domaine.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Étape 5 : Sécurisation HTTPS (Certbot)
Le passage au HTTPS est indispensable aujourd'hui. Let's Encrypt permet de l'automatiser gratuitement.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mon-domaine.com -d www.mon-domaine.com
Étape 6 : Maintenance et Sécurité avancée
🛡️ Protection contre les attaques
Installez Fail2ban pour bannir automatiquement les IP qui tentent de forcer vos accès SSH ou web.
sudo apt install -y fail2ban
🔍 Dépannage rapide (Troubleshooting)
| Symptôme | Cause probable | Action |
|---|---|---|
| Erreur 502 Bad Gateway | PHP-FPM est arrêté ou le socket est faux. | sudo systemctl status php8.2-fpm |
| Erreur 403 Forbidden | Mauvais droits sur les dossiers ou index manquant. | Vérifier chown et le dossier /public |
| Page PHP téléchargée | Le bloc location ~ \.php$ est manquant. | Vérifier la config Nginx et recharger. |
💡 Variantes (Distributions RHEL / Rocky Linux)
Si vous êtes sur une base RedHat, utilisez dnf. Le socket PHP se trouve généralement ici : fastcgi_pass unix:/run/php-fpm/www.sock;

