46.4. Hôtes virtuels

Le terme hôte virtuel se réfère à la possibilité d'Apache de servir plusieurs URI (identificateurs de ressources universels) à partir de la même machine physique. Cela signifie que plusieurs domaines, tels que www.example.com et www.exemple.net, sont exécutés par un même serveur Web sur une seule machine physique.

Il est courant d'utiliser des hôtes virtuels pour économiser les ressources administratives (un seul serveur Web à gérer) et les dépenses en matériel (chaque domaine n'a pas besoin d'un serveur dédié). Les hôtes virtuels peuvent être basés sur le nom, sur l'adresse IP ou sur le port.

Les hôtes virtuels peuvent être configurés via YaST (voir Hôte par défaut) ou en modifiant manuellement la section Hôte virtuel du fichier httpd.conf (voir Section 46.3.2, « Configuration manuelle d'Apache »).

Par défaut, Apache dans SUSE Linux est préparé pour un fichier de configuration par hôte virtuel dans /etc/apache2/vhosts.d/. Un modèle de base pour un hôte virtuel est fourni dans ce répertoire (vhost.template). La configuration d'un hôte virtuel peut également s'ajouter ailleurs, par exemple dans un fichier inclus à la configuration.

[Important]Important

Il est très utile de vérifier la configuration de l'hôte virtuel à l'aide de la commande httpd2 -S. Cela indique les paramètres de l'hôte virtuel tels qu'ils sont interprétés par Apache et peut vous aider à vérifier que vous obtenez les résultats escomptés. Si vous utilisez Apache avec des drapeaux tels que -DSSL, il est nécessaire d'utiliser les mêmes drapeaux lors du test, par exemple, de l'utilisation de httpd2 -S -DSSL.

46.4.1. Hôtes virtuels à base de nom

Avec les hôtes virtuels à base de nom, plusieurs sites Web sont servis par adresse IP. Apache utilise le champ de l'hôte dans l'en-tête HTTP envoyé par le client pour connecter la requête à une entrée ServerName correspondante dans l'une des déclarations de l'hôte virtuel. Si aucun ServerName correspondant n'est trouvé, le premier VirtualHost spécifié est utilisé par défaut.

NameVirtualHost démarre la section Virtual Host dans une configuration Apache.

46.4.1.1. NameVirtualHost

NameVirtualHost indique au serveur Web Apache sur quelle adresse IP et, le cas échéant, sur quel port écouter les requêtes des clients contenant le nom de domaine dans l'en-tête HTTP.

Le premier argument peut être un nom de domaine complet, mais il est recommandé d'utiliser l'adresse IP. Le second argument est le port et il est facultatif. Par défaut, le port 80 est utilisé et configuré via la directive Listen (Sélection du périphérique réseau).

Il est possible d'utiliser le joker * pour l'adresse IP et le numéro du port pour recevoir des requêtes sur toutes les interfaces. Les adresses IPv6 doivent être placées entre crochets.

Exemple 46.8. Variations des entées VirtualHost à base de nom

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. <VirtualHost></VirtualHost> dans le contexte à base de nom

Les blocs <VirtualHost></VirtualHost> contiennent les informations qui s'appliquent à un domaine particulier. Lorsque Apache reçoit une requête d'un client pour un VirtualHost défini, il utilise les directives contenues dans cette section. Toute directive Apache autorisée dans le contexte VirtualHost est utilisable ici. La balise VirtualHost d'ouverture prend les arguments suivants dans une configuration d'hôte virtuel à base de nom :

  • adresse IP (ou nom de domaine pleinement qualifié) préalablement déclaré avec la directive NameVirtualHost.

  • Numéro de port facultatif préalablement déclaré avec la directive NameVirtualHost.

Le joker * est également autorisé comme substitut de l'adresse IP. Cette syntaxe n'est valable que combinée à l'utilisation de jokers dans NameVirtualHost * . Lorsque vous utilisez des adresses IPv6, elles doivent être placées entre crochets.

Exemple 46.9. Directives VirtualHost à base de nom

<VirtualHost 192.168.1.100:80>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin webmaster@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]>
    # 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100
    ServerName www.example.org
    DocumentRoot /srv/www/htdocs/example.org
    ServerAdmin webmaster@example.org
    ErrorLog /var/log/apache2/www.example.org-error_log
    CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
                

