Aller au contenu principal
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.