Recherche de site Web

Comment installer Linux, Nginx, MySQL, PHP (pile LEMP) sur Ubuntu


Introduction

La pile logicielle LEMP sert des pages web dynamiques et des applications web écrites en PHP. Il s'agit d'un acronyme qui décrit un système d'exploitation Linux, avec un serveur web Nginx (prononcé comme « Engine-X »). Les données back-end sont stockées dans la base de données MySQL et le traitement dynamique est géré par PHP.

Ce guide démontre comment installer une pile LEMP sur un serveur Ubuntu. Le système d'exploitation Ubuntu prend en charge la partie Linux de la pile. Nous décrirons comment mettre en place le reste des composants et les faire fonctionner.

Remarque : Ce tutoriel s'adresse principalement à Ubuntu 22.04 LTS avec PHP 8.1. Pour les utilisateurs d'Ubuntu 24.04 LTS, ajustez les références de version PHP de php8.1-fpm à php8.3-fpm dans toutes les commandes. De plus, assurez-vous de mettre à jour tous les chemins de socket PHP-FPM dans votre configuration Nginx (par exemple, utilisez /run/php/php8.3-fpm.sock pour Ubuntu 24.04).

Comment installer Linux, Nginx, MySQL, PHP (pile LEMP) sur Ubuntu

  1. Installation du serveur Web Nginx
  2. Installation de MySQL
  3. Installation de PHP
  4. Configurer Nginx pour utiliser le processeur PHP
  5. Tester PHP avec Nginx
  6. Tester la connexion à la base de données depuis PHP

Prérequis

Utilisez un utilisateur sudo non-root sur Ubuntu avec le pare-feu UFW activé. Suivez notre guide de configuration initiale du serveur pour Ubuntu afin de le configurer.

Étape 1 – Installation du serveur web Nginx

Pour afficher des pages Web aux visiteurs du site, vous allez utiliser Nginx, un serveur Web haute performance. Vous utiliserez le gestionnaire de paquets APT pour obtenir ce logiciel.

Mettez à jour l'index des paquets de votre serveur, puis installez Nginx :

sudo apt update

Ensuite, exécutez apt install pour installer Nginx :

sudo apt install nginx

Lorsque vous y êtes invité, appuyez sur Y et ENTRÉE pour confirmer que vous souhaitez installer Nginx. Une fois l'installation terminée, le serveur web Nginx sera actif et en fonctionnement sur votre serveur Ubuntu.

Vérifiez que Nginx est en cours d'exécution :

sudo systemctl status nginx

Vous devriez voir une sortie indiquant que Nginx est actif :

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since...

Sur Ubuntu, Nginx est configuré pour démarrer automatiquement lors de l'installation.

Autoriser le trafic HTTP à travers le pare-feu ufw. Nginx enregistre plusieurs profils d'application UFW lors de l'installation. Vérifiez les profils disponibles :

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Activez le profil le plus restrictif qui permet le trafic requis. Comme SSL n'est pas encore configuré, autorisez uniquement le trafic HTTP sur le port 80 :

Activez cela en exécutant ce qui suit :

sudo ufw allow 'Nginx HTTP'

Vérifiez la modification du pare-feu :

sudo ufw status

Cette sortie affiche que le trafic HTTP est maintenant autorisé :

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Pour tester la fonctionnalité de domaine du serveur Nginx, accédez à http://your_domain en utilisant votre navigateur Web préféré.

Si vous n'avez pas de nom de domaine pointant vers votre serveur et que vous ne connaissez pas l'adresse IP publique de votre serveur, vous pouvez la trouver en exécutant l'une des commandes suivantes :

ip addr show
hostname -I

Cela affichera quelques adresses IP. Vous pouvez essayer chacune d'elles à tour de rôle dans votre navigateur web.

Comme alternative, vous pouvez vérifier quelle adresse IP est accessible, telle qu'elle est vue depuis d'autres emplacements sur Internet :

curl -4 icanhazip.com

Écrivez l'adresse que vous recevez dans votre navigateur web et elle vous mènera à la page d'accueil par défaut de Nginx :

http://<server_domain_or_IP>

Si vous recevez cette page, cela signifie que vous avez installé Nginx avec succès et activé le trafic HTTP pour votre serveur web.

