Apache : Hôtes virtuels

Les Hôtes Virtuels d'un serveur web Apache permettent d'héberger un ou plusieurs sites Web (correspondant à des domaines comme www.company1.example.com et www.company2.example.com) sur une même machine. L'utilisateur final ne perçoit pas qu'en fait il s'agit d'un même serveur physique.

Les hôtes virtuels peuvent être :

par-IP (cf. https://httpd.apache.org/docs/2.4/vhosts/ip-based.html) : une adresse IP différente pour chaque serveur Webou par-nom : plusieurs noms de domaine se côtoient sur des mêmes adresses IP.	Préférez l'hébergement virtuel par nom, plus simple (de plus, il économise les adresses IP), sauf en cas d'utilisation d'équipements qui nécessitent un hébergement basé sur IP : il suffit de configurer le serveur DNS pour que chaque domaine pointe sur l'adresse IP du serveuret de configurer le serveur Apache pour qu'il reconnaisse ces domainesNous parlerons donc ici des hôtes virtuels par nom.
Le serveur s’appuie sur les informations transmises dans les en-têtes HTTP des requêtes.

Les noms utilisés doivent être définis sur le serveur DNS et être liés à une adresse IP associée au serveur.

Un hôte virtuel par nom associe un nom de domaine et son site web : chaque domaine ou site, configuré dans Apache, dirige le visiteur vers un répertoire spécifique contenant les fichiers de ce site. Un serveur web peut donc héberger et gérer plusieurs sites web grâce à ce système de virtualisation. C'est le principe d'un serveur mutualisé.

La résolution d'un hôte virtuel par nom choisit le plus approprié parmi les candidats dont l'IP convient le mieux. C'est sans objet si l'on utilise un joker (*) pour l'adresse IP dans les directives VirtualHost :

Le serveur recherche la section <VirtualHost> ayant la meilleure correspondance avec la paire adresse IP/port utilisée dans la requête. Si plusieurs hôtes virtuels ont la même paire adresse IP/port, Apache compare les valeurs des directives ServerName et ServerAlias au nom de serveur présent dans la requête.Toujours mettre une directive ServerName dans un hôte virtuel par car cela conduirait à des erreurs.Si aucune directive ServerName ou ServerAlias ne correspond dans la liste des hôtes virtuels présentant la meilleure correspondance du point de vue adresse IP/port, c'est le premier hôte virtuel de cette liste qui sera utilisé.

Pré-requis

Installation

Configuration

Depuis la version 2.4, la syntaxe des fichiers vhosts a changé : Le nom des fichiers doit se terminer par .confLes directives Allow sont remplacées par Require Remplacer (ancienne syntaxe) par autoriser toutes les requêtes Order allow,deny Allow from all Require all granted interdire toutes les requêtes Order deny,allow Deny from all Require all denied

Pour chaque domaine à définir, créez un fichier /etc/apache2/sites-available/domaine.tld.confDans ce fichier, créez une section VirtualHost pour chaque domaine ou sous-domaine :

<VirtualHost *:80>
ServerName www.domaine.tld
ServerAlias domaine.tld *.domaine.tld
DocumentRoot /var/www/html/www.domaine.tld
...
</VirtualHost>

Le premier hôte virtuel du fichier est l'hôte par défaut.Directives obligatoires d'une section VirtualHost :ServerName : nom du serveurDocumentRoot : racine du serveur sur le système de fichiersDirectives facultatives :ServerAlias : autres noms permis pour accéder au même site Web (jokers * et ? autorisés)Tutoriel : Configuration des hôtes virtuels Apache sous Ubuntu (20.04)

Utilisation

Exemples d'utilisation de VirtualHost

Supposons que :

vous hébergez le domaine www.exemple.comet vous souhaitez ajouter l'hôte virtuel other.exemple.com qui pointe sur la même adresse IP.Créez le fichier :

<VirtualHost *:80>
# Le premier hôte virtuel de la liste est aussi le serveur par défaut pour *:80
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/www/domain"
</VirtualHost>
<VirtualHost *:80>
ServerName other.example.com
DocumentRoot "/www/otherdomain"
</VirtualHost>

On peut aussi spécifier une adresse IP explicite à la place de * dans la directive <VirtualHost>. Cela permet de faire tourner des hôtes virtuels par nom sur une même adresse IP, et d'autres, soit par IP, soit basés sur un autre jeu d'hôtes virtuels par nom sur une autre adresse IP.

Plusieurs serveurs sont accessibles par plus d'un nom. Il suffit de placer la directive ServerAlias dans une section <VirtualHost>. Par exemple, dans la première section <VirtualHost> ci-dessus, la directive ServerAlias indique aux utilisateurs les autres noms permis pour accéder au même site Web :

ServerAlias exemple.com *.exemple.com

Les requêtes portant sur un domaine example.com seront servies par l'hôte virtuel www.example.com. Les caractères joker * et ? peuvent être utilisés pour les correspondances. Bien entendu, vous ne pouvez pas inventer des noms et les placer dans une directive ServerName ou ServerAlias. Il faut d'abord configurer votre serveur DNS pour lier ces noms à une adresse IP associée avec votre serveur.

La recherche del'hôte virtuel par nom qui correspond au plus près à la requête s'effectue parmi les <virtualhost> selon leur ordre d'apparition dans le fichier de configuration. Le premier hôte virtuel dont le ServerName ou le ServerAlias correspond est utilisé, sans priorité particulière en cas de présence de caractères génériques (que ce soit pour le ServerName ou le ServerAlias).

La liste complète des noms dans la section VirtualHost est traitée comme une directive ServerAlias sans caractères génériques.

Vous pouvez affiner la configuration des hôtes virtuels en plaçant d'autres directives à l'intérieur des sections <VirtualHost>. La plupart des directives peut être placée dans ces sections en y changeant seulement la configuration de l'hôte virtuel associé. Pour déterminer si une directive particulière est permise, consultez le contexte de la directive. Le jeu de directives configurées dans le contexte du serveur principal (en dehors de toutes sections <VirtualHost>) sera utilisé seulement s'il n'y a pas de configuration contraire par un hôte virtuel.

Désinstallation

Problèmes connus

Voir aussi

(fr) Documentation sur les serveurs virtuels Apache

Basé sur « Documentation sur les serveurs virtuels Apache » par The Apache Software Foundation.