Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

Installation et configuration d'un serveur LAMP

Dernière mise à jour le 16 octobre 2022

Location d'un VPS

Cette section sur la location d'un VPS regarde uniquement les élèves qui auront choisi cette option. Ceux qui ont déjà à leur disposition un serveur Linux qui tourne 24 heures sur 24 avec une adresse IP publique (même si changeante) peuvent passer directement à la section suivante.

Rendez-vous sur la page des serveurs privés virtuels de la compagnie OVHcloud.

Choisissez le type de serveur que vous voulez et louez-le pour le temps que vous voulez. Sachez toutefois que vous aurez besoin d'un serveur jusqu'à la fin de la session, soit pour les trois prochains mois.

La version la moins chère, le VPS Starter, suffit amplement à nos besoins.

Après avoir choisi l'option Starter (ou une autre, si vous préférez), sélectionnez un système d'exploitation. Cliquez sur Distribution uniquement et choisissez Ubuntu Server 22.04 qui est une version LTS.

À partir d'ici, aucune autre option n'est requise. Vous pouvez compléter le parcours et passer à la caisse. Si c'est votre première visite chez OVHcloud, vous serez invité à créer un compte.

Après avoir complété votre commande, vous recevrez rapidement par courriel :

Vous pouvez dès maintenant vous connecter à votre VPS en utilisant votre client SSH préféré. Si vous n'avez pas d'expérience avec ce genre d'outil, nous vous suggérons d'aller faire connaissance avec PuTTY avant de continuer.

Créer un superusager

Maintenant que vous avez en main l'adresse IP de votre VPS, le mot de passe de l'usager ubuntu et que vous êtes en mesure de vous connecter à distance, la première chose à faire est de créer un utilisateur ayant tous les droits pour assurer la gestion du serveur.

Mais pourquoi ne pas tout simplement utilier le compte "root"? Parce qu'il est dangereux d'effectuer notre travail quotidien comme "root". Cet utilisateur ayant tous les droits, la moindre maladresse, comme la suppression accidentelle d'un répertoire système, n'est arrêtée par aucun mécanisme de sécurité.

Le superusager que nous allons créer n'a pas constamment ce genre de pouvoir, mais peut lui faire appel lorsque nécessaire avec la commande sudo.

Mais alors, pourquoi ne pas utiliser le compte "ubuntu", puisque c'est déjà un superusager? Tout simplement parce que tout les pirates savent qu'il existe un usager "ubuntu" et que ce dernier pourrait être utilisé lors d'une tentative d'intrusion. C'est la raison pour laquelle nous bloquerons plus loin l'accès à distance de cet usager.

Commençons donc par créer un superusager que nous appellerons "patoche" (vous pouvez bien sûr, et j'espère que vous le ferez, choisir un autre pseudonyme). La commande suivante crée l'utilisateur, lui donne un répertoire personnel qui sera /home/patoche et lui assigne un shell (interpréteur de commande).

$ sudo useradd -d /home/patoche -m -s /bin/bash patoche

Maintenant donnons à cet utilisateur tous les pouvoirs de "root" en faisant de lui un "sudoer", c'est-à-dire un utilisateur autorisé à exécuter la commande sudo.

$ sudo usermod -aG sudo patoche

La commande sudo permet d'exécuter n'importe quel programme externe ou commande système avec les privilèges de "root".

Mais avant de continuer, donnons un mot de passe à ce nouvel utilisateur :

$ sudo passwd patoche
Enter new UNIX password: jaimemonprof
Retype new UNIX password: jaimemonprof
passwd: password updated successfully

Vous pouvez maintenant vous déconnecter. La commande exit terminera l'exécution du shell (le programme interpréteur de commandes) et mettra fin du même coup à votre session PuTTY.

$ exit

Lancez à nouveau PuTTY et connectez-vous maintenant en utilisant votre nouvel identifiant :

login as: patoche
patoche@144.217.5.158's password: jaimemonprof
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.4.8-73-generic x84_64)

...

Maintenant, vérifions si "patoche" peut faire quelque chose qui est normalement interdit, comme visualiser le contenu du répertoire personnel de "root" :

$ sudo ls -la /root
[sudo] password for patoche: jaimemonprof
...

Si la commande réussie (la liste des fichiers est affichée), c'est que "patoche" est bien un "sudoer".