Étape 2 — Installer MySQL

Installez MySQL pour stocker et gérer les données du site. MySQL est le système de gestion de base de données standard pour les environnements PHP.

Encore une fois, utilisez apt pour acquérir et installer ce logiciel :

sudo apt install mysql-server

Lorsque vous y êtes invité, confirmez l'installation en appuyant sur Y, puis sur ENTRÉE.

Après l'installation, exécutez le script de sécurité pour supprimer les paramètres par défaut non sécurisés et verrouiller l'accès à la base de données :

sudo mysql_secure_installation

Vous serez invité avec une question vous demandant si vous souhaitez configurer le PLUGIN DE VALIDATION DE MOT DE PASSE.

Remarque : Activer cette fonctionnalité est en quelque sorte une question de jugement. Si elle est activée, les mots de passe qui ne respectent pas les critères spécifiés seront rejetés par MySQL avec une erreur. Il est sûr de laisser la validation désactivée, mais vous devriez toujours utiliser des mots de passe forts et uniques pour les identifiants de base de données.

Répondez Y pour oui, ou autre chose pour continuer sans activer :

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 

Si vous répondez « oui », il vous sera demandé de sélectionner un niveau de validation du mot de passe. Gardez à l'esprit que si vous entrez 2 pour le niveau le plus élevé, vous recevrez des erreurs lorsque vous tenterez de définir un mot de passe qui ne contient pas de chiffres, de lettres majuscules et minuscules, et de caractères spéciaux :

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Que vous choisissiez ou non de configurer le PLUGIN DE VALIDATION DE MOT DE PASSE, votre serveur vous demandera de sélectionner et de confirmer un mot de passe pour l'utilisateur MySQL root. Cela ne doit pas être confondu avec le root système. L'utilisateur root de la base de données est un utilisateur administratif avec tous les privilèges sur le système de base de données. Même si la méthode d'authentification par défaut pour l'utilisateur root de MySQL dispense de l'utilisation d'un mot de passe, même lorsqu'un mot de passe est défini, vous devriez définir un mot de passe fort ici comme mesure de sécurité supplémentaire. Nous en parlerons dans un instant.

Si vous avez activé la validation du mot de passe, la force du mot de passe pour le mot de passe root que vous avez saisi vous sera indiquée et votre serveur vous demandera si vous souhaitez continuer avec ce mot de passe. Si vous êtes satisfait de votre mot de passe actuel, appuyez sur Y pour « oui » à l’invite :

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Pour le reste des questions, appuyez sur Y et appuyez sur la touche ENTER à chaque invite. Cela supprimera certains utilisateurs anonymes et la base de données de test, désactivera les connexions root à distance et chargera ces nouvelles règles afin que MySQL respecte immédiatement les modifications que vous avez effectuées.

Lorsque vous avez terminé, testez si vous pouvez vous connecter à la console MySQL :

sudo mysql

Cela se connectera au serveur MySQL en tant qu'utilisateur de base de données administrateur root, ce qui est déduit de l'utilisation de sudo lors de l'exécution de cette commande. Vous devriez recevoir la sortie suivante :

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Pour quitter la console MySQL, écrivez ce qui suit :

exit

Remarquez que vous n’aviez pas besoin de fournir un mot de passe pour vous connecter en tant qu’utilisateur root, même si vous en avez défini un lors de l’exécution du script mysql_secure_installation. Cela s’explique par le fait que, lorsqu’il est installé sur Ubuntu, la méthode d’authentification par défaut pour l’utilisateur administratif MySQL est auth_socket, plutôt qu’une méthode utilisant un mot de passe. Cela peut sembler préoccupant pour la sécurité au premier abord, mais cela rend le serveur de bases de données plus sécurisé, puisque les seuls utilisateurs autorisés à se connecter en tant qu’utilisateur MySQL root sont les utilisateurs du système disposant des privilèges sudo se connectant depuis la console ou via une application utilisant les mêmes privilèges. En termes pratiques, cela signifie que vous ne pourrez pas utiliser l’utilisateur administratif de la base de données root pour vous connecter depuis votre application PHP.

