Comment installer la pile Linux, Nginx, MySQL, PHP (LEMP) sur CentOS 8

De Get Docs
Aller à :navigation, rechercher

Introduction

La pile logicielle LEMP est un groupe de logiciels qui peuvent être utilisés pour servir des pages Web dynamiques et des applications Web écrites en PHP. Le nom "LEMP" est un acronyme qui décrit un système d'exploitation Linux avec un serveur Web Nginx (prononcé comme "Engine-X"). Les données backend sont stockées dans une base de données MariaDB et le traitement dynamique est géré par PHP.

La couche de base de données dans une pile LEMP est généralement un serveur de base de données MySQL, mais avant la sortie de CentOS 8, MySQL n'était pas disponible à partir des référentiels CentOS par défaut. Pour cette raison, MariaDB, un fork communautaire de MySQL, est devenu une alternative largement acceptée à MySQL en tant que système de base de données par défaut pour les piles LEMP sur les machines CentOS. MariaDB fonctionne comme un remplacement direct du serveur MySQL d'origine, ce qui signifie en pratique que vous pouvez passer à MariaDB sans avoir à modifier la configuration ou le code de votre application.

Dans ce guide, vous allez installer une pile LEMP sur un serveur CentOS 8. Bien que MySQL soit disponible à partir des référentiels par défaut de CentOS 8, ce guide vous guidera tout au long du processus de configuration d'une pile LEMP avec MariaDB comme système de gestion de base de données.

Conditions préalables

Pour suivre ce guide, vous aurez besoin d'accéder à un serveur CentOS 8 en tant qu'utilisateur non root avec des privilèges sudo et un pare-feu actif installé sur votre serveur. Pour le configurer, vous pouvez suivre notre Guide de configuration initiale du serveur pour CentOS 8.

Étape 1 - Installation du serveur Web Nginx

Afin d'afficher les pages Web aux visiteurs de notre site, nous allons utiliser Nginx, un serveur Web haute performance. Nous utiliserons le gestionnaire de packages dnf, qui est le nouveau gestionnaire de packages par défaut sur CentOS 8, pour installer ce logiciel.

Installez le package nginx avec :

sudo dnf install nginx

Lorsque vous y êtes invité, saisissez y pour confirmer que vous souhaitez installer nginx.

Une fois l'installation terminée, exécutez la commande suivante pour activer et démarrer le serveur :

sudo systemctl start nginx

Si vous avez activé le pare-feu firewalld conformément à notre guide de configuration initiale du serveur, vous devrez autoriser les connexions à Nginx. La commande suivante activera de manière permanente les connexions HTTP, qui s'exécutent sur le port 80 par défaut :

sudo firewall-cmd --permanent --add-service=http

Pour vérifier que la modification a été appliquée, vous pouvez exécuter :

sudo firewall-cmd --permanent --list-all

Vous verrez une sortie comme celle-ci :

Outputpublic
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Vous devrez recharger la configuration du pare-feu pour que les modifications prennent effet :

sudo firewall-cmd --reload

Avec la nouvelle règle de pare-feu ajoutée, vous pouvez tester si le serveur est opérationnel en accédant à l'adresse IP publique ou au nom de domaine de votre serveur à partir de votre navigateur Web.

Remarque : Si vous utilisez DigitalOcean comme fournisseur d'hébergement DNS, vous pouvez consulter nos documents sur les produits pour obtenir des instructions détaillées sur la configuration d'un nouveau nom de domaine et le faire pointer vers votre serveur.


Si vous n'avez pas de nom de domaine pointé vers votre serveur et que vous ne connaissez pas l'adresse IP publique de votre serveur, vous pouvez la trouver en exécutant la commande suivante :

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Cela imprimera quelques adresses IP. Vous pouvez essayer chacun d'eux à 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

Tapez l'adresse que vous recevez dans votre navigateur Web et vous serez redirigé vers la page de destination par défaut de Nginx :

Si vous voyez cette page, votre serveur Web est maintenant correctement installé.

Étape 2 - Installation de MariaDB

Maintenant que vous avez un serveur Web opérationnel, vous devez installer un système de base de données pour pouvoir stocker et gérer les données de votre site. Nous allons installer MariaDB, un fork développé par la communauté du serveur MySQL d'origine par Oracle.

Pour installer ce logiciel, exécutez :

sudo dnf install mariadb-server

Lorsque l'installation est terminée, vous pouvez activer et démarrer le serveur MariaDB avec :

sudo systemctl start mariadb

Pour améliorer la sécurité de votre serveur de base de données, il est recommandé d'exécuter un script de sécurité préinstallé avec MariaDB. Ce script supprimera certains paramètres par défaut non sécurisés et verrouillera l'accès à votre système de base de données. Démarrez le script interactif en exécutant :

sudo mysql_secure_installation

Ce script vous guidera à travers une série d'invites où vous pourrez apporter des modifications à votre configuration MariaDB. La première invite vous demandera d'entrer le mot de passe actuel de la racine de la base de données '. Cela ne doit pas être confondu avec l'utilisateur racine du système '. L'utilisateur base de données racine est un utilisateur administratif disposant de tous les privilèges sur le système de base de données. Étant donné que vous venez d'installer MariaDB et que vous n'avez pas encore apporté de modifications à la configuration, ce mot de passe sera vide, il vous suffit donc d'appuyer sur ENTER à l'invite.

