Installer un serveur LAMP sous Ubuntu 20.04 de A à Z en 2021

Tech 16 mars 2021

Aujourd'hui, je me met enfin à l'écriture du tuto que j'aurais aimé lire chacune de ces dix dernières années. Installer un serveur web sur un VPS ou un serveur dédié, c'est une vraie galère quand on est pas SysAdmin.

Moi-même je ne le suis pas et franchement je crois que je ne le serais jamais, ce n'est clairement pas pour moi. Par contre, avec les années et à force de recouper les tutos, j'ai fini par apprendre comment construire rapidement et efficacement un serveur web sous Ubuntu. Je dis bien Ubuntu et pas Debian, parce que sous Debian c'est une galère sans nom, même si la plupart des commandes de ce tutos fonctionneront sans problèmes. Vous êtes prêts ? Alors c'est partit !

1/ Mise à jour

Avant toute chose, assurez-vous que votre VPS ou serveur dédié (raccourci "serveur" dans la suite de ce tuto) soit bien à jour. Pour cela, connectez-vous en root pour exécuter un classique d'Ubuntu :

root@tuto:~# apt update && apt upgrade

2/ Forteresse

Pour éviter que tout notre travail soit réduis à néant par de vils hackers, il est nécessaire de mettre en place quelques sécurités.

2.a/ Le mot de passe root

Toujours en root, nous allons commencer par changer le mot de passe par quelque chose de très robuste grâce à openssl.

💡
ATTENTION : un_nombre doit être supérieur ou égal à 12 (le plus grand, le mieux) et être un multiple de 3.
root@tuto:~# openssl rand -base64 <un_nombre>

Une fois ce magnifique mot de passe généré (et retenu, débrouillez-vous), attribuons-le à l'utilisateur root grâce à la commande :

root@tuto:~# passwd

Recopiez ou collez votre mot de passe généré dans les deux champs qui apparaissent successivement à l'écran et le tour est joué :)

2.b/ Un nouveau venu

Viens ensuite le moment de créer un nouvel utilisateur qui nous servira d'utilisateur principal. Nous allons délaisser root pour accroitre la sécurité. Mais avant toute chose, une nouvelle génération de mot de passe s'impose :

root@tuto:~# openssl rand -base64 15

La commande adduser permet de créer un nouvel utilisateur sur notre serveur :

root@tuto:~# adduser <nom_d_utilisateur>

Je m'appelle Peter, alors allons-y pour adduser peter ! Un mot de passe pour le nouvel utilisateur vous est demandé. Recopiez ou collez celui généré ci-dessus. Vous pouvez laisser vide la totalité des autres champs demandés, et valider la création de l'utilisation en répondant Y à la question Is the information correct?.

2.c/ Interdire la connexion en root

Pour éviter les problèmes, nous allons interdire la connexion au serveur en root. Pour cela, il faut avant tout donner les privilèges sudo à notre nouvel utilisateur. Pour cela, nous allons ajouter notre nouvel utilisateur peter au groupe sudo :

root@tuto:~# adduser peter sudo

Nous pouvons maintenant nous déconnecter du serveur pour nous y reconnecter sous peter pour vérifier que tout fonctionne correctement :

root@tuto:~# logout
Connection to tuto.phpeter.fr closed.
peter@destkop:~$ ssh peter@tuto.phpeter.fr
peter@tuto.phpeter.fr's password:
peter@tuto:~$

Il est maintenant tant de vérifier notre appartenance au groupe des sudoers en exécutant la commande suivante :

peter@tuto:~$ sudo whoami

Après vous avoir demandé votre mot de passe, votre serveur doit vous afficher root, qui signifie que vous pouvez bien accéder aux privilèges super-utilisateur depuis votre utilisateur classique. Une fois que nous sommes sur de ça, nous pouvons désormais interdire la connexion SSH en tant que root. Des à présent, nous effectueront toutes les actions de ce tuto depuis l'utilisateur peter grâce à la commande sudo.

C'est en éditant le fichier /etc/ssh/sshd_config que nous pourrons accomplir cette tâche :

peter@tuto:~$ sudo nano /etc/ssh/sshd_config

Avec nano (que j'utiliserais tout au long de ce tuto, si vous ne l'avez pas installez-le avec la commande sudo apt install -y nano), cherchez l'instruction PermitRootLogin yes grâce à Ctrl + W et remplacez le yes par no :