Pour une sécurité accrue, il est préférable d'avoir des comptes d'utilisateurs dédiés avec des privilèges moins étendus configurés pour chaque base de données, surtout si vous prévoyez d'héberger plusieurs bases de données sur votre serveur.

Remarque : Certaines anciennes versions de la bibliothèque PHP native MySQL mysqlnd ne prennent pas en charge caching_sha2_authentication, la méthode d’authentification par défaut pour les utilisateurs créés dans MySQL 8. Pour cette raison, lors de la création d’utilisateurs de base de données pour des applications PHP sur MySQL 8, vous devrez peut-être vous assurer qu’ils sont configurés pour utiliser mysql_native_password à la place. Nous montrerons comment faire cela à l’étape 6.

Votre serveur MySQL est maintenant installé et sécurisé. Ensuite, vous allez installer PHP, le dernier composant de la pile LEMP.

Étape 3 – Installer PHP

Installez PHP pour traiter le code et générer du contenu dynamique. Nginx nécessite un programme externe pour le traitement de PHP.

PHP-FPM ("gestionnaire de processus fastCGI") gère le traitement PHP de manière efficace avec des fonctionnalités de sécurité supplémentaires, offrant de meilleures performances pour les sites web basés sur PHP. Installez php-fpm pour acheminer les requêtes PHP depuis Nginx, et php-mysql pour permettre la communication PHP-MySQL. Les paquets PHP de base s'installent automatiquement en tant que dépendances.

Pour installer les paquets php8.1-fpm et php-mysql, exécutez :

sudo apt install php8.1-fpm php-mysql

Lorsque vous y êtes invité, appuyez sur Y et ENTRÉE pour confirmer l'installation.

Vérifiez que PHP-FPM est en cours d'exécution :

sudo systemctl status php8.1-fpm

Vous devriez voir une sortie montrant que PHP-FPM est actif :

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded
     Active: active (running)

Vous pouvez également vérifier la version de PHP :

php -v
PHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x

Configurez Nginx pour utiliser ces composants PHP.

Étape 4 — Configuration de Nginx pour utiliser le processeur PHP

Créez des blocs serveur Nginx (similaires aux hôtes virtuels Apache) pour encapsuler la configuration et héberger plusieurs domaines sur un seul serveur. Ce guide utilise votre_domaine comme nom de domaine exemple.

Info : Pour en savoir plus sur la configuration d'un nom de domaine avec Linux-Console.net, lisez notre introduction au DNS de Linux-Console.net.

Sur Ubuntu 22.04, Nginx active un bloc serveur par défaut qui sert des documents depuis /var/www/html. Pour plusieurs sites, créez une structure de répertoires dans /var/www pour votre_domaine, en laissant /var/www/html comme répertoire de secours par défaut.

Créez le répertoire web racine pour your_domain comme suit :

sudo mkdir /var/www/your_domain

Ensuite, assignez la propriété du répertoire en utilisant la variable d'environnement $USER, qui fera référence à votre utilisateur système actuel :

sudo chown -R $USER:$USER /var/www/your_domain

Ensuite, ouvrez un nouveau fichier de configuration dans le répertoire sites-available de Nginx en utilisant votre éditeur de ligne de commande préféré. Ici, nous utiliserons nano :

sudo nano /etc/nginx/sites-available/your_domain

Cela va créer un nouveau fichier vierge. Insérez la configuration minimale suivante :

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
     }

    location ~ /\.ht {
        deny all;
    }

}

