Configuration des Virtual Hosts

Apache2 est un serveur web développé depuis 1995. Aujourd’hui c’est le serveur web le plus utilisé au monde. Personnellement ça fait une petite année que je joue avec et donc je me suis dit qu’il était temps de partager ce que je sais faire avec.

Pour commencer il va falloir installer le serveur web. Deux possibilités s’offrent à vous. Soit vous installez le serveur en standalone soit vous installez la suite LAMP composée d’Apache2, MySQL et PHP).

Voici la commande que j’utilise pour l’installation :

sudo apt install apache2 php libapache2-mod-php mysql-server php-mysql php-curl php-gd php-intl php-json php-mbstring php-xml php-zip

Avec ça vous aurez tous les outils nécessaires pour monter votre site web sous PHP/MySQL.

I/ Un peu de théories

Les fichiers de configuration d’Apache2 sont situés dans le répertoire /etc/apache2 :

vhost1.png

Globalement vous n’aurez besoin de modifier que les fichiers situés dans le répertoire sites-available/ et le fichier apache2.conf mais il est toujours intéressant de savoir à quoi servent les autres fichiers.

Le fichier envvars : contient l’ensemble des variables d’environnement nécessaires au bon fonctionnement d’Apache2. On y retrouve par exemple le nom de l’utilisateur utilisé pour faire tourner Apache 2 (www-data) :

vhost2.png

Le fichier magic : est un fichier texte qui contient les instructions nécessaires pour qu’Apache2 détermine le type MIME d’un fichier en fonction des premiers octets de ce dernier.

Comme vous pouvez le voir :

vhost3.png

Le fichier est composé de quatre colonnes. La première est le nombre d’octets à prendre en compte, la troisième est la string de référence et la quatrième est le type MIME associé.

Lorsque Apache va devoir traiter un fichier, il va lire les x premiers octets de ce dernier et comparer le contenu de ces x octets aux strings de référence. Ces x premiers octets, c’est ce qu’on appelle les Magic Numbers.

Si le fichier est un Document Microsoft Word 6.0, alors Apache va lire les 2080 premiers octets du fichier. Si le Magic Number vaut « Microsoft Word 6.0 Document » alors le type MIME associé au fichier sera « application/msword ».

A savoir qu’il est possible d’ajouter des types MIME. Pour cela il faudra modifier le fichier /etc/mime.types.

Le fichier ports.conf : listent les ports sur lesquels doit être en écoute le serveur Apache2 :

vhost4.png

En toute logique Apache écoute sur le port 80 par défaut et sur le port 443 si le module SSL est chargé (on y reviendra plus tard  ). Attention, ce n’est pas parce que vous avez ajouté un port en écoute dans le fichier ports.conf qu’un site web y sera associé. Il faudra donc passer par une étape de configuration supplémentaire (on y reviendra aussi).

Le fichier apache2.conf : est le fichier de configuration générale d’Apache2. Globalement vous n’aurez pas non plus à le modifier puisque l’ensemble des modifications seront faites sur d’autres fichiers qui seront ensuite inclus dans ce fichier général.

En effet Apache2 est capable de gérer plusieurs sites web sur une seule instance physique, c’est ce qu’on appelle des Virtual Host. Autrement dit, il est possible d’avoir plusieurs sites web sur un seul serveur (et une seule IP).

Et c’est justement ce que nous allons faire pour la suite de cet article : configurer des Virtual Hosts.

II/ Configurer des Virtual Host

Pour cet exemple nous allons créer deux Virtual Hosts ayant pour nom de domaine : site1.com et site2.com. Ces deux Virtual Hosts seront hébergés en même temps sur un seul serveur Apache2.

Alors pour commencer nous allons nous rendre dans le répertoire /etc/apache2/sites-available. Vous y trouverez un fichier appelé 000-default.conf. Ce fichier, c’est un template que vous pourrez réutilisez pour créer vos Virtual Hosts. On va donc en faire deux copies que l’on va nommer site1.com.conf et site2.com.conf :

vhost5.png

Avant d’éditer les fichiers de configuration de nos Virtual Hosts nous allons créer deux répertoires qui seront les répertoires racines de nos Virtual Hosts :

mkdir /var/www/html/site1
mkdir /var/www/html/site2

Dans chaque répertoire, on va créer un fichier index.html qui contiendra juste le nom du site :

vhost6.png

Tout d’abord il faudra modifier le contenu de la directive « ServerName » en lui donnant le nom du domaine lié à ce Virtual Host soit :

ServerName site1.com
ou
ServerName site2.com

