Installer et sécuriser phpMyAdmin derrière Nginx sur Debian 12
Published on September 22, 2025 at 05:18 PM

Optimisé pour un environnement de production léger (Debian 12 Bookworm, Nginx, PHP‑FPM, MariaDB/MySQL). Convient aussi à un lab. Inclut durcissement, automatisation et dépannage.
## Sommaire
1. Pré‑requis
2. Mise à jour du système
3. Installer Nginx, PHP‑FPM et extensions
4. Installer MariaDB/MySQL et sécuriser
5. Créer un utilisateur DB dédié à phpMyAdmin
6. Installer phpMyAdmin (2 méthodes)
- 6.A : via apt (simple)
- 6.B : via archive officielle (plus à jour)
7. Configurer Nginx : alias ou sous‑domaine dédié
8. Activer HTTPS avec Let’s Encrypt
9. Durcissement de phpMyAdmin
10. Ajuster PHP (upload, temps d’exécution)
11. Optimisations (Opcache/APCu)
12. Limiter l’accès : IP allowlist et HTTP Auth
13. Rate‑limit et Fail2ban
14. Sauvegardes et mises à jour
15. Tests et Dépannage
16. Annexes utiles
17. Check‑list finale
---
## 1. Pré‑requis
- Debian 12 (Bookworm) avec accès sudo.
- Nginx installé (sinon, voir plus bas).
- Ports 80 et 443 ouverts.
- Nom de domaine pointant vers le serveur (recommandé pour HTTPS).
- Astuce : si plusieurs versions de PHP sont installées, identifiez la version active avec la commande suivante.
```bash
php -v
# récupère 8.x.y → notez 8.2 ou 8.1, etc.
```
## 2. Mise à jour du système
Apadate : apt update + correctifs
```bash
sudo apt update && sudo apt -y full-upgrade
sudo reboot
```
## 3. Installer Nginx, PHP‑FPM et extensions
```bash
sudo apt install -y nginx php-fpm php-cli php-mbstring php-xml php-zip php-curl php-mysql php-gd php-intl php-bcmath php-json
sudo apt install -y php-imagick php-apcu
```
Vérifier le socket PHP‑FPM (remplacez 8.2 par votre version si besoin) :
```bash
ls -l /run/php/ | grep fpm
# Exemple: /run/php/php8.2-fpm.sock
```
## 4. Installer MariaDB/MySQL et sécuriser
```bash
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation
```
Recommandations pendant l’assistant :
- Définir un mot de passe root SQL (si non défini).
- Supprimer utilisateurs anonymes.
- Désactiver le login root distant.
- Supprimer la base de test.
- Recharger les privilèges.
## 5. Créer un utilisateur DB dédié à phpMyAdmin
phpMyAdmin n’a pas besoin d’un compte root. Créez un compte admin limité.
```bash
sudo mysql
```
Dans le shell SQL :
```sql
CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'motdepasse-solideIci!';
GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
```
## 6. Installer phpMyAdmin (2 méthodes)
### 6.A : via apt (simple)
```bash
sudo apt install -y phpmyadmin
```
Pendant l’installation :
- Choisir nginx: Non (il ne sera pas configuré automatiquement) → la configuration Nginx se fera à la main.
- Choisir dbconfig-common: Oui et définir le mot de passe de l’utilisateur phpMyAdmin pma (différent de pma_admin ci‑dessus).
Les fichiers sont généralement dans /usr/share/phpmyadmin.
### 6.B : via archive officielle (plus à jour)
```bash
cd /var/www
sudo mkdir -p pma && cd pma
# Téléchargez la dernière version depuis https://www.phpmyadmin.net/downloads/
# Exemple :
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
sudo tar xzf phpMyAdmin-*-all-languages.tar.gz
sudo mv phpMyAdmin-*-all-languages phpmyadmin
sudo chown -R www-data:www-data /var/www/pma/phpmyadmin
```
Créer le fichier de config si besoin :
```bash
sudo -u www-data cp /var/www/pma/phpmyadmin/config.sample.inc.php /var/www/pma/phpmyadmin/config.inc.php
sudo -u www-data nano /var/www/pma/phpmyadmin/config.inc.php
```
Dans config.inc.php, générer un blowfish_secret de 32 caractères aléatoires :
```php
/dev/null <<'EOF'
[Definition]
failregex = ^ - .* "(GET|POST) /phpmyadmin.*" .* (401|403) .*$
ignoreregex =
EOF
sudo tee /etc/fail2ban/jail.d/nginx-phpmyadmin.local >/dev/null <<'EOF'
[nginx-phpmyadmin]
enabled = true
port = http,https
filter = nginx-phpmyadmin
logpath = /var/log/nginx/access.log
maxretry = 8
findtime = 10m
bantime = 1h
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-phpmyadmin
```
## 14. Sauvegardes et mises à jour
- Sauvegardes de configuration : /etc/nginx/, /etc/php/*/fpm/, /etc/phpmyadmin/ ou /var/www/pma/phpmyadmin/.
- Mises à jour classiques :
```bash
sudo apt update && sudo apt -y upgrade
```
- Méthode archive officielle (6.B) : retélécharger la nouvelle archive et remplacer le dossier.
- Réaliser un snapshot VM ou conteneur avant une grosse modification.
## 15. Tests et Dépannage
- Tester Nginx :
```bash
sudo nginx -t
sudo systemctl reload nginx
```
- Logs : /var/log/nginx/access.log, /var/log/nginx/error.log, journalctl -u php8.2-fpm.
- PHP‑FPM down : vérifier le socket /run/php/php8.2-fpm.sock ou passer en fastcgi_pass 127.0.0.1:9000 si vous utilisez TCP.
- Erreur 403 sur alias : vérifier alias ou root, try_files et droits www-data.
- Timeout import : augmenter client_max_body_size dans le bloc server et fastcgi_read_timeout.
- CSRF token invalide : vérifier cookies, blowfish_secret, et l’horloge système (timedatectl).
## 16. Annexes utiles
### Snippet sécurité Nginx (headers)
```nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# CSP minimale (testez vos assets avant de l’appliquer en prod)
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' data: blob: https:;" always;
```
### Tuning PHP‑FPM (pool)
Fichier /etc/php/8.2/fpm/pool.d/www.conf :
```ini
pm = dynamic
pm.max_children = 32
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 16
pm.max_requests = 500
```
Adapter selon la RAM et la charge.
### UFW (pare‑feu simple)
```bash
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
```
### Nettoyage de l’alias par défaut Debian
Si vous avez installé via apt, Debian peut créer une configuration Apache. Pour Nginx, ignorez‑la et maintenez vos vhosts dans /etc/nginx/sites-available/.
---
## 17. Check‑list finale
- [ ] apt update et upgrade effectués
- [ ] Nginx et PHP‑FPM opérationnels (page phpinfo de test)
- [ ] MariaDB sécurisé avec mysql_secure_installation
- [ ] phpMyAdmin installé (apt ou archive) et accessible
- [ ] HTTPS actif (Let’s Encrypt)
- [ ] ACL (IP et/ou HTTP Auth) en place
- [ ] Rate‑limit et Fail2ban actifs
- [ ] Sauvegardes prévues et logs surveillés
Fin du tutoriel. Besoin d’une variante adaptée à ton domaine, à ta version de PHP exacte ou d’un script Bash ou Ansible idempotent ?


