Voici ce que fait chacune de ces directives et blocs de localisation :

  • listen — Définit sur quel port Nginx écoutera. Dans ce cas, il écoutera sur le port 80, le port par défaut pour HTTP.
  • root — Définit la racine du document où les fichiers servis par ce site web sont stockés.
  • index — Définit dans quel ordre Nginx donnera la priorité aux fichiers index pour ce site web. Il est courant de lister les fichiers index.html avec une priorité plus élevée que les fichiers index.php afin de permettre de configurer rapidement une page d'entretien pour les applications PHP. Vous pouvez ajuster ces paramètres pour mieux répondre aux besoins de votre application.
  • server_name — Définit pour quels noms de domaine et/ou adresses IP ce bloc serveur doit répondre. Pointez cette directive vers le nom de domaine ou l'adresse IP publique de votre serveur.
  • location / — Le premier bloc de localisation comprend une directive try_files, qui vérifie l'existence de fichiers ou de répertoires correspondant à une requête URL. Si Nginx ne peut pas trouver la ressource appropriée, il renverra une erreur 404.
  • location ~ \.php$ — Ce bloc de localisation gère le traitement réel des fichiers PHP en indiquant à Nginx le fichier de configuration fastcgi-php.conf et le fichier php8.1-fpm.sock, qui déclare quel socket est associé à php8.1-fpm.
  • emplacement ~ /\.ht — Le dernier bloc de location traite des fichiers .htaccess, que Nginx ne traite pas. En ajoutant la directive de refus de tout, si des fichiers .htaccess se retrouvent dans la racine du document, ils ne seront pas transmis aux visiteurs.

Une fois que vous avez terminé de modifier, enregistrez et fermez le fichier. Si vous utilisez nano, vous pouvez le faire en appuyant sur CTRL+X, puis sur Y et ENTRÉE pour confirmer.

Activez votre configuration en la reliant au fichier de configuration depuis le répertoire sites-enabled de Nginx :

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Ensuite, déliez le fichier de configuration par défaut du répertoire /sites-enabled/ :

sudo unlink /etc/nginx/sites-enabled/default

Remarque : Si vous avez besoin de restaurer la configuration par défaut, vous pouvez le faire en recréant le lien symbolique, comme suit :

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Cela indiquera à Nginx d'utiliser la configuration la prochaine fois qu'il sera rechargé. Vous pouvez tester votre configuration pour détecter des erreurs de syntaxe en exécutant ce qui suit :

sudo nginx -t

Si des erreurs sont signalées, retournez à votre fichier de configuration pour en vérifier le contenu avant de continuer.

Lorsque vous êtes prêt, rechargez Nginx pour appliquer les modifications :

sudo systemctl reload nginx

Votre nouveau site web est maintenant actif, mais la racine web /var/www/your_domain est toujours vide. Créez un fichier index.html à cet emplacement afin de pouvoir tester que votre nouveau bloc serveur fonctionne comme prévu :

nano /var/www/your_domain/index.html

Incluez le contenu suivant dans ce fichier :

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Allez maintenant dans votre navigateur et accédez au nom de domaine ou à l'adresse IP de votre serveur, comme indiqué dans la directive server_name de votre fichier de configuration du bloc serveur :

http://server_domain_or_IP

Vous recevrez une page comme la suivante :

Si vous recevez cette page, cela signifie que votre bloc de serveur Nginx fonctionne comme prévu.

Vous pouvez laisser ce fichier en place comme page d'accueil temporaire pour votre application jusqu'à ce que vous configuriez un fichier index.php pour le remplacer.

Attention : Après avoir ajouté votre fichier index.php, assurez-vous de supprimer ou de renommer le fichier index.html dans votre répertoire racine. Si les deux fichiers existent, Nginx servira par défaut le index.html et votre page PHP ne sera pas affichée — c'est une source courante de confusion pour les nouveaux utilisateurs.

Votre pile LEMP est maintenant entièrement configurée. À l'étape suivante, vous allez créer un script PHP pour vérifier que Nginx est effectivement capable de traiter les fichiers .php dans votre site web nouvellement configuré.

Étape 5 – Tester PHP avec Nginx

Votre pile LEMP devrait maintenant être entièrement configurée. Vous pouvez la tester pour vérifier que Nginx peut correctement transmettre les fichiers .php à votre processeur PHP.

Vous pouvez le faire en créant un fichier PHP de test dans la racine de votre document. Ouvrez un nouveau fichier appelé info.php dans la racine de votre document avec votre éditeur de texte préféré :

nano /var/www/your_domain/info.php

Ajoutez les lignes suivantes dans le nouveau fichier. Il s'agit d'un code PHP valide qui retournera des informations sur votre serveur :

<?php
phpinfo();

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Vous pouvez maintenant accéder à cette page dans votre navigateur web en visitant le nom de domaine ou l'adresse IP publique que vous avez configuré dans votre fichier de configuration Nginx, suivi de /info.php :

