Aller au contenu
Photo d’Armand Philippot
Logo d’Armand Philippot

Armand Philippot

Intégrateur web

Installer LAMP sur Manjaro

Écrit par :
Armand
Publié le :
Mis à jour le :
Temps de lecture :
13 minutes
Thématiques :
Linux
Développement

Au quotidien, j’utilise Linux comme système d’exploitation et plus précisément la distribution Manjaro. Pour pouvoir travailler sur mes projets web en local, il fallait que j’installe LAMP. Cet article résume les différentes étapes pour configurer LAMP sur Manjaro. Si vous utilisez une autre distribution, ces étapes seront sans doute un peu différentes.

Introduction

Note : Cet article regroupe deux articles que j’ai précédemment écrit. J’ai jugé qu’il était plus clair de n’en faire qu’un. J’en ai profité pour vérifier les étapes et pour rajouter des instructions propres à PHP 8. Par contre, je n’ai peut-être pas mis à jour les numéros de ligne entre les deux installations donc comme précisé, il s’agit simplement d’une indication.

Qu’est-ce que LAMP ?

LAMP est un acronyme pour Linux Apache MySQL PHP. Il s’agit d’un ensemble de logiciels permettant de mettre en place un serveur web.

  • Linux désigne le système d’exploitation
  • Apache correspond au serveur HTTP
  • MySQL est un serveur de base de données
  • PHP est un langage de programmation
LAMP (Linux Apache MySQL PHP)

Il existe différentes variantes pour mettre en place le serveur web. Voici quelques exemples :

  • Linux peut être remplacé par Windows (WAMP) ou Mac (MAMP)
  • Apache peut être remplacé par Nginx (LEMP)
  • MySQL peut être remplacé par MariaDB ou PostgreSQL
  • PHP peut être remplacé par Python ou Perl

Pourquoi Manjaro ?

Manjaro est tout simplement ma distribution Linux.

Si vous souhaitez installer LAMP sur un serveur dédié ou virtualisé, cet article n’est peut-être pas fait pour vous. Manjaro n’est pas le meilleur choix pour votre serveur puisqu’il s’agit d’une « rolling releases ». Vous devriez plutôt regarder pour une distribution stable comme Debian.

Si, comme moi, vous utilisez Manjaro au quotidien comme distribution, vous pouvez tout à fait installer LAMP et obtenir un environnement de travail fonctionnel. Si vous ne savez pas comment procéder, cet article est fait pour vous.

Le résultat final

Tout d’abord, parlons de ce que je souhaite accomplir ici. Je souhaite :

  • installer LAMP avec PHPMyAdmin,
  • travailler dans un répertoire où j’ai les droits d’écriture (comme /home/Sites) plutôt que dans /srv/http/,
  • créer des serveurs virtuels (« virtual host ») pour ces sites,
  • accéder à ces sites en HTTPS,
  • que localhost pointe sur /srv/http/default plutôt que /srv/http/.

Ainsi, au final, je pourrais accéder à chacun de mes sites en saisissant https://www.site.test/ dans le navigateur, où site est le nom du site.

Installer LAMP et PHPMyAdmin

Lorsque j’ai décidé d’installer LAMP sur ma distribution, j’ai commencé par chercher des tutoriels et des wikis. Je voulais m’assurer de ne pas oublier une étape et surtout, mes connaissances en serveur étant encore limitées, je préférais ne pas faire d’erreur. Le wiki d’Archlinux est sans doute le plus complet, mais les informations sont un peu éparpillées pour ce que je cherchais à faire.

Installation des paquets nécessaires

Pour installer LAMP sur Manjaro, plusieurs paquets sont nécessaires : apache, mariadb (plutôt que MySQL), php et php-apache. Je vais ajouter phpmyadmin pour gérer les bases de données.

Dans votre terminal, saisissez :

sudo pacman -S apache mariadb php php-apache phpmyadmin

Configuration de MariaDB (MySQL)

Dans un terminal, nous allons initialiser les tables puis démarrer le service MySQL.

sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
sudo systemctl start mysqld

Maintenant, nous allons sécuriser l’installation. Là, le Wiki d’Archlinux ne nous détaille pas la procédure à suivre, mais celle-ci est assez bien détaillée. Voici, ce qu’il faut répondre à chaque interaction :

sudo mysql_secure_installation

