DevOps 10 min de lecture
Déployer une application PHP sur Debian 12
LC
Louis Cercle
Développeur Full-Stack
Debian 12 "Bookworm" est une base solide pour héberger vos applications PHP. Ce guide vous accompagne de A à Z pour configurer un serveur de production sécurisé avec Nginx, PHP-FPM 8.2, MariaDB et SSL gratuit.
Prérequis
- Un VPS avec Debian 12 fraîchement installé (OVH, Hetzner, DigitalOcean...)
- Un accès SSH root ou utilisateur sudo
- Un nom de domaine pointant vers l'IP du serveur
- Environ 30 minutes de votre temps
1. Mise à jour du système
# Connexion SSH
ssh root@votre-ip
# Mise à jour des paquets
apt update && apt upgrade -y
# Installation des outils de base
apt install -y curl wget git unzip sudo ufw
# Créer un utilisateur non-root (recommandé)
adduser deploy
usermod -aG sudo deploy 2. Configuration du pare-feu
⚠️ Important
Configurez UFW avant d'activer le pare-feu pour ne pas vous bloquer l'accès SSH !
# Autoriser SSH (port 22)
ufw allow OpenSSH
# Autoriser HTTP et HTTPS
ufw allow 'Nginx Full'
# Activer le pare-feu
ufw enable
# Vérifier le statut
ufw status verbose 3. Installation de Nginx
# Installation
apt install -y nginx
# Démarrage et activation au boot
systemctl start nginx
systemctl enable nginx
# Vérification
systemctl status nginx
curl http://localhost 4. Installation de PHP 8.2
# PHP 8.2 est disponible dans les dépôts Debian 12
apt install -y php8.2-fpm php8.2-cli php8.2-common \
php8.2-mysql php8.2-xml php8.2-curl php8.2-gd \
php8.2-mbstring php8.2-zip php8.2-intl php8.2-opcache
# Vérification
php -v
# PHP 8.2.x (cli) ...
# Configurer PHP-FPM
nano /etc/php/8.2/fpm/pool.d/www.conf Modifiez les paramètres selon vos besoins :
; /etc/php/8.2/fpm/pool.d/www.conf
; Utiliser un socket Unix (plus rapide)
listen = /run/php/php8.2-fpm.sock
; Nombre de processus (ajuster selon RAM)
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
; Sécurité
security.limit_extensions = .php # Redémarrer PHP-FPM
systemctl restart php8.2-fpm
systemctl enable php8.2-fpm 5. Installation de MariaDB
# Installation
apt install -y mariadb-server mariadb-client
# Sécurisation
mysql_secure_installation
# Répondre Y à toutes les questions
# Créer une base et un utilisateur
mysql -u root -p -- Commandes SQL
CREATE DATABASE monapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'monapp_user'@'localhost' IDENTIFIED BY 'MotDePasseSecurise123!';
GRANT ALL PRIVILEGES ON monapp.* TO 'monapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT; 6. Configuration Nginx pour PHP
# Créer le répertoire de l'application
mkdir -p /var/www/monapp/public
chown -R www-data:www-data /var/www/monapp
# Créer le virtual host
nano /etc/nginx/sites-available/monapp # /etc/nginx/sites-available/monapp
server {
listen 80;
listen [::]:80;
server_name mondomaine.com www.mondomaine.com;
root /var/www/monapp/public;
index index.php index.html;
# Logs
access_log /var/log/nginx/monapp_access.log;
error_log /var/log/nginx/monapp_error.log;
# Sécurité
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
# Bloquer l'accès aux fichiers sensibles
location ~ /\.(git|env|htaccess) {
deny all;
}
# Cache des assets statiques
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
} # Activer le site
ln -s /etc/nginx/sites-available/monapp /etc/nginx/sites-enabled/
# Tester la configuration
nginx -t
# Recharger Nginx
systemctl reload nginx 7. SSL avec Let's Encrypt
# Installer Certbot
apt install -y certbot python3-certbot-nginx
# Obtenir le certificat
certbot --nginx -d mondomaine.com -d www.mondomaine.com
# Le renouvellement automatique est configuré
# Vérifier avec :
systemctl status certbot.timer
certbot renew --dry-run Certbot modifie automatiquement votre configuration Nginx pour HTTPS et ajoute une redirection HTTP → HTTPS.
8. Déploiement de l'application
# Option 1 : Git
cd /var/www/monapp
git clone https://github.com/user/monapp.git .
# Option 2 : rsync depuis votre machine locale
rsync -avz --exclude='.git' --exclude='node_modules' \
./monapp/ deploy@serveur:/var/www/monapp/
# Installer les dépendances PHP (si Composer)
cd /var/www/monapp
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --optimize-autoloader
# Permissions
chown -R www-data:www-data /var/www/monapp
chmod -R 755 /var/www/monapp
chmod -R 775 /var/www/monapp/storage # Si Laravel 9. Optimisations production
PHP OPcache
; /etc/php/8.2/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0 MariaDB Tuning
; /etc/mysql/conf.d/custom.cnf
[mysqld]
innodb_buffer_pool_size=512M
innodb_log_file_size=128M
query_cache_type=1
query_cache_size=64M 10. Monitoring et logs
# Voir les logs en temps réel
tail -f /var/log/nginx/monapp_error.log
# Logs PHP-FPM
tail -f /var/log/php8.2-fpm.log
# Monitoring système basique
htop
df -h # Espace disque
free -m # RAM
# Optionnel : installer Netdata pour monitoring graphique
bash <(curl -Ss https://my-netdata.io/kickstart.sh) Checklist de sécurité
- ✅ Pare-feu UFW configuré
- ✅ Utilisateur non-root créé
- ✅ SSL/TLS avec Let's Encrypt
- ⬜ Désactiver login SSH root
- ⬜ Clés SSH au lieu de mots de passe
- ⬜ Fail2ban installé
- ⬜ Backups automatiques configurés
- ⬜ Mises à jour automatiques (unattended-upgrades)
Conclusion
Vous avez maintenant un serveur Debian 12 prêt pour la production avec une stack LEMP moderne et sécurisée. Pour aller plus loin, envisagez :
- Redis pour le cache applicatif
- Supervisor pour les workers/queues
- Docker pour l'isolation des applications
- CI/CD avec GitHub Actions ou GitLab CI
Bon déploiement ! N'hésitez pas à me contacter si vous avez des questions.