Enregistrez vos modifications avec Ctrl + X. Redémarrez ensuite le deamon ssh avec la commande suivante :

peter@tuto:~$ sudo service ssh restart

Vous serez peut-être déconnecté du serveur. Reconnectez-vous pour continuer ce tuto ! :)

3/ Le serveur Apache

Rentrons maintenant dans le vif du sujet : le serveur web. Apache fera très bien le travail. Installez-le avec la commande suivante :

peter@tuto:~$ sudo apt install -y apache2

La seule configuration nécessaire pour Apache est d'activer les fichiers .htaccess. Pour cela, éditez le fichier /etc/apache2/apache2.conf :

peter@tuto:~$ sudo nano /etc/apache2/apache2.conf

Trouvez la ligne <Directory /var/www> (vous pouvez vous aider de Ctrl + W pour chercher dans le fichier), puis modifier la seconde ligne qui suit AllowOverride None par AllowOverride All :

Enregistrez avec Ctrl + X. Nous allons ensuite autoriser la réécriture d'URL, car cela est très pratique et très utilisé sur le web aujourd'hui :

peter@tuto:~$ sudo a2enmod rewrite

Enfin, redémarrez Apache avec cette commande :

peter@tuto:~$ sudo service apache2 restart

4/ Le nom de domaine

Ce tuto n'a pas vocation à passer en revue l'achat d'un nom de domaine. Cependant, pour avoir un serveur LAMP propre et sécurisé, vous devrez avoir au moins un sous-domaine qui pointe vers votre serveur. Une fois que la liaison DNS est effectuée, vous pourrez voir votre serveur afficher la page d'accueil d'Apache par défaut :

5/ Le HTTPS

5.a/ Lier le nom de domaine au serveur

Une fois que le nom de domaine a bien été lié à votre serveur, nous allons activer la connexion HTTPS. Pour cela, commencez par éditer le fichier /etc/apache2/sites-available/000-default.conf comme suit :

peter@tuto:~$ sudo nano /etc/apache2/sites-available/000-default.conf

Décommentez la ligne ServerName et remplacez www.example.com par votre nom de domaine comme suit :

Sauvegardez le fichier avec Ctrl + X et rechargez la configuration apache avec la commande suivante :

peter@tuto:~$ sudo service apache2 reload

5.b/ Certbot

Il vous faut maintenant installer certbot avec la commande suivante :

peter@tuto:~$ sudo apt install -y certbot python3-certbot-apache

Une fois l'installation terminée, lancez la commande suivante pour générer le certificat HTTPS :

peter@tuto:~$ sudo certbot --apache

Entrez ensuite votre adresse e-mail lorsque celle-ci vous est demandée, puis accepter les conditions en tapant "A" (pour Agree). Choisissez ensuite si vous voulez ou non recevoir des e-mails de la fondation associée à Certbot, puis choisissez pour quel(s) site(s) vous souhaitez générer un certificat. Dans notre cas nous n'avons qu'un seul site, il suffit donc de taper "1" puis de valider :

Un dernier choix doit ensuite être fait : laisser votre site accessible en HTTP en même temps que HTTPS (choix 1) ou rediriger toutes les requêtes HTTP vers HTTPS (choix 2). Le choix N°2 est celui qu'il faut choisir, et ce n'est pas une option ;)

Et voila ! Notre serveur web possède maintenant une connexion sécurisée et vérifiée grâce à Let's Encrypt !

6/ PHP

6.a/ Les indispensables

Maintenant que le serveur web est en place, il est temps d'installer PHP. La version 8 est la dernière en date et c'est donc celle-ci que nous allons installer. Elle n'est pas encore disponible sur les dépôts officiels d'Ubuntu, nous allons donc ajouter le bon dépôt de paquets à notre système :

peter@tuto:~$ sudo apt install -y software-properties-common
peter@tuto:~$ sudo add-apt-repository ppa:ondrej/php

Une fois fait, il faut mettre à jour la liste de dépôts :

peter@tuto:~$ sudo apt update

Nous pouvons dès à présent installer PHP :

peter@tuto:~$ sudo apt install -y php8.0 libapache2-mod-php8.0

En plus de PHP, le paquet libapache2-mod-php permet de configurer PHP pour lui permettre de fonctionner avec Apache.

En l'état, php fonctionne. Vous pouvez le tester en exécutant la commande php -v et en créant un fichier info.php à la racine de votre serveur web (dans /var/www/html) grâce à la commande :