#output#Enter current password for root (enter for none):
# Pas de mot de passe, il faut presser la touche Entrée.
#output#Switch to unix_socket authentication [Y/n]
# Nous répondons "N", nous utiliserons plutôt un mot de passe.
#output#Change the root password? [Y/n]
# Nous répondons "Y", nous allons pouvoir définir le mot de passe pour root.
#output#Remove anonymous users? [Y/n]
# Nous répondons "Y", nous supprimons les utilisateurs anonymes.
#output#Disallow root login remotely? [Y/n]
# Nous répondons "Y", pour une installation plus sécurisée.
#output#Remove test database and access to it? [Y/n]
# Nous répondons "Y", la base de donnée test ne nous est pas utile.
#output#Reload privilege tables now? [Y/n]
# Nous répondons "Y", il faut recharger les tables.

MariaDB est maintenant configuré. Il est possible de se connecter en root, de créer un nouvel utilisateur ou une nouvelle base de donnée. Comme nous allons utiliser PHPMyAdmin, nous nous arrêtons là pour MariaDB.

Configuration de PHP

Maintenant il faut configurer PHP pour prendre en compte MariaDB. Dans les instructions ci-dessous, j’utilise l’éditeur de texte nano parce qu’il est simple d’utilisation. Vous pouvez tout à fait le remplacer par un autre éditeur comme vim.

Dans un terminal, nous allons saisir :

sudo nano /etc/php/php.ini

Il faut dé-commenter deux lignes :

// À titre indicatif, vers la ligne 923 lors de mon installation.
extension=mysqli.so
extension=pdo_mysql.so

Configuration d’Apache

Nous pouvons maintenant configurer Apache. Pour cela, toujours dans un terminal, il faut saisir :

sudo nano /etc/httpd/conf/httpd.conf

Le wiki d’Archlinux (en anglais cette fois) nous précise qu’une librairie contenue dans le paquet php-apache génère une erreur avec mod_mpm_event.so. La documentation d’Apache explique que mod_mpm_prefork.so permet une plus grande stabilité et une meilleure compatibilité avec les logiciels anciens en comparaison avec mod_mpm_event.so.

Nous allons donc commenter la première ligne et dé-commenter la deuxième.

# À titre indicatif, vers la ligne 66 lors de mon installation.
#LoadModule mpm_event_module modules/mod_mpm_event.so

# À titre indicatif, vers la ligne 67 lors de mon installation.
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Maintenant, il faut activer PHP. Nous repérons la liste des LoadModule et, à la fin de celle-ci, nous rajoutons :

# Load php7 module
LoadModule php7_module modules/libphp7.so
AddHandler php7-script .php

Si vous utilisez PHP 8 (c’est probablement le cas, en 2021, si vous êtes sûr Manjaro), il faut plutôt utiliser :

# Load php8 module
LoadModule php_module modules/libphp.so
AddHandler php-script .php

Nous repérons la liste des Include et, à la fin de celle-ci, nous rajoutons :

# PHP 7 settings
Include conf/extra/php7_module.conf

De même pour PHP 8, ce sera :

# PHP 8 settings
Include conf/extra/php_module.conf

Pour gérer les redirections via htaccess, il faut également dé-commenter :

# À titre indicatif, vers la ligne 189 lors de mon installation.
LoadModule rewrite_module modules/mod_rewrite.so

Nous allons préciser le nom du serveur et le port à utiliser.

# À titre indicatif, vers la ligne 235 lors de mon installation.
# Remplacer :
#ServerName www.example.com:80

# Par :
ServerName localhost:80

Par défaut, Apache est configuré pour permettre l’accès au répertoire $HOME/public_html depuis l’URL http://localhost/~user/. Je préfère empêcher cet accès puisque je ne l’utiliserai pas, donc je vais commenter la ligne suivante :

# À titre indicatif, vers la ligne 512 lors de mon installation.
#Include conf/extra/httpd-userdir.conf

Vous pouvez maintenant démarrer le serveur Apache en saisissant la commande :

sudo systemctl start httpd

Le serveur LAMP est maintenant fonctionnel. Toutefois, si vous avez suivi, je n’ai pas créé d’utilisateur MariaDB ni de base de données.

Configuration de PHPMyAdmin

Dans un terminal, saisissez :

sudo nano /etc/httpd/conf/extra/httpd-phpmyadmin.conf

Nous insérons dans le fichier les lignes suivantes :

# PHPMyAdmin
Alias /phpmyadmin "/usr/share/webapps/phpMyAdmin"
<Directory "/usr/share/webapps/phpMyAdmin">
    DirectoryIndex index.html index.php
    AllowOverride All
    Options FollowSymlinks
    Require all granted