Interdire la connexion distante à l'usager "root"

Après avoir créé un superusager, la deuxième chose à faire pour protéger notre VPS est d'interdire la connexion à distance de "root". Non seulement la possibilité pour "root" de se connecter à distance n'est pas nécessaire, puique nous pouvons maintenant tout faire depuis le compte "patoche", mais elle est carrément dangereuse.

Internet est une jungle : 24 heures sur 24, des milliers d'ordinateurs (basés surtout en Chine et en Russie) tentent des connexions à tous les ports TCP et à toutes les adresses IP existantes dans le but d'installer sur des machines vulnérables toutes sortes de programmes pas trop sympathiques (si vous en doutez, allez jeter un coup d'oeil aux fichiers de journalisation de votre VPS). Et sur quel compte utilisateur croyez-vous que ces programmes tentent de se connecter? Vous avez deviné juste, c'est le compte "root", pas le compte "patoche"!

Après en avoir fait une copie de sauvegarde (bonne habitude à prendre), éditez le fichier /etc/ssh/sshd_config :

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ sudo nano /etc/ssh/sshd_config

Rendez-vous à la toute fin du fichier et supprimez la ligne suivante :

PermitRootLogin yes

Notez que si vous aviez reçu par courriel le mot de passe de l'usager "ubuntu" et non celui de l'usager "root", la connexion distante de "root" était probablement déjà interdite.

Si vous avez modifié le fichier de configuration, redémarrez le service SSH :

$ sudo systemctl restart ssh

Interdire la connexion distante à l'usager "ubuntu" NOUVEAU

Pusique l'usager "ubuntu" est créé automatiquement lors de l'installation du système et qu'il s'agit d'un superusager, il est prudent, comme pour l'usager "root", de lui interdire de se conencter à distance.

Une fois de plus nous éditerons le fichier de configuration du serveur SSH, mais en utilisant cette fois une autre directive.

Ouvrez pour l'édition le fichier /etc/ssh/sshd_config :

$ sudo nano /etc/ssh/sshd_config

Rendez-vous à la toute fin du fichier et ajoutez la ligne suivante :

DenyUsers ubuntu

Redémarrez le service SSH pour qu'il tienne compte de la modification :

$ sudo systemctl restart ssh

Notez que la directive "DenyUsers" peut être utilisée pour interdire l'accès distant à n'importe quel usager du système.

Installer Apache

Apache est depuis les début du Web l'un des serveurs HTTP (serveurs Web) les plus utilisés et les plus populaires, position qu'il partage maintenant avec Nginx. Il est sûrement aussi le plus documenté. Il s'agit d'un logiciel libre.

Entrez les commandes suivantes pour installer Apache :

$ sudo apt update 
$ sudo apt install apache2

Une fois l'installation terminée, testez-la en visualisant la page à l'URL http://adresse_ip_du_serveur/. Vous devriez voir la page d'accueil standard :

Pour valider au besoin la syntaxe après une modification du fichier /etc/apache2/apache2.conf :

$ sudo apache2ctl configtest

Et cherchez dans la réponse la chaîne "Syntax OK".

Autoriser les sites Web personnels

Ce que nous entendons par site Web personnel est l'arborescence de documents contenue dans le répertoire public_html de l'usager et normalement visble à l'URL : http://domaine_ou_ip/~usager

Si un message "404 Not Found" est affiché lorsque cette URL est chargée dans le navigateur, c'est que le module "userdir" n'a pas été activé.

Pour activer ce module, les commandes à effectuer sont les suivantes :

$ sudo a2enmod userdir
$ sudo systemctl restart apache2

Notez que la commande pour désactiver un module (le contraire de "a2enmod") est "a2dismod".

Le contenu du répetoire public_html, soit le fichier index.html ou encore la liste des fichiers et des sous-répertoires, est maintenant affiché.

En l'absence d'un répertoire public_html, c'est un message "403 Forbidden" qui est affiché.

Configurer le répertoire racine du serveur

Maintenant que vous êtes propriétaire de votre serveur, vous avez la possibilité d'utiliser pour votre site Web le répertoire racine de celui-ci, plutôt que votre répertoire personnel. Un site Web à l'URL http://domaine.com fait meilleur effet qu'un site dont l'adresse est http://domaine.com/~patoche!

Le répertoire racine du serveur Web Apache est par défaut /var/www/html. Le problème pour nous est qu'il est généralement la propriété de l'usager "root". Cela cause des problèmes lors du transfert de fichiers avec un client FTP (ex : FileZilla) et exige l'utilisation fréquente de la commande "sudo" lorsque l'on travaille en mode console.

Voici la solution la plus répandue au problème :

D'abord, il s'agit de faire de vous l'usager propriétaire du répertoire et de tout ce qu'il contient :

$ sudo chown -R patoche /var/www/html/

Ensuite, faites en sorte que le groupe propriétaire du répertoire et des fichiers soit "www-data" :

$ sudo chgrp -R www-data /var/www/html/

Puis, changez les droits d'accès pour que vous puissiez lire, écrire et exécuter tout le contenu du répertoire Web et que le groupe "www-data" puisse de son côté lire et exécuter :

$ sudo chmod -R 750 /var/www/html/

Enfin, il peut être pratique, même si pas toujours nécessaire, que tous les fichiers et les répertoires de la racine Web du serveur soient créés avec "www-data" comme groupe propriétaire :

$ sudo chmod g+s /var/www/html/

Dans le contexte de la dernière commande, le drapeau "s" signifie "set group id".

Et voilà! Restez quand même conscient qu'il vous faudra possiblement apporter des modifications à cette configuration selon le type d'application que vous allez déployer.

Installer MariaDB

MariaDB est le système de gestion de base de données le plus populaire chez les développeurs Web, de même que chez les hébergeurs. Il s'agit d'un "fork" communautaire de MySQL. Tout comme le serveur Web Apache, il s'agit d'un logiciel libre.

De Wikipédia :

En 2009, à la suite du rachat de MySQL par Sun Microsystems et des annonces du rachat de Sun Microsystems par Oracle Corporation, Michael Widenius, fondateur de MySQL, quitte cette société pour lancer le projet MariaDB, dans une démarche visant à remplacer MySQL tout en assurant l’interopérabilité. Le nom vient de la 2e fille de Michael Widenius, Maria (la première s'appelant My).

Entrez les commandes suivantes pour installer MariaDB (serveur et client) :

$ sudo apt update
$ sudo apt install mariadb-server mariadb-client
$ sudo mysql_secure_installation

Et maintenant suivez les instructions :

Testez maintenant l'installation en vous assurant que MariaDB est bien en exécution :

$ sudo systemctl status mariadb

La sortie devrait inclure la ligne suivante :

...
Active: active (running) ...
...

Pressez sur la touche q du clavier si l'affichage semble bloqué.

Maintenant quelques commandes utiles. D'abord, pour démarrer manuellement le service :

$ sudo systemctl start mariadb

Pour redémarrer :

$ sudo systemctl restart mariadb
Pour arrêter le service :

$ sudo systemctl stop mariadb

Pour afficher le numéro de version :

$ sudo mysqladmin version

Autoriser les connexions distantes à la base de données

On veut pouvoir se connecter à MariaDB / MySQL depuis un ordinateur différent de celui où est installé la base de données (différent de celui dont l'adresse est 127.0.0.1).

Pour cela, il faut modifier l'un des fichiers de configuration du serveur après en avoir fait une copie de sécurité :

$ sudo cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.bak
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Une fois le fichier ouvert dans l'éditeur, mettre en commentaire (#) la ligne suivante :

#bind-address = 127.0.0.1

Puis, redémarrer le service :

$ sudo systemctl restart mariadb

Installer PHP

PHP n'a pas besoin d'une longue présentation. Disons simplement qu'il s'agit du langage de programmation Web le plus utilisé côté serveur. Il est à la base de la création de sites Web comme Facebook, Wikipédia et... Prog 101.

Entrez les commandes suivantes pour installer les paquets nécessaires à PHP :

$ sudo apt update 
$ sudo apt install php libapache2-mod-php php-mysql

Même si facultatif, c'est une bonne idée de faire en sorte que le fichier index.php soit recherché par Apache avant le fichier index.html. Pour cela vous devez éditer l'un des fichiers de configuration du serveur Apache :

$ sudo cp /etc/apache2/mods-enabled/dir.conf /etc/apache2/mods-enabled/dir.conf.bak
$ sudo nano /etc/apache2/mods-enabled/dir.conf
$ sudo systemctl restart apache2

Déplacez index.php au début de la liste, devant index.html.


L'éléphant mascotte de PHP

Autoriser l'exécution de scripts PHP dans les répertoires personnels

L'exécution de scripts PHP dans les répertoires personnels est désactivé par défaut. Pour l'activer, il faut éditer le fichier de configuration du module PHP :

$ sudo cp /etc/apache2/mods-available/php8.1.conf /etc/apache2/mods-available/php8.1.conf.bak
$ sudo nano /etc/apache2/mods-available/php8.1.conf

Repérez et commentez (avec le caractère '#') les lignes suivantes :

<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_value engine Off
    </Directory>
</IfModule>

Puis, redémarrez le service :

$ sudo systemctl restart apache2

Afficher les messages d'erreur

Pour des raisons de sécurité, le comportement par défaut de PHP est de ne pas afficher les messages d'erreur. En cas d'erreur dans un script, tout ce que vous verrez est une page blanche.

Ce comportement est celui recherché en mode "production", ceci afin de ne pas fournir trop d'informations aux utilisateurs malveillants. Mais en mode "développement", il est préférable d'être renseigné au maximum sur nos erreurs.

Pour afficher tous les messages d'erreur, il est nécessaire de modifier le fichier de configuration du module PHP du serveur Web.

Éditez ce fichier (après avoir fait un copie de sécurité) :

$ sudo cp /etc/php/8.1/apache2/php.ini /etc/php/8.1/apache2/php.ini.bak
$ sudo nano /etc/php/8.1/apache2/php.ini

Assurez-vous des valeurs suivantes :

...
error_reporting = E_ALL <-- vers la ligne 465
...
display_errors = on     <-- vers la ligne 482
... 

Relancez ensuite le serveur Web :

$ sudo systemctl restart apache2

Félicitations! Vous êtes maintenant en mesure de développer des sites Web transactionnels avec LAMP!

Installer phpMyAdmin

Tout le monde connait phpMyAdmin. C'est une application Web pour gérer à distance les systèmes de gestion de base de données MySQL ou MariaDB. Elle a été codée principalement en PHP et il s'agit encore d'un logiciel libre.

Entrez les commandes suivantes pour installer phpMyAdmin :

$ sudo apt update
$ sudo apt install phpmyadmin

Vous devez ensuite installer l'extension "mbstring" (pour Multibyte String). Cette extension est nécessaire avec les langues dont les caractères exigent parfois plus d'un octet chacun pour être représentés.

$ sudo apt install php-mbstring

Le module était probablement déjà présent. Mais puisqu'il ne s'agit pas d'un module "par défaut", il est nécessaire de l'activer :

$ sudo phpenmod mbstring

Enfin, vous devez installer le module "gettext", nécessaire pour l'internationalisation et la localisation des chaînes de caractères.

$ sudo apt install gettext

Il ne reste alors qu'à redémarrer le serveur Web :

$ sudo systemctl restart apache2

Vous pouvez maintenant accéder à phpMyAdmin à l'URL : http://votre_adresse_ip/phpmyadmin/.

Si vous n'avez pas encore d'autres usagers que "root" (on parle bien sûr du "root" de MariaDB et non de Linux), vous devez lui donner le droit de se connecter à partir même du VPS :

$ sudo mysql -u root -p
Enter password: mot_de_passe_root_maria_db
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 283
Server version: 10.3.34-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

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)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'
    IDENTIFIED BY 'unMotDePasse' WITH GRANT OPTION;
Query OK, 0 rows affected (0.007 sec)

MariaDB [(none)]> exit
Bye
$

Vous pouvez maintenant vous connecter en "root" à l'aide de phpMyAdmin et faire tout ce que vous voulez avec vos bases de données sans avoir besoin d'utiliser la console.

Et si ça ne fonctionne pas?

Nous avons remarqué que dans certains cas, l'URL http://votre_adresse_ip/phpmyadmin/ affichait un message d'erreur "HTTP Not Found".

Si vous êtes dans ce cas, effectuez les commandes suivantes :

$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
$ sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
$ sudo systemctl restart apache2        

Cela règle en général le problème (en attendant de trouver son origine ).