peter@tuto:~$ sudo nano /var/www/html/info.php

Puis écrivez-y le code suivant :

<?php

phpinfo();

Enregistrez avec Ctrl + X et accédez ensuite via un navigateur à l'adresse https://votre-domaine.com/info.php pour voir votre configuration PHP s'afficher devant vos yeux ébahis.

6.b/ Les extensions

En tant que développeur web, j'ai souvent besoin de plusieurs extensions PHP "de base" que je vous conseille également. Voici la commande pour les installer :

peter@tuto:~$ sudo apt install -y php8.0-{mbstring,curl,zip,mysql,mysqli,gd,xml,redis}

6.c/ Composer

Une fois PHP et ses extensions installées, il sera nécessaire pour la plupart des projets d'installer composer :

peter@tuto:~$ wget https://getcomposer.org/installer

peter@tuto:~$ php installer

peter@tuto:~$ rm installer

peter@tuto:~$ sudo mv composer.phar /usr/local/bin/composer

Vous pouvez ensuite vérifier que composer est correctement installé grâce à la commande suivante :

peter@tuto:~$ composer -V

6.d/ Redémarrage

Après toutes ces modifications, un bon redémarrage d'Apache est indispensable pour que tout fonctionne correctement :

peter@tuto:~$ sudo service apache2 restart

7/ MySQL

Prochaine partie de ce tuto : l'installation de MySQL pour les bases de données !

7.a/ Installer le paquet

Lancez simplement la commande suivante :

peter@tuto:~$ sudo apt install -y mysql-server

7.b/ Créer un utilisateur

Il y a quelques années, à l'installation de MySQL, il était demandé de renseigner un mot de passe root qui permettait de se connecter à toutes les bases de données du serveur. De nos jours, cet utilisateur root existe toujours mais il n'a pas de mot de passe défini par défaut et il n'est pas possible de l'utiliser pour se connecter à MySQL via un couple utilisateur/mot de passe.

Nous allons donc laisser ce cher root tranquille et nous créer un nouvel utilisateur. Une fois de plus, un mot de passe robuste et différent est nécessaire :

peter@tuto:~$ openssl rand -base64 15

Connectons-nous ensuite à MySQL grâce à la commande suivante :

peter@tuto:~$ sudo mysql

Créons maintenant un nouvel utilisateur comme ceci :

mysql> CREATE USER '<votre_nom>'@'localhost' IDENTIFIED BY '<votre_mot_de_passe>';

Encore une fois, j'ai nommé mon utilisateur "peter". Nous allons maintenant lui donner tous les privilèges de la manière suivante :

mysql> GRANT ALL PRIVILEGES ON *.* TO 'peter'@'localhost' WITH GRANT OPTION;

Voila, vous possédez maintenant un utilisateur administrateur de MySQL. Attention toutefois, cet utilisateur ne peut se connecter que depuis votre serveur (et donc votre code PHP), et non depuis l'extérieur pour des raisons évidentes de sécurité !

8/ phpMyAdmin

8.a/ Installer

