Developer Advocate
Une pile « LAMP » est un groupe de logiciels open-source qui sont généralement installés ensemble afin de permettre à un serveur d’héberger des sites web dynamiques et des applications web écrits en PHP. Ce terme est en fait un sigle qui représente le système d’exploitation Linux, avec le serveur web Apache. Les données du site sont stockées dans une base de données MySQL, et le contenu dynamique est traité par PHP.
Dans ce guide, nous allons installer une pile LAMP sur un serveur Ubuntu 20.04.
Pour pouvoir suivre ce tutoriel, vous devez disposer d’un serveur Ubuntu 20.04 avec un compte utilisateur non-root compatible sudo
et un pare-feu de base. Cela peut être configuré à l’aide de notre Guide de configuration initiale du serveur pour Ubuntu 20.04
Le serveur web Apache est l’un des serveurs web les plus populaires au monde. Il est bien documenté, a une communauté d’utilisateurs active et a été largement utilisé pendant une grande partie de l’histoire du web, ce qui en fait un excellent choix par défaut pour l’hébergement d’un site web.
Installez Apache en utilisant le gestionnaire de paquets d’Ubuntu, apt
:
- sudo apt update
- sudo apt install apache2
Si c’est la première fois que vous utilisez sudo
dans cette session, vous serez invité à fournir votre mot de passe d’utilisateur pour confirmer que vous avez les bons privilèges pour gérer les paquets système avec apt
. Vous serez également invité à confirmer l’installation d’Apache en appuyant sur Y
, puis sur ENTRÉE
.
Une fois l’installation terminée, vous devrez ajuster les paramètres de votre pare-feu pour autoriser le trafic HTTP et HTTPS. UFW a différents profils d’application que vous pouvez exploiter pour y parvenir. Pour obtenir la liste de tous les profils d’application UFW actuellement disponibles, vous pouvez lancer :
- sudo ufw app list
Vous verrez une sortie de ce type :
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
Voici ce que signifie chacun de ces profils :
80
(trafic web normal, non crypté).443
(trafic crypté TLS/SSL).Pour l’instant, il est préférable de n’autoriser que les connexions sur le port 80
, car il s’agit d’une nouvelle installation d’Apache et vous n’avez toujours pas de certificat TLS/SSL configuré pour autoriser le trafic HTTPS sur votre serveur.
Pour n’autoriser le trafic que sur le port 80
, utilisez le profil Apache
:
- sudo ufw allow in "Apache"
Vous pouvez vérifier le changement avec :
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
Le trafic sur le port 80
est désormais autorisé à travers le pare-feu.
Vous pouvez effectuer un contrôle ponctuel immédiatement pour vérifier que tout s’est passé comme prévu en consultant l’adresse IP publique de votre serveur dans votre navigateur web (voir la note sous le titre suivant pour savoir quelle est votre adresse IP publique si vous ne disposez pas déjà de cette information) :
http://your_server_ip
Vous verrez la page web par défaut d’Ubuntu 20.04 Apache qui est là à des fins d’information et de test. Il devrait ressembler à cela :
Si vous voyez cette page, alors votre serveur web est maintenant correctement installé et accessible à travers votre pare-feu.
Si vous ne savez pas quelle est l’adresse IP publique de votre serveur, vous pouvez la trouver de plusieurs façons. En général, il s’agit de l’adresse que vous utilisez pour vous connecter à votre serveur via SSH.
Il existe plusieurs façons de le faire à partir de la ligne de commande. Tout d’abord, vous pouvez utiliser les outils iproute2
pour obtenir votre adresse IP en tapant ceci :
- ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Cela vous permettra de récupérer deux ou trois lignes. Ce sont toutes des adresses correctes, mais votre ordinateur ne pourra peut-être utiliser qu’une seule d’entre elles, alors n’hésitez pas à les essayer toutes.
Une autre méthode consiste à utiliser l’utilitaire curl
pour contacter une partie extérieure afin de vous dire comment elle voit votre serveur. Cela se fait en demandant à un serveur spécifique quelle est votre adresse IP :
- curl http://icanhazip.com
Quelle que soit la méthode que vous utilisez pour obtenir votre adresse IP, tapez celle-ci dans la barre d’adresse de votre navigateur web pour afficher la page Apache par défaut.
Maintenant que vous avez un serveur web opérationnel, vous devez installer le système de base de données pour pouvoir stocker et gérer les données de votre site. MySQL est un système de gestion de base de données populaire utilisé dans les environnements PHP.
Là encore, utilisez apt
pour acquérir et installer ce logiciel :
- sudo apt install mysql-server
Lorsque vous y êtes invité, confirmez l’installation en tapant Y
, puis ENTRÉE
.
Une fois l’installation terminée, il est recommandé d’exécuter un script de sécurité, préinstallé avec MySQL. Ce script supprimera certains paramètres par défaut peu sûrs et verrouillera l’accès à votre système de base de données. Lancez le script interactif en exécutant :
- sudo mysql_secure_installation
Il vous sera demandé si vous souhaitez configurer le VALIDATE PASSWORD PLUGIN
.
Note : L’activation de cette fonction est en quelque sorte une question de jugement. Si elle est activée, les mots de passe qui ne correspondent pas aux critères spécifiés seront rejetés par MySQL avec une erreur. Laisser la validation désactivée est sans risque, mais vous devez toujours utiliser des mots de passe forts et uniques pour les identifiants de la base de données.
Répondez Y
pour oui, ou tout autre chose pour continuer sans activer.
VALIDATE PASSWORD PLUGIN 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 plugin?
Press y|Y for Yes, any other key for No:
Si vous répondez « oui », il vous sera demandé de choisir un niveau de validation du mot de passe. Gardez à l’esprit que si vous entrez 2
pour le niveau le plus fort, 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, ou qui est basé sur des mots communs du dictionnaire.
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 ayez ou non choisi de configurer le VALIDATE PASSWORD PLUGIN
, votre serveur vous demandera ensuite de sélectionner et de confirmer un mot de passe pour l’utilisateur root de MySQL. Il ne faut pas confondre ce dernier avec le root du système. L’utilisateur root de la base de données est un utilisateur administratif disposant de 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 si celui-ci est défini, vous devez définir ici un mot de passe fort pour plus de sécurité. Nous en parlerons dans un instant.
Si vous avez activé la validation du mot de passe, la force du mot de passe root que vous venez d’entrer vous sera indiquée et votre serveur vous demandera si vous voulez continuer avec ce mot de passe. Si vous êtes satisfait de votre mot de passe actuel, saisissez 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 ENTRÉE
à chaque invite. Cela supprimera les 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 apportées.
Lorsque vous avez terminé, vérifiez si vous êtes capable de vous connecter à la console MySQL en tapant :
- sudo mysql
Cela permettra de se connecter au serveur MySQL en tant que root de l’utilisateur de la base de données administrative, 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 MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
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, tapez :
- exit
Notez que vous n’avez pas eu 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
. En effet, la méthode d’authentification par défaut pour l’utilisateur administratif de MySQL est unix_socket
au lieu du mot de passe
. Même si cela peut sembler être un problème de sécurité au premier abord, cela rend le serveur de base de données plus sûr car les seuls utilisateurs autorisés à se connecter en tant qu’utilisateur MySQL root sont les utilisateurs du système ayant des privilèges sudo qui se connectent depuis la console ou par le biais d’une application fonctionnant avec les mêmes privilèges. Concrètement, cela signifie que vous ne pourrez pas utiliser l’utilisateur root de la base de données administrative pour vous connecter à partir de votre application PHP. La définition d’un mot de passe pour le compte root MySQL fonctionne comme une sauvegarde, dans le cas où la méthode d’authentification par défaut est changée de unix_socket
au mot de passe
.
Pour une sécurité accrue, il est préférable de créer des comptes d’utilisateurs dédiés avec des privilèges moins étendus pour chaque base de données, surtout si vous prévoyez d’héberger plusieurs bases de données sur votre serveur.
Note : Au moment de la rédaction de ce document, la bibliothèque MySQL PHP native mysqlnd
ne prend pas en charge caching_sha2_authentification
,la méthode d’authentification par défaut pour MySQL 8. Pour cette raison, lorsque vous créez des utilisateurs de base de données pour des applications PHP sur MySQL 8, vous devez vous assurer qu’ils sont configurés pour utiliser le mot de passe mysql_native_password
à la place. Nous démontrerons comment le faire dans l’Étape 6.
<$>
Votre serveur MySQL est maintenant installé et sécurisé. Ensuite, nous allons installer PHP, le dernier composant de la pile LAMP.
Vous avez installé Apache pour servir votre contenu et MySQL pour stocker et gérer vos données. PHP est le composant de notre installation qui traitera le code pour afficher un contenu dynamique à l’utilisateur final. En plus du paquet php
, vous aurez besoin de php-mysql
, un module PHP qui permet à PHP de communiquer avec des bases de données MySQL. Vous aurez également besoin de libapache2-mod-php
pour permettre à Apache de gérer les fichiers PHP. Les packages PHP de base seront automatiquement installés en tant que dépendances.
Pour installer ces paquets, exécutez :
- sudo apt install php libapache2-mod-php php-mysql
Une fois l’installation terminée, vous pouvez exécuter la commande suivante pour confirmer votre version de PHP :
- php -v
OutputPHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
À ce stade, votre pile LAMP est pleinement opérationnelle, mais avant de pouvoir tester votre installation avec un script PHP, il est préférable de mettre en place un hôte virtuel Apache approprié pour conserver les fichiers et dossiers de votre site web. C’est ce que nous ferons dans la prochaine étape.
Lorsque vous utilisez le serveur web Apache, vous pouvez créer des hôtes virtuels (similaires aux blocs de serveurs dans Nginx) pour encapsuler les détails de la configuration et héberger plusieurs domaines à partir d’un seul serveur. Dans ce guide, nous allons mettre en place un domaine appelé your_domain, mais vous devez le remplacer par votre propre nom de domaine.
<$>[note] Note : si vous utilisez DigitalOcean comme fournisseur d’hébergement DNS, vous pouvez consulter la documentation de nos produits pour obtenir des instructions détaillées sur la façon de configurer un nouveau nom de domaine et de le faire pointer vers votre serveur.
Apache sur Ubuntu 20.04 a un bloc serveur activé par défaut qui est configuré pour servir des documents à partir du répertoire /var/www/html
. Même si cela fonctionne bien pour un seul site, cela peut devenir ingérable si vous hébergez plusieurs sites. Au lieu de modifier /var/www/html
, nous allons créer une structure de répertoire au sein de /var/www
pour le site your_domain, en laissant /var/www/html
en place comme répertoire par défaut à servir si une demande du client ne correspond à aucun autre site.
Créez le répertoire pour your_domain comme suit :
- sudo mkdir /var/www/your_domain
Ensuite, attribuez la propriété du répertoire avec la variable d’environnement $USER
qui fera référence à votre utilisateur actuel du système :
- sudo chown -R $USER:$USER /var/www/your_domain
Ouvrez ensuite un nouveau fichier de configuration dans le répertoire sites-available
en utilisant votre éditeur de ligne de commande préféré. Ici, nous utiliserons nano
:
- sudo nano /etc/apache2/sites-available/your_domain.conf
Cela créera un nouveau fichier vierge. Collez dans la configuration suivante :
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Avec cette configuration de VirtualHost
, nous disons à Apache de servir your_domain
en utilisant /var/www/your_domain
comme répertoire root web. Si vous souhaitez tester Apache sans nom de domaine, vous pouvez supprimer ou commenter les options ServerName
et ServerAlias
en ajoutant un caractère #
au début des lignes de chaque option.
Vous pouvez désormais utiliser a2ensite
pour activer le nouvel hôte virtuel :
- sudo a2ensite your_domain
Vous voudrez peut-être désactiver le site web par défaut qui est installé avec Apache. Ceci est nécessaire si vous n’utilisez pas un nom de domaine personnalisé car, dans ce cas, la configuration par défaut d’Apache écraserait votre hôte virtuel. Pour désactiver le site web par défaut d’Apache, tapez :
- sudo a2dissite 000-default
Pour vous assurer que votre fichier de configuration ne contient pas d’erreurs de syntaxe, exécutez :
- sudo apache2ctl configtest
Enfin, relancez Apache pour que ces changements prennent effet :
- sudo systemctl reload apache2
Votre nouveau site web est maintenant actif, mais le root web /var/www/your_domain
est toujours vide. Créez un fichier index.html
à cet endroit afin que nous puissions vérifier que l’hôte virtuel fonctionne comme prévu :
- nano /var/www/your_domain/index.html
Incluez le contenu suivant dans ce dossier :
<h1>It works!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
Now open your browser and access the domain name or IP address of your server on port 8000 :
http://server_domain_or_IP
Vous verrez une page comme celle-ci :
Si vous voyez cette page, cela signifie que votre hôte virtuel Apache fonctionne comme prévu.
Vous pouvez laisser ce fichier en place en tant que page d’accueil temporaire pour votre application jusqu’à ce que vous créiez un fichier index.php
pour le remplacer. Une fois que vous aurez fait cela, n’oubliez pas de supprimer ou de renommer le fichier index.html
du root de votre document, car il aura la priorité sur un fichier index.php
par défaut.
DirectoryIndex
sur ApacheAvec le DirectoryIndex
par défaut sur Apache, un fichier nommé index.html
aura toujours la priorité sur un fichier index.php
. Ceci est utile pour la mise en place de pages de maintenance dans les applications PHP, en créant un fichier index.html
temporaire contenant un message informatif aux visiteurs. Comme cette page aura la priorité sur la page index.php
, elle deviendra alors la page d’accueil de l’application. Une fois la maintenance terminée, l’index.html
est renommé ou supprimé du root du document, ce qui ramène la page de demande normale.
Si vous voulez changer ce comportement, vous devez modifier le fichier /etc/apache2/mods-enabled/dir.conf
et modifier l’ordre dans lequel le fichier index.php
est répertorié au sein de la directive DirectoryIndex
:
- sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
Après avoir enregistré et fermé le fichier, vous devrez relancer Apache pour que les changements prennent effet :
- sudo systemctl reload apache2
Dans l’étape suivante, nous allons créer un script PHP pour tester que PHP est correctement installé et configuré sur votre serveur.
Maintenant que vous avez un emplacement personnalisé pour héberger les fichiers et dossiers de votre site web, nous allons créer un script de test PHP pour confirmer qu’Apache est capable de gérer et de traiter les demandes de fichiers PHP.
Créer un nouveau fichier nommé info.php
à l’intérieur de votre dossier root web personnalisé :
- nano /var/www/your_domain/info.php
Cela ouvrira un fichier vierge. Ajoutez le texte suivant qui est un code PHP valide à l’intérieur du fichier :
<?php
phpinfo();
Lorsque vous avez terminé, enregistrez et fermez le fichier.
Pour tester ce script, allez dans votre navigateur web et accédez au nom de domaine ou à l’adresse IP de votre serveur, suivi du nom du script, qui dans ce cas est info.php
:
http://server_domain_or_IP/info.php
Vous verrez une page similaire à celle-ci :
Cette page fournit des informations sur votre serveur du point de vue de PHP. Il est utile pour le débogage et pour s’assurer que vos paramètres sont appliqués correctement.
Si vous pouvez voir cette page dans votre navigateur, alors votre installation de PHP fonctionne comme prévu.
Après avoir vérifié les informations pertinentes sur votre serveur PHP par le biais de 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 sur votre serveur Ubuntu). Pour ce faire, vous pouvez utiliser rm
:
- sudo rm /var/www/your_domain/info.php
Vous pouvez toujours recréer cette page si vous avez besoin d’accéder à nouveau aux informations plus tard.
Si vous souhaitez tester si PHP est capable de se connecter à MySQL 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. Avant cela, nous devons créer une base de données test et un nouvel utilisateur MySQL correctement configuré pour y accéder.
Au moment de la rédaction du présent document, la bibliothèque MySQL PHP native mysqlnd
ne prend pas en charge caching_sha2_authentification
, la méthode d’authentification par défaut pour MySQL 8. Nous devrons créer un nouvel utilisateur avec le mot de passe mysql_native_password
afin de pouvoir se connecter à la base de données MySQL à partir de PHP.
Nous allons créer une base de données appelée exemple_database et un utilisateur nommé example_user, mais vous pouvez remplacer ces noms par des valeurs différentes.
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 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 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 devez 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 une 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.
Maintenant, quittez le shell MySQL avec :
- exit
Vous pouvez tester si le nouvel utilisateur a les bonnes autorisations en vous connectant à nouveau à la console MySQL, cette fois-ci en utilisant les identifiants personnalisés de l’utilisateur :
- mysql -u example_user -p
Remarquez le drapeau -p
dans cette commande qui vous demandera le mot de passe utilisé lors de la création de l’utilisateur example_user. Après vous être connecté à la console MySQL, confirmez que vous avez accès à la base de données example_database :
- SHOW DATABASES;
Cela donnera la sortie suivante :
Output+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)
Ensuite, nous allons créer une table de test appelée todo_list. Depuis la console MySQL, lancez la déclaration 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 pouvez 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 tableau, 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 votre table de test contient des données valides, vous pouvez quitter la console MySQL :
- exit
Vous pouvez maintenant créer le script PHP qui se connectera à MySQL et interrogera votre contenu. Créez un nouveau fichier PHP dans votre répertoire root 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 y aura une exception. Copiez ce contenu dans 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 fini de le modifier.
Vous pouvez maintenant accéder à cette page dans votre navigateur web, en entrant le nom de domaine ou l’adresse IP publique de votre site web, suivi(e) de /todo_list.php
:
http://your_domain/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 MySQL.
Dans ce guide, nous avons établi une base souple pour offrir des sites web et des applications PHP à vos visiteurs en utilisant Apache comme serveur web et MySQL comme système de base de données.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
GOOD JOB ! but… IS NOT DocumentRoot /var/www/your_domain in /etc/apache2/sites-available/your_domain.conf IS DocumentRoot /var/www/html/your_domain
Thanks