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.com pointant 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 -y Certains 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 "
  1. " . $row['content'] . "
  2. "; } 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.

Sortie du site de test LEMP

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.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.