Pour administrer nos bases de données, nous aurons besoin de phpMyAdmin (sauf si vous êtes un sysAdmin barbu, auquel cas vous n'avez pas besoin de ce tuto).

Pour cela, nous allons copier le lien de la l'archive de la dernière version sur le site officiel de phpMyAdmin : https://www.phpmyadmin.net/downloads/

Nous allons ensuite utiliser le lien copié juste avant dans la commande suivante :

peter@tuto:~$ wget https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.zip

Pour le dézipper, nous allons avoir besoin des paquets zip et unzip :

peter@tuto:~$ sudo apt install -y zip unzip

Il est maintenant temps de dézipper l'archive de phpMyAdmin à la racine de votre dossier web :

peter@tuto:~$ sudo unzip phpMyAdmin-5.1.0-all-languages.zip -d /var/www/html/

Renommez ensuite le dossier "pma" ou "phpmyadmin" ou n'importe quoi qui sera à votre convenance :

peter@tuto:~$ cd /var/www/html
peter@tuto:/var/www/html$ sudo mv phpMyAdmin-5.1.0-all-languages pma

Vous pouvez ensuite supprimer l'archive :

peter@tuto:/var/www/html$ cd
peter@tuto:~$ rm phpMyAdmin-5.1.0-all-languages.zip

8.b/ Sécuriser

Pour éviter de laisser une porte presque ouverte sur vos bases de données, nous allons sécuriser l'accès à phpMyAdmin. Deux moyens pour ça : soit passer par un couple utilisateur/mot de passe (qui bien sur doit être différent de celui utilisé pour se connecter à MySQL), soit restreindre l'accès à ce dossier à votre adresse IP uniquement. Mais pour cela, vous devez avoir un fournisseur d'accès capable de vous fournir une IP fixe ou bien être sous un VPN personnel.

La méthode "mot de passe" :

Rendez-vous à la racine de phpMyAdmin pour y créer le fichier .htaccess :

peter@tuto:~$ cd /var/www/html/pma
peter@tuto:/var/www/html/pma$ sudo nano .htaccess

Une fois dans nano, entrez le code suivant dans le fichier :

AuthName "Page d'administration protégée, veuillez vous identifier"
AuthType Basic
AuthUserFile "/var/www/html/pma/.htpasswd"
Require valid-user

Enregistrez avec Ctrl + X. Viens maintenant le moment de choisir un nom d'utilisateur et un mot de passe pour accéder au dossier.

Je vais choisir "peterpan" comme nom d'utilisateur. Pour le mot de passe, nous allons une fois de plus le générer avec la commande suivante :

peter@tuto:/var/www/html/pma$ openssl rand -base64 15

Une fois notre mot de passe généré, il va falloir créer le hash de ce dernier afin de pouvoir le stocker. Pour cela, exécuter la commande suivante :

peter@tuto:/var/www/html/pma$ php -r 'echo password_hash("<votre_mot_de_passe>", PASSWORD_DEFAULT)."\n";'

Créez ensuite le fichier .htpasswd comme suit :

peter@tuto:/var/www/html/pma$ sudo nano .htpasswd

Entrez simplement le code suivant :

peterpan:<votre_mot_de_passe_hashé>

Enregistrez avec Ctrl + X et le tour est joué ! Rendez-vous sur https://votre-domaine.com/pma pour vérifier que tout fonctionne ! Entrez votre identifiant et votre mot de passe : Vous avez maintenant accès à phpMyAdmin ! Vous devez vous y connecter en utilisant l'identifiant et le mot de passe créés plus haut lors de la configuration de MySQL.

La méthode "adresse IP"

Pour cette méthode, il vous suffit de créer un fichier .htaccess à la racine du dossier /var/www/html/pma :

root@tuto:/var/www/html/pma$ sudo nano .htaccess

Et d'y insérer le code suivant :

Order Deny,Allow
Deny from all
Allow from <votre_adresse_ip> 
Allow from <l_adresse_d_un_ami>

Attention toutefois à bien ajouter votre IPv4 ET votre IPv6 si votre fournisseur et votre hébergeur le supporte, sinon cela risque de ne pas fonctionner correctement.

9/ Pour la route : Redis

Depuis mon passage comme ingénieur chez Qwant, je ne peux plus me passer de Redis, un système de cache ultra performant de type NoSQL qui permet de stocker notamment des couples clé => valeur avec la possibilité de leur donner une date d'expiration. Très pratique pour faire la liaison entre un ID de session et un ID d'utilisateur ou encore pour stocker des tokens d'accès ou de validation (pour un changement de mot de passe par exemple). La possibilité d'attribuer un TTL à chaque couple clé => valeur permet une économie de temps et de code considérable : au lieu de vérifier régulièrement si tel ou tel token est expiré et donc de s'exposer à des failles, stocker de tels token dans Redis permet de les faire disparaître automatiquement à la fin de leur temps de vie.

Pour installer Redis, rien de plus simple :

peter@tuto:~$ sudo apt install -y redis

Aucune configuration n'est nécessaire, le module PHP est déjà installé depuis la partie 6.b/ de ce tuto. Je vous laisse découvrir tout ça par vous-même, ce tuto n'ayant pas vocation à enseigner du code.

10/ Conclusion

Je ne pensais pas écrire dix parties quand j'ai commencé ce tuto ! Mais au moins maintenant, vous possédez un serveur web toutes options, entièrement sécurisé, certifié par Let's Encrypt et prêt à fonctionner au maximum de son potentiel ! J'espère que ce tuto vous aura aidé, et je vous donne rendez-vous très vite pour de nouveaux articles.

Mots clés

Peter Cauty

Passionné de technologie et d'automobile depuis ma tendre enfance, je me suis plongé dans le le développement web à mes 12 ans. Ingénieur de formation, aujourd'hui Indépendant.