Ensuite il va falloir indiquer à Apache2 quel est le répertoire racine (DocumentRoot) :

DocumentRoot /var/www/html/site1/
ou
DocumentRoot /var/www/html/site2/

Au final, le fichier de configuration du premier Virtual Host ressemblera à ça :

vhost7.png

Une fois que c’est fait on va activer nos deux Virtual Hosts :

a2ensite site1.com.conf
et
a2ensite site2.com.conf

Puis relancer le serveur web :

sudo systemctl reload apache2

Dans l’état actuel des chose, si on tape « site1.com » dans notre navigateur … Eh bien nous n’aurons rien ! Enfin si, une erreur, car aucun serveur DNS ne connaît le domaine site1.com. Comme le dit si bien la documentation Apache :

La configuration de serveurs virtuels sous Apache ne provoque pas leur apparition magique dans la configuration du DNS. Il faut que leurs noms soient définis dans le DNS, et qu’ils y soient résolus sur l’adresse IP du serveur, faute de quoi personne ne pourra visiter votre site Web. Il est possible d’ajouter des entrées dans le fichier hosts pour tests locaux, mais qui ne fonctionneront que sur la machine possédant ces entrées.

La configuration de serveurs virtuels sous Apache ne provoque pas leur apparition magique dans la configuration du DNS. Il faut que leurs noms soient définis dans le DNS, et qu’ils y soient résolus sur l’adresse IP du serveur, faute de quoi personne ne pourra visiter votre site Web. Il est possible d’ajouter des entrées dans le fichier hosts pour tests locaux, mais qui ne fonctionneront que sur la machine possédant ces entrées.

Et c’est exactement ce que nous allons faire. En effet sous Linux il existe un fichier qui permet de forcer la résolution DNS : /etc/hosts. Tout ce que nous avons à faire, c’est de mettre l’adresse IP du serveur web suivie du nom de domaine dans ce fichier :

vhost8.png

Maintenant si on se connecte sur nos site1 et site2 on tombera bien sur nos pages :

vhost9.png

vhost10.png

Mais qu’est ce qui se passerait si au lieu de passer par les URL’s je me connectais au serveur web via son adresse IP ? Eh bien deux choses peuvent se passer :

-Soit vous atterrissez sur le site 1 (et ça voudra dire que votre configuration est bonne) :

vhost11.png-Soit vous atterrissez sur cette page (et là ça voudra dire qu’on a encore un peu de travail) :

vhost12.png

Cette page, c’est la racine de notre serveur (ce qui correspond aux répertoires /var/www/html). Par défaut le répertoire racine est configuré pour afficher un Directory Listing (la liste des fichiers et dossiers présents à la racine).

En terme de sécurité c’est pas super cool… Ça veut dire que n’importe quel utilisateur peut accéder à l’ensemble des fichiers du serveur et donc à tous les Virtual Hosts.

Alors pourquoi est ce qu’on obtient cette page ? Eh bien parce qu’il n’existe aucunes directives ServerName dans nos fichiers de configuration de Virtual Hosts dont la valeur est 127.0.0.1. En effet dans nos deux fichiers de configuration nous avons dit que les ServerName était soit site1.com :

vhost13.png

soit site2.com :

vhost14.png

Or par défaut, lorsque aucun ServerName ne match, Apache va piocher dans les fichiers de configuration situés dans le répertoire /etc/apache2/sites-available et appliquer la configuration du fichier ayant le nom le plus bas alphabétiquement parlant.

Et si vous vous rappelez, je vous avais dit au tout début, que par défaut il existe un fichier 000-default.conf (le template). Comme le nom du fichier commence par des chiffres, c’est la configuration de ce fichier qui sera appliqué par défaut si aucun ServerName ne match.

apache2ctl -S

Qui va nous indiquer quel est le fichier de configuration prioritaire :

vhost15.png

On voit que pour de l’IPv4, le fichier de configuration par défaut est le fichier 000-default.conf. Pour éviter ce soucis, on va pourvoir désactiver le site dont le fichier de configuration est 000-default.conf :

a2dissite 000-default.conf

Puis reload Apache 2 :

systemctl reload apache2

Maintenant si je relance la commande suivante :

apache2ctl -S

Je vois bien que la configuration à charger par défaut est celle du site site1.com (site1.com étant alphabétiquement parlant avant site2.com) :

vhost16.png

Du coup si on se connecte via l’adresse IP du serveur, on atterrira sur le site1.com :

vhost17.png

Voilà voilà ! Pour la suite nous verrons comment implémenter une authentification basique afin de restreindre l’accès à certaines parties de notre site.