http://server_domain_or_IP/info.php

Vous recevrez une page web contenant des informations détaillées sur votre serveur :

Après avoir consulté les informations pertinentes concernant votre serveur PHP via cette page, il est préférable de supprimer le fichier que vous avez créé car il contient des informations sensibles sur votre environnement PHP et votre serveur Ubuntu. Vous pouvez utiliser rm pour supprimer ce fichier :

sudo rm /var/www/your_domain/info.php

Vous pouvez toujours régénérer ce fichier si vous en avez besoin plus tard.

Étape 6 — Test de la connexion à la base de données depuis PHP (Optionnel)

Si vous voulez tester si PHP est capable de se connecter à MySQL et d'exécuter des requêtes sur la base de données, vous pouvez créer une table de test avec des données factices et interroger son contenu depuis un script PHP. Avant de le faire, vous devez créer une base de données de test et un nouvel utilisateur MySQL correctement configuré pour y accéder.

Remarque : Certaines anciennes versions de la bibliothèque PHP native MySQL mysqlnd ne prennent pas en charge caching_sha2_authentication, la méthode d'authentification par défaut de MySQL 8, vous devrez peut-être vous assurer qu'elles sont configurées pour utiliser mysql_native_password à la place.

Nous allons créer une base de données nommée example_database et un utilisateur nommé example_user, mais vous pouvez remplacer ces noms par d'autres valeurs.

Tout d'abord, connectez-vous à la console MySQL en utilisant le compte root :

sudo mysql

Pour créer une nouvelle base de données, exécutez la commande suivante depuis votre console MySQL :

CREATE DATABASE example_database;

Vous pouvez maintenant créer un nouvel utilisateur et lui accorder tous les privilèges sur la base de données personnalisée que vous avez créée.

La commande suivante crée un nouvel utilisateur nommé example_user, en utilisant mysql_native_password comme méthode d'authentification par défaut. Nous définissons le mot de passe de cet utilisateur comme password, mais vous devriez remplacer cette valeur par un mot de passe sécurisé de votre choix.

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Nous devons maintenant donner à cet utilisateur l'autorisation sur la base de données example_database :

GRANT ALL ON example_database.* TO 'example_user'@'%';

Cela donnera à l'utilisateur example_user tous les privilèges sur la base de données example_database tout en empêchant cet utilisateur de créer ou de modifier d'autres bases de données sur votre serveur.

Quittez maintenant le shell MySQL avec la commande suivante :

exit

Vous pouvez tester si le nouvel utilisateur dispose des autorisations appropriées en vous connectant à nouveau à la console MySQL, cette fois en utilisant les informations d'identification de l'utilisateur personnalisé. Remarquez le drapeau -p dans cette commande, qui vous invitera à entrer le mot de passe utilisé lors de la création de l'utilisateur example_user :

mysql -u example_user -p

Après vous être connecté à la console MySQL, confirmez que vous avez accès à la base de données example_database :

SHOW DATABASES;

Cela renverra la sortie suivante :

+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Ensuite, nous allons créer une table de test nommée todo_list. Depuis la console MySQL, exécutez la commande suivante :

CREATE TABLE example_database.todo_list (

 item_id INT AUTO_INCREMENT,

 content VARCHAR(255),

 PRIMARY KEY(item_id)

);

Insérez quelques lignes de contenu dans la table de test. Vous pourriez vouloir répéter la commande suivante plusieurs fois, en utilisant des valeurs différentes :

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Pour confirmer que les données ont été enregistrées avec succès dans votre tableau, exécutez :

SELECT * FROM example_database.todo_list;

Votre sortie devrait s'afficher comme suit :

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Après avoir confirmé que vous avez des données valides dans votre table de test, vous pouvez quitter la console MySQL :

exit

Vous pouvez maintenant créer le script PHP qui se connectera à MySQL et effectuera des requêtes pour votre contenu. Créez un nouveau fichier PHP dans votre répertoire racine web personnalisé en utilisant votre éditeur préféré. Nous utiliserons nano pour cela :

nano /var/www/your_domain/todo_list.php

Le script PHP suivant se connecte à la base de données MySQL et interroge le contenu de la table todo_list, affichant les résultats dans une liste. S'il y a un problème avec la connexion à la base de données, il générera une exception.