</Directory>

Nous sauvegardons, puis nous allons éditer à nouveau le fichier de configuration d’Apache :

sudo nano /etc/httpd/conf/httpd.conf

Nous ajoutons :

# PHPMyAdmin configuration
Include conf/extra/httpd-phpmyadmin.conf

PHPMyAdmin est maintenant disponible via l’URL http://localhost/phpmyadmin. Pour vous connecter en « root », il faut que vous réutilisiez le mot de passe défini lors de l’installation de MariaDB.

Toutefois, si vous essayez de vous connecter tout de suite, vous risquez de voir des messages d’avertissement, comme l’une de ces deux erreurs :

$cfg[‘TempDir’] (/usr/share/webapps/phpMyAdmin/tmp/) n’est pas accessible. phpMyAdmin est incapable de mettre en cache les modèles et de ce fait sera lent.

Warning in ./libraries/classes/Config.php#1282 mkdir(): Permission denied

Pour y remédier, il faut définir un dossier temporaire pour PHPMyAdmin. Dans un terminal, saisissez :

sudo nano /usr/share/webapps/phpMyAdmin/config.inc.php
// À titre indicatif, vers la ligne 155 lors de ma 1ère installation.
// Désormais, il faut l'ajouter.
$cfg['TempDir'] = '/tmp/phpmyadmin';

Si vous essayez de vous connecter, vous allez voir :

Le fichier de configuration nécessite maintenant une phrase de passe secrète (blowfish_secret).

Il faut définir cette phrase en générant une clé aléatoire de 32 caractères. Dans un terminal, saisissez :

sudo nano /usr/share/webapps/phpMyAdmin/config.inc.php
// Remplacez "phrasede32caracteres" par la vôtre.
$cfg['blowfish_secret'] = 'phrasede32caracteres';

Il est possible que vous n’arriviez pas à vous connecter à PHPMyAdmin avec l’utilisateur root. Si vous voyez une erreur de ce type :

mysqli::real_connect(): (HY000/1698): Access denied for user ‘root’@’localhost’

Alors, quelques manipulations supplémentaires sont nécessaires :

sudo mysql -u root -p
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD("votre-mot-de-passe");
MariaDB [(none)]> exit
sudo systemctl stop mysqld
sudo systemctl start mysqld

Vous pouvez maintenant vous connecter sans problème à PHPMyAdmin pour configurer un utilisateur et une base de données. Je ne détaillerai pas la méthode dans cet article, mais l’outil me semble assez intuitif.

LAMP est maintenant fonctionnel

Il est possible de s’arrêter là puisque LAMP est désormais fonctionnel. Pour démarrer Apache et MySQL, il suffit d’ouvrir un terminal et de saisir :

sudo systemctl start httpd
sudo systemctl start mysqld

Vous pouvez décider de démarrer automatiquement Apache et MySQL au démarrage du système. Pour cela, il faut saisir :

sudo systemctl enable httpd
sudo systemctl enable mysqld

Si vous faites des modifications dans la configuration d’Apache, il faudra redémarrer le service :

sudo systemctl restart httpd

Votre installation devrait maintenant fonctionner. Le répertoire d’Apache se situe dans /srv/http/. Vous pouvez y créer un fichier index.php contenant :

<?php
phpinfo();

En vous rendant à l’adresse http://localhost, vous devriez obtenir une page contenant le résultat de phpinfo et commençant par « PHP Version ».

Cependant, il nous reste quelques étapes pour parvenir à la configuration que je souhaitais. Il faut encore :

  • Configurer SSL pour accéder au site en HTTPS
  • Créer et configurer le(s) serveur(s) virtuel(s)
  • Mettre en place un espace de travail dans le répertoire home

Étapes complémentaires

Configurer SSL pour l’accès en HTTPS

Pour générer un certificat SSL valide, nous allons installer et utiliser mkcert. Il s’agit d’un outil simple d’utilisation qui permet de créer des certificats approuvés localement.

sudo pacman -S mkcert
mkcert -install
#output#Created a new local CA 💥
#output#The local CA is now installed in the system trust store! ⚡️
#output#The local CA is now installed in the Firefox and/or Chrome/Chromium trust store (requires browser restart)! 🦊

