Stay tuned
TUTORIAL : Serveur Web Apache 2 - VirtualHost
Posted by M. declercq on Jul. 24 2006, commented by Bobinours on May 10, (popular)
Tags: apache virtualhost apache2 virtuel port ip aliasing réseau
Le Serveur Web Apache2 est capable de gérer simultanément plusieurs arborescences Web grâce à la notion d'hôtes Virtuels (Virtual Hosts).
Description du tutorial
Ce tutorial traite des divers méthodes relatives à la mise en place d'Hôtes Virtuels (VirtualHost) avec le Serveur Web Apache2 installé sur une distribution Ubuntu ou Débian.Note importante Dans le cadre de ce tutoriel, nous renseignons le fichier /etc/hosts afin d'assurer la résolution de nom (Nom ==> Adresse Ip) des hôtes Virtuels. Ceci est nécessaire que si votre serveur DNS (Serveur Bind) n'est pas installé et/ou configuré ou encore, que les noms DNS attribués aux hôtes Virtuels sont purement fictifs ou ne vous appartiennent pas.
Si vous désirez tester toutes les méthodes proposées dans ce tutorial, pensez à effacer la configuration précédente pour ne pas créer des conflits entre les hôtes Virtuels. Il en va de même pour le fichier /etc/hosts.
Introduction
Comme évoqué ci-dessus, le Serveur Web Apache2 peut gérer plusieurs arborescences Web grâce à la notion d'hôtes Virtuels (VirtualHost).Pour cela, plusieurs méthodes existent :
I. Les Hôtes Virtuels basés sur l'adresse Ip ;
II. Les Hôtes Virtuels basés sur le numéro de port ;
III. Les Hôtes Virtuels basés sur le nom.
I. Les Hôtes Virtuels basés sur l'adresse Ip :
Dans le cadre de cette méthode, le Serveur est soit doté de plusieurs interfaces réseau (plusieurs cartes réseau), soit doté de plusieurs adresses Ip asociées à une seule interface réseau (une seule carte réseau). Dans ce dernier cas, on parlera d'Ip aliasing. Les systèmes Linux, notamment les distributions Ubuntu et Débian, permettent de mettre facilement en oeuvre cette dernière fonctionnalité (Ip aliasing).A. Association d'une deuxième adresse Ip à une carte Réseau (Ip aliasing)
Dans cet exemple, nous partirons du principe que nous possédons une seule interface réseau à laquelle nous voulons associer une seconde adresses Ip.
Dans un premier temps, nous exécutions la commande suivante pour prendre connaissance de la configuration de notre interface réseau :
$ sudo ifconfiget voici le résultat que nous obtenons :
coucou@serveur:~$ ifconfigCe qui nous intéresse ici c'est le premier paragraphe. Ce paragraphe nous indique que nous disposons d'une interface réseau de type Ethernet d'adresse Ip 192.168.0.2.
eth0 Lien encap:Ethernet HWaddr 00:13:D3:3C:58:84
inet adr:192.168.0.2 Bcast:192.168.0.255 Masque:255.255.255.0
adr inet6: fe80::213:d3ff:fe3c:5884/64 Scope:Lien
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Packets reçus:1257 erreurs:0 :0 overruns:0 frame:0
TX packets:1247 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
Octets reçus:1037747 (1013.4 KiB) Octets transmis:423117 (413.2 KiB)
Interruption:209 Adresse de base:0x8000
lo Lien encap:Boucle locale
inet adr:127.0.0.1 Masque:255.0.0.0
adr inet6: ::1/128 Scope:Hôte
UP LOOPBACK RUNNING MTU:16436 Metric:1
Packets reçus:429 erreurs:0 :0 overruns:0 frame:0
TX packets:429 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
Octets reçus:117583 (114.8 KiB) Octets transmis:117583 (114.8 KiB)
Nous disposons donc d'une seule est unique adresse Ip qui est 192.168.0.2.
Nous devons donc associer une seconde adresse Ip à notre interface réseau. Pour ce faire, il nous suffit simplement d'exécuter la commande suivante :
$ sudo ifconfig eth0:0 192.168.0.100Grâce à la commande évoquée ci-dessus, nous avons associé une seconde adresse Ip ==> 192.168.0.100 à notre interface réseau.
Dès à présent, notre interface réseau dispose de deux adresse Ip bien distinctes :
192.168.0.2 (Adresse Ip) et 192.168.0.100 (Alias Ip)
Ceci est vérifiable en exécutant la commande suivante dans un terminal :
$ sudo ifconfig
B.Configuration des Hôtes Virtuels :
Ayant associé une nouvelle adresse Ip à notre unique carte réseau, nous pouvons désormais créer nos deux Hôtes Virtuels (sites virtuels) utilisant chacun une adresse Ip bien distincte.
Dans un premier temps, nous renseignons le fichier /etc/hosts avec deux noms (ceux de nos hôtes Virtuels) associés respectivement aux deux adresses Ip disponibles afin de permettent la résolution de nom (Nom ==> Adresse Ip).
Exemple de fichier hosts :
127.0.0.1 localhostUne fois notre fichier /etc/hosts correctement renseigné, il ne nous reste plus qu'à configurer nos Hôtes Virtuels.
192.168.0.2 virtual1.com
192.168.0.100 virtual2.com
Pour ce faire, il nous suffit de créer deux nouveaux fichiers dans le répertoire /etc/apache2/sites-available :
1er fichier de configuration :
Dans cet exemple, le premier fichier de configuration se nomme : virtual1.conf
Ce fichier contient le contenu minimal suivant :
<VirtualHost 192.168.0.2:80>2ème fichier de configuration :
DocumentRoot /var/www/virtual1.com
ServerName virtual1.com
</virtualHost>
Dans cet exemple, le deuxième fichier de configuration se nomme : virtual2.conf
Ce fichier contient le contenu minimal suivant :
<VirtualHost 192.168.0.100:80>
DocumentRoot /var/www/virtual2.com
ServerName virtual2.com
</VirtualHost>
Note : Dans chacun des fichiers de configuration, nous devons prévoir une strophe
La directive DocumentRoot, à ne pas confondre avec la directive ServerRoot, permet de déclarer l'emplacement de l'arborescence Web du site virtuel qui sera accessible par les clients. Le nom du répertoire ne doit pas comporter le caractère / final.
La directive ServerName permet de définir le Nom DNS du Serveur ainsi que le port utilisé par défaut. Dans le cadre d'Hôtes Virtuels, on parlera de Serveurs Virtuels.
Attention : Les répertoires /var/www/virtual1.com et /var/www/virtual2.com doivent exister et doivent bénéficier des bonnes permissions. A défaut, le Serveur Web Apache2, lors du reload (re-lecture de ses fichiers de configurations), renverra des erreurs. Pour les testes, vous pouvez appliquer un chmod 755 sur ces répertoires.
Nos deux hôtes Virtuels étant configurés, nous devons dès à présent les activer. Pour ce faire, nous exécutons les commandes suivantes :
$ sudo a2ensite virtual1.confet
$ sudo a2ensite virtual2.conf
Note : La commande a2ensite a pour effet de créer des liens symboliques des deux fichiers de configuration (VirtualHost) créés précédement, liens qui seront placés dans le répertoire /etc/apache2/sites-enabled, ce qui permettra au Serveur Web Apache2 de les interpréter grâce à la directive d'inclusion ==> Include /etc/apache2/sites-enabled/[^.#]* qui elle, se trouve dans le fichier de configuration principale (apache2.conf).
Enfin, pour que les modifications soient prises en comptes par le Serveur Web Apache2, nous demandons à ce dernier de relire ses fichiers de configuration :
$ sudo /etc/init.d/apache2 reload
II. Hôtes Virtuels basés sur le numéro de port :
Par défaut, le Serveur Web Apache2 est configuré pour écouter sur le port 80. Ce faisant, il est possible d'utiliser des ports bien distincts pour chaques hôtes Virtuels.Exemple : Dans cette exemple, les deux hôtes Virtuels virtual1.com et virtual2.com se partagent la même adresse Ip : 192.168.0.2. Seul le port d'écoute est différent.
Dans un premier temps, nous allons éditer le fichier /etc/hosts afin de donner deux noms bien distincts à la seule et unique adresse Ip de notre interface réseau. Ceci permettra la résolution de nom (Nom --> Adresse Ip).
Exemple de fichier hosts :
127.0.0.1 localhost
192.168.0.2 virtual1.com
192.168.0.2 virtual2.com
Ensuite, nous créons deux fichiers de configuration (VirtualHost) que nous plaçons dans le répertoire /etc/apache2/sites-available.Voici ce que contiennent ces deux fichiers de configuration : 1er fichier de configuration qui se nomme virtual1.conf :
<VirtualHost 192.168.0.2:80>2ème fichier de configuration qui se nomme virtual2.conf :
DocumentRoot /var/www/virtual1.com
ServerName virtual1.com
</VirtualHost>
<VirtualHost 192.168.0.2:8080>
DocumentRoot /var/www/virtual2.com
ServerName virtual2.com
</VirtualHost>
Note : Dans cet exemple, le site virtual1.com sera accessible via l'url : http://virtual1.com et le site virtual2.com sera accessible via l'url : http://virtual2.com:8080.
Attention : Les répertoires /var/www/virtual1.com et /var/www/virtual2.com doivent exister et doivent bénéficier des bonnes permissions. A défaut, le Serveur Web Apache2, lors du reload, renverra des erreurs. Pour les testes, vous pouvez appliquer un chmod 755 sur ces répertoires.
Encore une fois, nous devons activer les deux hôtes Virtuels avec la commande a2ensite (cf. ci-avant) et nous devons demander au Serveur Web Apache2 de relire ses fichiers de configuration pour que les changements soient pris en comptes ==> /etc/init.d/apache2 reload.
III. Hôtes Virtuels basés sur le nom :
Cette troisième méthode et celle qui est la plus utilisée et aussi la plus conseillée. Elle tend même à devenir un standart. Il s'agit simplement d'associer plusieurs noms DNS à une seule adresse IP.Dans l'exemple suivant, nous allons configurer deux hôtes virtuels qui utiliseront tout les deux l'adresse Ip 192.168.0.2.
Dans un premier temps, nous allons éditer le fichier /etc/hosts afin de donner deux noms bien distincts à la seule et unique adresse Ip de notre interface réseau. Ceci permettra la résolution de nom (Nom ==> Adresse Ip). Exemple de fichier /etc/hosts :
127.0.0.1 localhostNotre fichier /etc/hosts étant correctement renseigné, nous allons rajouter la directive NameVirtualHost à la fin du fichier /etc/apache2/apache2.conf qui n'est autre que le fichier de configuration principale du Serveur Web Apache2.
192.168.0.2 virtual1.com
192.168.0.2 virtual2.com
Cette directive correspond à celle sur laquelle le Serveur Web Apache2 acceptera uniquement les requêtes adressées aux hôtes Virtuels que nous allons définir ci-après.
A la fin du fichier /etc/apache2/apache2.conf nous rajoutons donc :
NameVirtualHost 192.168.0.2:80Ensuite, nous créons deux nouveaux fichiers de configurations (VirtualHost) que nous plaçons dans le répertoire /etc/apache2/sites-available.
Voici ce que contiennent ces deux fichiers de configuration :
1er fichier de configuration qui se nomme virtual1.conf :
<VirtualHost 192.168.0.2:80>2ème fichier de configuration qui se nomme virtual2.conf :
DocumentRoot /var/www/virtual1.com
ServerName virtual1.com
</VirtualHost>
<VirtualHost 192.168.0.2:80>Attention : Les répertoires /var/www/virtual1.com et /var/www/virtual2.com doivent exister et doivent bénéficier des bonnes permissions. A défaut, le Serveur Web Apache2, lors du reload, renverra des erreurs. Pour les testes, vous pouvez appliquer un chmod 755 sur ces répertoires.
DocumentRoot /var/www/virtual2.com
ServerName virtual2.com
</VirtualHost>
Encore une fois, nous devons activer les deux hôtes Virtuels avec la commande a2ensite et nous devons demander au Serveur Web Apache2 de relire sa configuration pour que les modifications soient pris en comptes ==> /etc/init.d/apache2 reload.
Mise en garde
Dans les exemples ci-dessus, nous n'avons pas fait état des directives qui d'usage, doivent êtres présentes dans les fichiers de configurations des Sites Virtuels (VirtualHost), notamment :Les directives ServeurAdmin, ErrorLog et CustomLog qui sont des directives qu'il est fortement conseillé d'inclure dans les fichiers de configuration de vos Sites Virtuels.
Ce tutoriel a été rédigé pour l'utilisation du Serveur Web Apache2 sur les distributions Ubuntu et Débian. En conséquence, certaines commandes, notamment a2ensite, risquent de ne pas fonctionner sur une distribution telle que : Red Hat, Gentoo, Suze, Mandriva...
Toutefois, mis à par la procédure d'activation des hôtes Virtuels qui est un peu différente selon les distributions Linux utilisées, les méthodes relatives à la mise en place d'un hôte virtuel restent quasi identiques.
Une erreur, une incompréhension concernant ce tutoriel ? n'hésitez pas à utiliser la fonction commentaire de notre portail et/ou à nous joindre directement en utilisant notre formulaire contact : Nous contacter
Par M. Laurent DECLERCQ
v1.3 build 20080324.0705
Nickel, j'ai utilisé la troisième méthode (Hôtes Virtuels basés sur le nom).
Je me demande simplement comment rediriger un nom de domaine sur un deuxième hote virtuel (j'ai une ip dynamique)

Bonjour ;
Vous pouvez vous inscrire sur nos forums pour recevoir une réponse.
_________________________________
Bien cordialement ; L'équipe du portail nuxwin
J'ai suivi ce tuto pour la méthode 3 et j'ai bataillé pendent 3 heures pour m'apercevoir dans mon cas que le reboot était nécessaire après installation des 2 sites virtuels même après : $ sudo a2ensite virtual1.conf $ sudo a2ensite virtual2.conf $ sudo /etc/init.d/apache2 reload
donc il y a un point à revoir ; l'oubli était peut-être de rendre les sites crées disponibles ainsi : $ ln -s /etc/apache2/sites-available/virtual1.conf /etc/apache2/sites-enabled/virtual1.conf $ ln -s /etc/apache2/sites-available/virtual2.conf /etc/apache2/sites-enabled/virtual2.conf Par ailleurs :
- j'ai vu d'autres documentations où on place les informations des fichiers de configuration des sites virtuels directement dans le fichier de configuration de apache2 : "apache2.conf" mais je préfère de loin l'architecture proposée ici.
Enfin je tiens à signaler que j'ai mis longtemps à comprendre la bug concernant l'utilisation en cours du port 80 par une autre application : j'avais installé apache2.perl qui en fait monopolisait ce port ; il a suffit de le désinstaller pour corriger ce problème.
Tres bon tuto clair et détaillé, qui m' a rendu un fier service ,un ENORME MERCI à l'auteur

J'ai rencontré un problème de "...mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results" en suivant pas à pas la méthode III.
J'ai corrigé l'erreur en enlevant le port :80 de mes .
Merci pour ce tutoriel.
