Serveur Web · 15 min read · Oct 21, 2025
Comment installer la pile LEMP (Nginx, PHP et MariaDB) sur Debian 12

La pile LEMP de Linux est un ensemble de logiciels populaire pour le développement et l’hébergement d’applications web. Elle se compose de quatre composants clés : Linux, Nginx (prononcé “Engine-X”), MySQL ou MariaDB (une base de données relationnelle) et PHP (un langage de programmation web populaire). Dans cette configuration, Linux est le système d’exploitation, et Nginx est le serveur web qui gère les requêtes HTTP et sert du contenu statique comme des images et des fichiers .css. MySQL, ou dans notre cas, MariaDB est utilisé comme système de base de données. PHP est le langage de script utilisé pour générer du contenu web et interagir dynamiquement avec la base de données. Ces composants forment un environnement robuste et évolutif pour construire et déployer des sites web et des applications web.
Ce guide vous apprendra à installer une pile LEMP sur un serveur Debian 12 (bookworm) sorti il y a quelques jours. Vous apprendrez également à installer des applications comme phpMyAdmin.
Prérequis
- Un serveur exécutant Debian 12.
- Un utilisateur non-root avec des privilèges sudo.
- Un nom de domaine entièrement qualifié (FQDN) comme
example.compointant vers le serveur. - Le pare-feu Uncomplicated Firewall (UFW) est activé et en cours d’exécution.
- Tout est à jour.
$ sudo apt update && sudo apt upgrade - Quelques paquets dont votre système a besoin.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yCertains de ces paquets peuvent déjà être installés sur votre système.
Étape 1 - Configurer le pare-feu
La première étape avant d’installer des paquets est de configurer le pare-feu pour autoriser les connexions HTTP et HTTPS.
Vérifiez l’état du pare-feu.
$ sudo ufw status
Vous devriez voir quelque chose comme ce qui suit.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Autorisez les ports HTTP et HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Vérifiez à nouveau l’état pour confirmer.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Étape 2 - Installer PHP
Debian 12 est livré avec PHP 8.2 par défaut. Vous pouvez l’installer en exécutant la commande suivante.
$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd
Nous avons installé les extensions MySQL, CLI, GD, Mbstring et XML de PHP. Vous pouvez installer d’autres extensions selon vos besoins.
Pour rester toujours sur la dernière version de PHP ou si vous souhaitez installer plusieurs versions de PHP, ajoutez le dépôt PHP d’Ondrej.
Tout d’abord, importez la clé GPG du dépôt PHP de Sury.
$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Ajoutez le dépôt PHP d’Ondrej Sury.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Mettez à jour la liste des dépôts du système.
$ sudo apt update
Maintenant, vous pouvez installer n’importe quelle version de PHP.
$ sudo apt install php8.1-fpm php8.1-cli
Vérifiez la version de PHP installée.
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
Étape 3 - Installer MariaDB
Debian 12 ne livre pas MySQL par défaut et ils n’ont pas encore publié de paquet officiel pour cela. Par conséquent, nous allons utiliser MariaDB à la place. MariaDB n’a pas de paquet officiel pour Debian 12 non plus, mais Debian l’inclut. Par conséquent, installez-le en utilisant la commande suivante.
$ sudo apt install mariadb-server
Vérifiez la version de MySQL.
$ mysql --version
mysql Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Exécutez le script d’installation sécurisée de MariaDB.
$ sudo mysql_secure_installation
On vous demandera le mot de passe root. Appuyez sur Entrée car nous n’avons pas défini de mot de passe pour cela.
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
Ensuite, on vous demandera si vous souhaitez passer à la méthode d’authentification par socket Unix. Le plugin unix_socket vous permet d’utiliser vos identifiants système pour vous connecter au serveur MariaDB. Puisque vous avez déjà un compte root protégé, entrez n pour continuer.
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
Ensuite, on vous demandera si vous souhaitez changer votre mot de passe root. Sur Debian 12, le mot de passe root est étroitement lié à la maintenance automatique du système, donc il doit être laissé tel quel. Tapez n pour continuer.
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
Ensuite, on vous posera certaines questions pour améliorer la sécurité de MariaDB. Tapez Y pour supprimer les utilisateurs anonymes, interdire les connexions root à distance, supprimer la base de données de test et recharger les tables de privilèges.
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Vous pouvez entrer dans le shell MariaDB en tapant sudo mysql ou sudo mariadb dans la ligne de commande.
Étape 4 - Configurer MariaDB
Connectez-vous au shell MariaDB.
$ sudo mysql
Créez une base de données d’exemple.
MariaDB> CREATE DATABASE exampledb;
Créez un compte utilisateur SQL.
MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';
Accordez tous les privilèges sur la base de données à l’utilisateur.
MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
Puisque nous ne modifions pas l’utilisateur root, vous devriez créer un autre utilisateur SQL pour effectuer des tâches administratives qui utilisent l’authentification par mot de passe. Choisissez un mot de passe fort pour celui-ci.
MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;
Rafraîchissez les privilèges des utilisateurs.
MariaDB> FLUSH PRIVILEGES;
Quittez le shell.
MariaDB> exit
Connectons-nous à nouveau au shell MySQL en utilisant l’utilisateur nouvellement créé.
$ sudo mysql -u exampleuser -p
Créez une table de test.
MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );
Insérez des données de test.
MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");
Répétez la commande ci-dessus plusieurs fois pour ajouter plus d’entrées. Exécutez la commande suivante pour vérifier le contenu de la table.
MariaDB> SELECT * FROM exampledb.name_list;
Vous recevrez la sortie suivante.
+-----+---------+
| sno | content |
+-----+---------+
| 1 | Navjot |
| 2 | Adam |
| 3 | Josh |
| 4 | Peter |
+-----+---------+
4 rows in set (0.00 sec)
Quittez le shell MySQL.
MariaDB> exit
Étape 5 - Installer Nginx
Debian 12 est livré avec une version plus ancienne de Nginx. Pour installer la dernière version, vous devez télécharger le dépôt officiel de Nginx.
Importez la clé de signature de Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Ajoutez le dépôt pour la version stable de Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Mettez à jour les dépôts du système.
$ sudo apt update
Installez Nginx.
$ sudo apt install nginx
Vérifiez l’installation. Sur les systèmes Debian, la commande suivante ne fonctionnera qu’avec sudo.
$ sudo nginx -v
nginx version: nginx/1.24.0
Démarrez Nginx.
$ sudo systemctl start nginx
Vérifiez l’état du service.
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago
Docs: https://nginx.org/en/docs/
Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 2258 (nginx)
Tasks: 2 (limit: 1108)
Memory: 1.8M
CPU: 6ms
CGroup: /system.slice/nginx.service
??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??2259 "nginx: worker process"
Étape 6 - Configurer PHP-FPM
Ouvrez php.ini pour l’édition.
$ sudo nano /etc/php/8.2/fpm/php.ini
Pour définir les tailles de téléchargement de fichiers, changez les valeurs des variables upload_max_filesize et post_max_size.
upload_max_filesize = 50M
...
post_max_size = 50M
Configurez la limite de mémoire de PHP en fonction des ressources et des besoins de votre serveur.
memory_limit = 256M
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Vous pouvez également utiliser les commandes suivantes pour effectuer les modifications sans avoir besoin d’ouvrir le fichier.
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini
Ouvrez le fichier /etc/php/8.0/fpm/pool.d/www.conf.
$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Nous devons définir l’utilisateur/groupe Unix des processus PHP sur nginx. Trouvez les lignes user=www-data et group=www-data dans le fichier et changez-les en nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = nginx
group = nginx
...
De plus, trouvez les lignes listen.owner=www-data et listen.group=www-data dans le fichier et changez-les en nginx.
listen.owner = nginx
listen.group = nginx
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Redémarrez le processus PHP-fpm.
$ sudo systemctl restart php8.2-fpm
Étape 7 - Installer phpMyAdmin
Téléchargez le fichier d’archive de phpMyAdmin pour la langue anglaise. Prenez le lien pour la dernière version depuis la page de téléchargement de phpMyAdmin.
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz
Créez un répertoire public pour le site.
$ sudo mkdir /var/www/html/example.com -p
Extrayez l’archive dans le répertoire public.
$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com
Passez au répertoire public.
$ cd /var/www/html/example.com
Renommez le répertoire extrait en quelque chose d’obscur pour améliorer la sécurité.
$ sudo mv phpMyAdmin-5.2.1-english sm175
Étape 8 - Configurer phpMyAdmin
Copiez le fichier de configuration d’exemple.
$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php
Ouvrez le fichier de configuration pour l’édition.
$ sudo nano sm175/config.inc.php
Trouvez la ligne $cfg['blowfish_secret'] = ''; et entrez une chaîne aléatoire de 32 caractères pour l’authentification basée sur les cookies.
Vous pouvez utiliser le générateur de blowfish en ligne de phpSolved ou le faire via la ligne de commande.
Copiez la valeur et collez-la comme indiqué.
$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Changez la propriété du site et de phpMyAdmin au serveur Nginx.
$ sudo chown -R nginx:nginx /var/www/html/example.com
Supprimez le répertoire de configuration de phpMyAdmin.
$ sudo rm -rf /var/www/html/example.com/sm175/setup
Étape 9 - Configurer Opcache
Opcache est le système de mise en cache de PHP. Il fonctionne en sauvegardant le bytecode de script précompilé en mémoire, donc chaque fois qu’un utilisateur visite une page, elle se charge plus rapidement. Opcache est installé par défaut. Pour vérifier, vérifiez la version de PHP.
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
Cela nous dit qu’Opcache est installé et disponible. Dans le cas où il ne s’affiche pas ici, vous pouvez l’installer manuellement en exécutant la commande suivante.
$ sudo apt install php-opcache
Pour changer les paramètres d’Opcache, ouvrez le fichier /etc/php/8.2/fpm/conf.d/10-opcache.ini pour l’édition.
$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
Les paramètres suivants devraient vous aider à commencer à utiliser Opcache et sont généralement recommandés pour de bonnes performances. Vous pouvez l’activer en ajoutant les lignes suivantes en bas.
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Redémarrez PHP-FPM.
$ sudo systemctl restart php8.2-fpm
Étape 10 - Installer Certbot pour SSL
Nous devons installer Certbot pour générer des certificats SSL gratuits offerts par Let’s Encrypt.
Vous pouvez soit installer Certbot en utilisant le dépôt de Debian, soit obtenir la dernière version en utilisant l’outil Snapd. Nous allons utiliser la version Snapd.
Debian 12 ne vient pas avec Snapd installé. Installez le paquet Snapd.
$ sudo apt install snapd
Exécutez les commandes suivantes pour vous assurer que votre version de Snapd est à jour.
$ sudo snap install core
$ sudo snap refresh core
Installez Certbot.
$ sudo snap install --classic certbot
Utilisez la commande suivante pour vous assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Vérifiez si Certbot fonctionne correctement.
$ certbot --version
certbot 2.6.0
Étape 11 - Tester un site de démonstration
Créer le site
Créez et ouvrez une page de test pour l’édition.
$ sudo nano /var/www/html/example.com/index.php
Collez le code suivant dedans.
Liste des membres";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "- " . $row['content'] . "
";
}
echo "
";
} catch (PDOException $e) {
print "Erreur!: " . $e->getMessage() . "
";
die();
}
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Créer un certificat SSL
Exécutez la commande suivante pour générer un certificat SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/example.com sur votre serveur.
Générez un certificat de groupe Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Vérifiez le service de planification de renouvellement de Certbot.
$ sudo systemctl list-timers
Vous trouverez snap.certbot.renew.service comme l’un des services programmés pour s’exécuter.
NEXT LEFT LAST PASSED UNIT ACTIVATES
.....
Sun 2023-02-26 06:32:00 UTC 9h left Sat 2023-02-25 18:04:05 UTC 2h 59min ago snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-02-26 06:43:20 UTC 9h left Sat 2023-02-25 10:49:23 UTC 10h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2023-02-26 09:00:06 UTC 11h left Sat 2023-02-25 20:58:06 UTC 5min ago apt-daily.timer apt-daily.service
Faites un essai à sec du processus pour vérifier si le renouvellement SSL fonctionne correctement.
$ sudo certbot renew --dry-run
Si vous ne voyez aucune erreur, vous êtes prêt. Votre certificat se renouvellera automatiquement.
Configurer Nginx
Créez et ouvrez le fichier /etc/nginx/conf.d/example.conf pour l’édition.
$ sudo nano /etc/nginx/conf.d/example.conf
Collez le code suivant dedans.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
root /var/www/html/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Pass PHP Scripts To FastCGI Server
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #depends on PHP versions
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Ouvrez le fichier /etc/nginx/nginx.conf pour l’édition.
$ sudo nano /etc/nginx/nginx.conf
Ajoutez la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Vérifiez votre configuration Nginx.
$ sudo nginx -t
Si vous ne voyez aucune erreur, cela signifie que vous êtes prêt à partir. Démarrez le serveur Nginx.
$ sudo systemctl start nginx
Chargez votre site web en visitant https://example.com dans votre navigateur et vous verrez la page suivante.

Vous pouvez accéder à votre installation de phpMyAdmin en visitant l’URL https://example.com/sm175 dans votre navigateur. Vous pouvez soit entrer votre utilisateur administratif, soit l’utilisateur créé précédemment pour vous connecter.
Conclusion
Cela conclut notre tutoriel où vous avez appris à configurer une pile LEMP sur un serveur Debian 12 et à créer un site de démonstration. Si vous avez des questions, posez-les dans les commentaires ci-dessous.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.