Par défaut, le fichier de configuration SSL cherche un certificat nommé server.crt dans /etc/httpd/conf/. Nous allons devoir remplacer cette information, mais avant cela, générons notre certificat pour localhost. Afin de rester organiser, je place tous mes certificats dans un même dossier que je vais créer :

mkdir ~/.certs
cd ~/.certs
mkcert localhost

Maintenant, nous allons modifier le fichier de configuration de SSL :

sudo nano /etc/httpd/conf/extra/httpd-ssl.conf
# Nous remplaçons le ServerName (à titre indicatif : vers la ligne 125)
ServerName localhost:443

# Nous remplaçons le certificat et sa clé par ceux que nous avons générés.
# Vers la ligne 144
SSLCertificateFile "/home/votreNom/.certs/localhost+2.pem"

# Vers la ligne 154
SSLCertificateKeyFile "/home/votreNom/.certs/localhost+2-key.pem"

Enfin, nous allons modifier la configuration d’Apache pour activer SSL en dé-commentant trois lignes.

sudo nano /etc/httpd/conf/httpd.conf
# À titre indicatif, à la ligne 93 lors de mon installation.
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

# À titre indicatif, à la ligne 155 lors de mon installation.
LoadModule ssl_module modules/mod_ssl.so

# À titre indicatif, à la ligne 535 lors de mon installation.
Include conf/extra/httpd-ssl.conf

Modifier la destination de localhost

Par défaut, localhost pointe vers /srv/http. Je souhaite le rediriger vers un dossier /srv/http/default. Nous allons donc créer le dossier et modifier la configuration :

sudo mkdir /srv/http/default
sudo nano /etc/httpd/conf/extra/httpd-ssl.conf
# Vers la ligne 124, je remplace :
DocumentRoot "/srv/http/"

# Par :
DocumentRoot "/srv/http/default"
sudo nano /etc/httpd/conf/httpd.conf
# Vers les lignes 259 et 260, je remplace :
DocumentRoot "/srv/http/"
<Directory "/srv/http/">

# Par :
DocumentRoot "/srv/http/default"
<Directory "/srv/http/default">

Mise en place de notre espace de travail

Par défaut, le répertoire d’Apache se situe dans /srv/http/. Nous pourrions nous en contenter, mais il faut les droits nécessaires pour y écrire des fichiers et dossiers. Je préfère mettre en place un dossier dans ma home pour travailler.

Pour commencer, nous allons créer ce répertoire et donner les droits à Apache pour le lire. Ainsi, nous créons le dossier puis nous vérifions que le droit d’exécution est bien présent pour Apache :

mkdir /home/votreNom/monDossierDeTravail
sudo chmod o+x ~/monDossierDeTravail

Ensuite, nous devons donner à Apache les droits d’accès à notre home. La solution la plus simple serait de faire un chmod sur notre home mais ce n’est pas la meilleure approche en termes de sécurité.

Nous allons utiliser la liste de contrôle d’accès. Elle permet de gérer les droits d’accès de n’importe quel utilisateur ou groupe. Normalement, le paquet est installé puisqu’il s’agit d’une dépendance de systemd, mais mieux vaut vérifier.

Pour commencer, nous vérifions le point de montage du système de fichier :

lsblk -l
# Là il faut récupérer le nom correspondant à / (ex : sdb4) et l'utiliser dans :
sudo tune2fs -l /dev/sdXY | grep "Default mount options:"
#output#Default mount options:    user_xattr acl
#output#
cat /proc/mounts | grep -i "/dev/sdXY"
#output#/dev/sdXY / ext4 rw,noatime 0 0

Dans la première sortie, il faut vérifier que acl est bien présent. Dans le seconde, il faut que noacl ne soit pas présent. Si ces deux conditions sont remplies, la liste de contrôle d’accès est utilisable.

Maintenant que ces vérifications sont faites, nous pouvons configurer les droits d’accès d’Apache sur notre home. Apache utilise le nom d’utilisateur http.

setfacl -m "u:http:--x" /home/votreNom

Vous pouvez vérifier les changements de permission avec :

getfacl /home/votreNom

Créer et configurer un serveur virtuel

Pour créer un serveur virtuel (« virtual host »), nous devons modifier la configuration d’Apache.

sudo nano /etc/httpd/conf/httpd.conf
# À titre indicatif, à la ligne 518 lors de mon installation.
# Décommenter :
Include conf/extra/httpd-vhosts.conf

Nous allons maintenant créer le répertoire pour les fichiers de configuration des serveurs virtuels.