L'invite suivante vous demande si vous souhaitez configurer un mot de passe racine de la base de données '. Étant donné que MariaDB utilise une méthode d'authentification spéciale pour l'utilisateur root' qui est généralement plus sûre que l'utilisation d'un mot de passe, vous n'avez pas besoin de la définir maintenant. Tapez N puis appuyez sur ENTER.

À partir de là, vous pouvez appuyer sur Y puis sur ENTER pour accepter les valeurs par défaut pour toutes les questions suivantes. Cela supprimera les utilisateurs anonymes et la base de données de test, désactivera la connexion à distance root et chargera ces nouvelles règles afin que le serveur respecte immédiatement les modifications que vous avez apportées.

Lorsque vous avez terminé, connectez-vous à la console MariaDB en tapant :

sudo mysql

Cela se connectera au serveur MariaDB en tant qu'utilisateur de la base de données administrative root, ce qui est déduit par l'utilisation de sudo lors de l'exécution de cette commande. Vous devriez voir une sortie comme celle-ci :

OutputWelcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> 

Notez que vous n'avez pas eu besoin de fournir un mot de passe pour vous connecter en tant qu'utilisateur root. Cela fonctionne car la méthode d'authentification par défaut pour l'utilisateur administratif de MariaDB est unix_socket au lieu de password. Même si cela peut sembler un problème de sécurité au premier abord, cela rend le serveur de base de données plus sécurisé car les seuls utilisateurs autorisés à se connecter en tant qu'utilisateur root MariaDB sont les utilisateurs système avec des privilèges sudo se connectant depuis la console ou via une application fonctionnant avec les mêmes privilèges. Concrètement, cela signifie que vous ne pourrez pas utiliser l'utilisateur de la base de données administrative 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'avoir plusieurs bases de données hébergées sur votre serveur. Pour illustrer une telle configuration, 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 des valeurs différentes.

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

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 venez de créer. La commande suivante définit le mot de passe de cet utilisateur comme password, mais vous devez remplacer cette valeur par un mot de passe sécurisé de votre choix :

GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

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.

Videz les privilèges pour vous assurer qu'ils sont enregistrés et disponibles dans la session en cours :

FLUSH PRIVILEGES;

Ensuite, quittez le shell MariaDB :

exit

Vous pouvez tester si le nouvel utilisateur dispose des autorisations appropriées en vous connectant à nouveau à la console MariaDB, cette fois en utilisant les informations d'identification personnalisées :

mysql -u example_user -p

Notez l'indicateur -p dans cette commande, qui vous demandera le mot de passe que vous avez choisi lors de la création de l'utilisateur example_user. Après vous être connecté à la console MariaDB, confirmez que vous avez accès à la base de données example\_database :

SHOW DATABASES;

Cela vous donnera la sortie suivante :

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

Pour quitter le shell MariaDB, tapez :

exit

À ce stade, votre système de base de données est configuré et vous pouvez passer à l'installation de PHP, le dernier composant de la pile LEMP.

Étape 3 - Installation de PHP-FPM

Vous avez installé Nginx pour diffuser votre contenu et MariaDB pour stocker et gérer vos données. Vous pouvez maintenant installer PHP pour traiter le code et générer du contenu dynamique pour le serveur Web.

Alors qu'Apache intègre l'interpréteur PHP dans chaque requête, Nginx nécessite un programme externe pour gérer le traitement PHP et servir de pont entre l'interpréteur PHP lui-même et le serveur Web. Cela permet une meilleure performance globale dans la plupart des sites Web basés sur PHP, mais cela nécessite une configuration supplémentaire. Vous devrez installer php-fpm, qui signifie « gestionnaire de processus PHP fastCGI », et dire à Nginx de transmettre les requêtes PHP à ce logiciel pour traitement. De plus, vous aurez besoin de php-mysqlnd, un module PHP qui permet à PHP de communiquer avec des bases de données basées sur MySQL. Les packages PHP principaux seront automatiquement installés en tant que dépendances.

Pour installer les packages php-fpm et php-mysql, exécutez :

sudo dnf install php-fpm php-mysqlnd

Une fois l'installation terminée, vous devrez modifier le fichier /etc/php-fpm.d/www.conf afin d'ajuster quelques paramètres.

L'éditeur de texte par défaut fourni avec CentOS 8 est vi. vi est un éditeur de texte extrêmement puissant, mais il peut être quelque peu obtus pour les utilisateurs qui manquent d'expérience avec lui. Vous voudrez peut-être installer un éditeur plus convivial tel que nano pour faciliter l'édition des fichiers de configuration sur votre serveur CentOS 8 :

sudo dnf install nano

Ouvrez maintenant le fichier de configuration /etc/php-fpm.d/www.conf en utilisant nano ou l'éditeur de votre choix :