Dans cet exemple, les domaines www.example.com et www.example.net sont hébergés sur la machine ayant l'adresse IP 192.168.1.100. Le premier VirtualHost est celui par défaut pour toutes les requêtes entrantes vers le serveur Web.

Les directives ErrorLog (décrites dans Section 46.3.2.3.4, « ErrorLog fichier | "|commande"  ») et CustomLog (voir http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog) n'ont pas besoin de contenir le nom de domaine. Vous pouvez utiliser ici le nom de votre choix.

46.4.2. Hôtes virtuels à base d'adresse IP

Cette autre configuration d'hôte virtuel nécessite la configuration de plusieurs adresses IP pour une machine. Une instance d'Apache héberge plusieurs domaines, chacun ayant une adresse IP différente.

[Important]Adresses IP et hôtes virtuels à base d'adresse IP

Le serveur physique doit avoir une adresse IP pour chaque hôte virtuel à base d'adresse IP. Si la machine n'a pas plusieurs cartes réseau, il est également possible d'utiliser des interfaces réseau virtuelles (alias IP).

46.4.2.1. Configuration d'alias IP

Pour qu'Apache héberge plusieurs adresses IP, la machine physique doit accepter les requêtes pour plusieurs IP. C'est ce que l'on nomme l'hébergement multi-IP. De plus, la gestion d'alias IP doit être activée dans le kernel. C'est le paramètre par défaut dans SUSE Linux.

Lorsque le kernel a été configuré pour la gestion d'alias IP, les commandes ifconfig et route peuvent être utilisées pour définir des IP supplémentaires sur l'hôte. Ces commandes doivent être exécutées par un utilisateur root.

Pour l'exemple suivant, on suppose que l'hôte a déjà l'adresse IP 192.168.0.10 attribuée au périphérique réseau eth0. Entrez la commande ifconfig pour afficher l'adresse IP de l'hôte. Il est possible d'ajouter d'autres adresses IP avec les commandes suivantes :

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0

Toutes ces adresses IP sont attribuées au même périphérique réseau physique (eth0).

46.4.2.2. <VirtualHost></VirtualHost> dans le contexte à base d'adresse IP

Une fois que la gestion d'alias IP a été configuré sur le système (ou que l'hôte a été équipé de plusieurs cartes réseau), Apache peut être configuré. Un bloc VirtualHost séparé est nécessaire pour chaque serveur virtuel.

L'exemple suivant montre Apache exécuté sur une machine ayant l'adresse IP 192.168.1.10, hébergeant deux domaines sur les adresses IP supplémentaires 192.168.0.20 et 192.168.0.30. Cet exemple particulier ne fonctionne que sur un réseau privé. En effet, les adresses IP de 192.168.0.0 à 192.168.0.255 ne sont pas routées vers Internet.

Exemple 46.10. Directives VirtualHost à base d'adresse IP

<VirtualHost 192.168.0.20>
   ServerName www.example.com 
   DocumentRoot /srv/www/htdocs/example.com 
   ServerAdmin webmaster@example.com 
   ErrorLog /var/log/apache2/www.example.com-error_log 
   CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30> 
   ServerName www.example.net 
   DocumentRoot /srv/www/htdocs/example.net 
   ServerAdmin tux@example.net 
   ErrorLog /var/log/apache2/www.example.net-error_log 
   CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost> 

Les directives VirtualHost ne sont ici spécifiées que pour les interfaces différentes de 192.168.0.10. Lorsqu'une directive Listen (décrite dans Sélection du périphérique réseau) est également configurée pour 192.168.0.10, un hôte virtuel à base d'adresse IP séparé doit être créé pour répondre aux requêtes HTTP vers cette interface. Sinon, les directives de la section Main Server de /etc/apache2/httpd.conf (voir Section 46.3.2.3, « Directives Apache dans /etc/apache2/httpd.conf: Serveur principal  ») sont appliquées.