sudo mkdir /etc/httpd/conf/vhosts

Maintenant, imaginons que nous travaillons sur un projet se nommant « Projet » (original !). Nous allons créer un certificat pour notre site projet.test. Pour cela, nous allons générer un certificat avec mkcert pour ce domaine dans notre dossier précédemment créé :

mkcert -cert-file ~/.certs/projet.test.pem -key-file ~/.certs/projet.test-key.pem projet.test *.projet.test

Enfin, nous allons créer un fichier de configuration se nommant projet.test :

sudo nano /etc/httpd/conf/vhosts/projet.test

Dans ce fichier, nous allons insérer :

<VirtualHost *:80>
    ServerAdmin webmaster@projet.test
    DocumentRoot "/srv/http/projet.test/htdocs/"
    ServerName www.projet.test
    ServerAlias *.projet.test
    ErrorLog "/srv/http/projet.test/logs/error.log"
    CustomLog "/srv/http/projet.test/logs/access.log" combined
    <Directory /srv/http/projet.test/htdocs/>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@projet.test
    DocumentRoot "/srv/http/projet.test/htdocs/"
    ServerName www.projet.test:443
    ServerAlias *.projet.test:443
    SSLEngine on
    SSLCertificateFile "/home/votreNom/.certs/projet.test.pem"
    SSLCertificateKeyFile "/home/votreNom/.certs/projet.test-key.pem"
    ErrorLog "/srv/http/projet.test/logs/error.log"
    CustomLog "/srv/http/projet.test/logs/access.log" combined
    <Directory /srv/http/projet.test/htdocs/>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Si votre projet ne se nomme pas « Projet », il faudra évidemment changer toutes les occurrences dans le fichier. Vous devez également modifier le chemin vers les fichiers du certificat SSL : /home/votreNom/.certs/ en remplaçant votreNom et le dossier si vous l’avez nommé différemment.

Vous pouvez également voir dans le fichier, que nous avons défini deux sous-dossiers dans notre projet : htdocs et logs. Le premier correspond au répertoire public (j’utilise ce nom parce que je suis hébergé par Gandi). Le second contiendra nos fichiers logs.

Nous allons créer ces dossiers ainsi que le dossier de notre projet. Cependant, nous n’allons pas le placer dans /srv/http/ mais dans /home/votreNom/monDossierDeTravail/. Il s’agit bien évidemment du répertoire que nous avons configuré précédemment.

mkdir -p /home/votreNom/monDossierDeTravail/projet.test/htdocs
mkdir -p /home/votreNom/monDossierDeTravail/projet.test/logs

Pour que le chemin spécifié dans le fichier de configuration corresponde, nous allons créer un lien virtuel :

sudo ln -s /home/votreNom/monDossierDeTravail/projet.test/ /srv/http/

Nous retournons dans le fichier de configuration d’Apache pour activer notre serveur virtuel :

sudo nano /etc/httpd/conf/httpd.conf
# À la fin du fichier, nous ajoutons :
#Enabled Vhosts:
Include conf/vhosts/projet.test

Il faut maintenant modifier le fichier /etc/hosts :

sudo nano /etc/hosts
// Nous ajoutons à la fin du fichier :
127.0.0.1       www.projet.test

Épilogue

Notre serveur Apache est désormais fonctionnel et la configuration correspond bien au souhait de départ. Avant de tester par vous-même, il est nécessaire de redémarrer Apache pour que les modifications soient prises en compte :

sudo systemctl restart httpd

Si vous accéder à https://www.projet.test/, votre site devrait être accessible (« Accès interdit! » est normal, vous n’avez aucun fichier dans votre répertoire). En revanche, sans www le site n’est pas accessible. Je vous laisser mettre en place une redirection si vous en avez besoin.

Si vous souhaitez ajouter un nouveau projet, il faudra penser à :

  • créer un dossier (exemple : /home/votreNom/monDossierDeTravail/projet2.test),
  • générer un nouveau certificat avec mkcert,
  • créer un fichier de configuration pour ce nouveau serveur virtuel,
  • ajouter une entrée dans le fichier /etc/hosts.

Enfin, j’utilise le TLD .test parce qu’il s’agit d’un domaine de premier niveau reservé. Il ne risque pas d’y avoir un conflit avec domaine accessible par Internet. De plus, il est plus court que .example ou .localhost ; je préfère.

Lire plus d’articles à propos de :
LAMP

13 commentaires

Laisser un commentaire