sudo nano /etc/php-fpm.d/www.conf

Cherchez maintenant les directives user et group. Si vous utilisez nano, vous pouvez appuyer sur CTRL+W pour rechercher ces termes dans le fichier ouvert.

/etc/php-fpm.d/www.conf

…
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
…

Vous remarquerez que les variables user et group sont définies sur apache. Nous devons les changer en nginx :

/etc/php-fpm.d/www.conf

…
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
…

Enregistrez et fermez le fichier lorsque vous avez terminé l'édition. Si vous utilisez nano, faites-le en appuyant sur CTRL + X, puis Y et ENTER.

Pour activer et démarrer le service php-fpm, exécutez :

sudo systemctl start php-fpm

Enfin, redémarrez le serveur Web Nginx pour qu'il charge les fichiers de configuration créés par l'installation php-fpm :

sudo systemctl restart nginx

Votre serveur Web est maintenant entièrement configuré. Dans l'étape suivante, nous allons créer un script de test PHP pour nous assurer que tout fonctionne comme prévu.

Étape 4 - Tester PHP avec Nginx

Sur CentOS 8, l'installation par défaut php-fpm crée automatiquement des fichiers de configuration qui permettront à votre serveur Web Nginx de gérer les fichiers .php dans la racine de document par défaut située à /usr/share/nginx/html. Vous n'aurez pas besoin d'apporter de modifications à la configuration de Nginx pour que PHP fonctionne correctement sur votre serveur Web.

Le seul ajustement que nous ferons est de modifier les paramètres d'autorisation par défaut sur votre dossier racine de document Nginx. De cette façon, vous pourrez créer et modifier des fichiers dans ce répertoire avec votre utilisateur système habituel, sans avoir besoin de préfixer chaque commande avec sudo.

La commande suivante changera la propriété de la racine du document Nginx par défaut en un utilisateur et un groupe appelés sammy, alors assurez-vous de remplacer le nom d'utilisateur et le groupe en surbrillance dans cette commande pour refléter le nom d'utilisateur et le groupe de votre système.

sudo chown -R sammy.sammy /usr/share/nginx/html/

Nous allons maintenant créer une page PHP de test pour nous assurer que le serveur Web fonctionne comme prévu.

Créez un nouveau fichier PHP nommé info.php dans le répertoire /usr/share/nginx/html :

nano /usr/share/nginx/html/info.php

Le code PHP suivant affichera des informations sur l'environnement PHP actuel en cours d'exécution sur le serveur :

/usr/share/nginx/html/info.php

<?php

phpinfo();

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

Nous pouvons maintenant tester si notre serveur Web peut afficher correctement le contenu généré par un script PHP. Accédez à votre navigateur et accédez au nom d'hôte ou à l'adresse IP de votre serveur, suivi de /info.php :

http://server_host_or_IP/info.php

Vous verrez une page semblable à celle-ci :

Après avoir vérifié les informations pertinentes sur 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 CentOS. Vous pouvez utiliser rm pour supprimer ce fichier :

rm /usr/share/nginx/html/info.php

Vous pouvez toujours régénérer ce fichier si vous en avez besoin ultérieurement. Ensuite, nous testerons la connexion à la base de données du côté PHP.

Étape 5 - Test de la connexion à la base de données à partir de PHP (facultatif)

Si vous souhaitez tester si PHP est capable de se connecter à MariaDB et d'exécuter des requêtes de base de données, vous pouvez créer une table de test avec des données factices et interroger son contenu à partir d'un script PHP.

Tout d'abord, connectez-vous à la console MariaDB avec l'utilisateur de base de données que vous avez créé à l'Étape 2 de ce guide :

mysql -u example_user -p

Créez une table nommée todo_list. Depuis la console MariaDB, exécutez l'instruction suivante :

CREATE TABLE example_database.todo_list (
    item_id INT AUTO_INCREMENT,
    content VARCHAR(255),
    PRIMARY KEY(item_id)
);

Maintenant, insérez quelques lignes de contenu dans la table de test. Vous voudrez peut-être 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 bien été enregistrées dans votre table, exécutez :

SELECT * FROM example_database.todo_list;

Vous verrez la sortie suivante :

Output+---------+--------------------------+
| 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 disposez de données valides dans votre table de test, vous pouvez quitter la console MariaDB :

exit

Vous pouvez maintenant créer le script PHP qui se connectera à MariaDB et demandera votre contenu. Créez un nouveau fichier PHP dans votre répertoire racine Web personnalisé à l'aide de votre éditeur préféré. Nous utiliserons nano pour cela :

nano /usr/share/nginx/html/todo_list.php

Ajoutez le contenu suivant à votre script PHP :

/usr/share/nginx/html/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é l'édition.

Vous pouvez maintenant accéder à cette page dans votre navigateur Web en visitant le nom d'hôte ou l'adresse IP publique de votre serveur, suivi de /todo_list.php :

http://server_host_or_IP/todo_list.php

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

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

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. Vous avez configuré Nginx pour gérer les requêtes PHP via php-fpm, et vous avez également configuré une base de données MariaDB pour stocker les données de votre site Web.