Ajoutez le contenu suivant à votre script todo_list.php :

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Enregistrez et fermez le fichier lorsque vous avez terminé de le modifier.

Vous pouvez maintenant accéder à cette page dans votre navigateur Web en visitant le nom de domaine ou l'adresse IP publique configurée pour votre site Web, suivi de /todo_list.php :

http://server_domain_or_IP/todo_list.php

Vous devriez recevoir une page comme celle-ci, montrant le contenu que vous avez inséré dans votre table de test :

Cela signifie que votre environnement PHP est prêt à se connecter et à interagir avec votre serveur MySQL.

Questions Fréquemment Posées

À quoi sert la pile LEMP ?

La pile LEMP héberge des sites Web et des applications dynamiques basés sur PHP, y compris WordPress, Laravel, Magento, Drupal et des projets PHP personnalisés. Elle est particulièrement efficace pour les sites à fort trafic nécessitant une gestion efficace des connexions simultanées.

Quelle est la différence entre les stacks LEMP et LAMP ?

LEMP utilise Nginx, qui gère les connexions de manière asynchrone avec une architecture orientée événements — efficace pour les utilisateurs simultanés. LAMP utilise Apache, qui crée traditionnellement un thread par requête (bien que les versions modernes d'Apache supportent des modes orientés événements). LEMP offre généralement de meilleures performances pour le contenu statique et les scénarios à haute concurrence, tandis que LAMP fournit une configuration .htaccess plus simple et un support plus large des modules.

Quelle version d'Ubuntu devrais-je utiliser pour LEMP ?

Ubuntu 22.04 LTS est la cible principale de ce guide, comprenant PHP 8.1, MySQL 8.0 et Nginx avec un support à long terme. Ubuntu 24.04 LTS (dernière version) inclut PHP 8.3 par défaut et fonctionne avec ce guide en ajustant les chemins de socket et les numéros de version de PHP-FPM en conséquence.

Comment installer la pile LEMP sur Ubuntu 24.04 ?

Suivez ces étapes principales :

  1. Installer Nginx : sudo apt install nginx
  2. Installer MySQL : sudo apt install mysql-server
  3. Exécutez le script de sécurité MySQL : sudo mysql_secure_installation
  4. Installer PHP-FPM : sudo apt install php-fpm php-mysql
  5. Configurer le bloc de serveur Nginx avec l'intégration PHP-FPM
  6. Test avec info.php et connexion à la base de données

Voir le guide complet dans les étapes 1 à 6 ci-dessus.

Quelle version de PHP devrais-je installer avec Nginx et MySQL ?

Utilisez la version PHP par défaut de votre Ubuntu pour une compatibilité optimale :

  • Ubuntu 22.04 : PHP 8.1 (installé via php8.1-fpm)
  • Ubuntu 24.04 : PHP 8.3 (ajustez les commandes à php8.3-fpm pour cette version)

Les deux versions fonctionnent parfaitement avec Nginx et MySQL 8.0, prennent en charge les frameworks modernes et reçoivent des mises à jour de sécurité actives.

Comment puis-je configurer Nginx pour traiter les fichiers PHP ?

Ajoutez un bloc location ~ \.php$ à la configuration de votre serveur Nginx qui redirige les requêtes PHP vers PHP-FPM via un socket Unix :

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Ajustez le chemin de la socket en fonction de votre version de PHP, testez avec sudo nginx -t, et rechargez avec sudo systemctl reload nginx.

Pourquoi est-ce que je reçois une erreur « 502 Bad Gateway » après avoir installé PHP-FPM ?

Les erreurs 502 indiquent que Nginx ne peut pas communiquer avec PHP-FPM. Causes courantes :

  1. PHP-FPM ne fonctionne pas : Vérifiez avec sudo systemctl status php8.1-fpm et démarrez si nécessaire
  2. Mauvais chemin de socket : Vérifiez que /run/php/php8.1-fpm.sock existe et correspond à votre configuration Nginx
  3. Problème de permissions : Assurez-vous que l'utilisateur Nginx (www-data) peut accéder au socket
  4. Erreur de configuration PHP-FPM : Vérifiez les journaux à /var/log/php8.1-fpm.log

Solution : Redémarrez les deux services :

sudo systemctl restart php8.1-fpm nginx

Comment sécuriser MySQL après l'installation ?

Exécutez le script de sécurité intégré :

sudo mysql_secure_installation

Suivez les instructions pour :

  • Activer le plugin de validation de mot de passe
  • Définir un mot de passe root fort
  • Supprimer les utilisateurs anonymes
  • Désactiver la connexion root à distance
  • Supprimer la base de données de test
  • Recharger les privilèges

Pour les bases de données applicatives, créez des utilisateurs dédiés avec des privilèges limités au lieu d'utiliser le compte root.

Puis-je exécuter plusieurs sites Web sur un seul serveur LEMP ?

Oui, créez des blocs de serveur Nginx séparés pour chaque domaine :

  1. Créer le répertoire : sudo mkdir -p /var/www/second_domain
  2. Créer un bloc de serveur : sudo nano /etc/nginx/sites-available/second_domain
  3. Configurez avec des directives uniques server_name et root
  4. Activer : sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/
  5. Tester et recharger : sudo nginx -t && sudo systemctl reload nginx

Chaque site peut avoir des paramètres PHP et des utilisateurs de base de données séparés.

Comment puis-je mettre à jour PHP vers une version plus récente ?

Les mises à jour des packages Ubuntu gèrent automatiquement les versions mineures. Pour les mises à jour des versions majeures :

  1. Ajoutez le PHP PPA d'Ondřej (référentiel tiers de confiance) :

    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
  2. Installer une nouvelle version de PHP-FPM :

    sudo apt install php8.3-fpm php8.3-mysql -y
  3. Mettre à jour le chemin du socket de la configuration Nginx vers /run/php/php8.3-fpm.sock

  4. Tester et recharger Nginx

  5. Supprimez éventuellement l'ancienne version : sudo apt purge php8.1-fpm

Testez toujours dans l'environnement de test avant de mettre à niveau les systèmes de production.

Résolution des problèmes courants

Erreur 502 Bad Gateway

Le problème le plus courant avec la pile LEMP survient lorsque Nginx ne peut pas communiquer avec PHP-FPM :

Vérifier l'état de PHP-FPM :

sudo systemctl status php8.1-fpm

Vérifier le chemin du socket :

ls -la /run/php/

La sortie attendue devrait montrer le fichier php8.1-fpm.sock.

Corrections courantes :

  1. Redémarrer PHP-FPM : sudo systemctl restart php8.1-fpm
  2. Vérifiez que le chemin du socket du bloc serveur Nginx correspond au socket PHP-FPM réel
  3. Vérifiez les permissions du fichier : sudo chown www-data:www-data /run/php/php8.1-fpm.sock

Erreurs de permission refusée

Corriger les permissions du répertoire web :

sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain

Problèmes de connexion MySQL

Réinitialiser le mot de passe root MySQL :

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

Vérifier le service MySQL :

sudo systemctl status mysql

PHP ne traite pas

Vérifiez les modules PHP :

php -m | grep -E 'mysql|fpm'

Vérifier la configuration de PHP-FPM :

sudo nginx -t
sudo php-fpm8.1 -t

Déboguer les erreurs 404 :

  • Vérifiez que index.php est listé dans la directive index de Nginx
  • Vérifiez si le fichier existe : ls -la /var/www/your_domain/
  • Vérifiez les journaux d'erreurs Nginx : sudo tail -f /var/log/nginx/error.log

Conclusion

Dans ce guide, vous avez construit une base flexible pour servir des sites Web et des applications PHP à vos visiteurs, en utilisant Nginx comme serveur Web et MySQL comme système de base de données. Vous pouvez également le faire avec un serveur Web Apache, consultez notre tutoriel sur la façon d’installer la pile Linux, Apache, MySQL, PHP (LAMP) sur Ubuntu. Vous pouvez aussi sécuriser votre site avec Let’s Encrypt, qui fournit des certificats gratuits et fiables. Apprenez comment le faire avec notre guide sur Let’s Encrypt pour Apache.

Merci d'apprendre avec la communauté Linux-Console.net.