Introduction
Le Serveur Web Apache2 est capable de gérer simultanément
plusieurs arborescences Web grâce à la notion d'hôtes Virtuels (Virtual
Hosts). Nous allons voir les différentes méthodes pour les mettre en
place.
Il est important de savoir que si vous avez déjà un serveur en activité, ce serveur doit lui aussi être configuré dans les hôtes virtuels ! Dans ce cas, vous voudrez sûrement le mettre en serveur "par défaut", répondant à toutes les requêtes, SAUF celles qui correspondront à vos autres serveurs virtuels.
Nous renseignons le fichier /etc/hosts afin d'assurer la résolution de nom (Nom –> Adresse Ip) des hôtes Virtuels que nous allons créer. Ceci n'est nécessaire que si votre serveur DNS (Serveur Bind) n'est pas installé et/ou configuré pour vos domaines 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, 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.
Il est important de savoir que si vous avez déjà un serveur en activité, ce serveur doit lui aussi être configuré dans les hôtes virtuels ! Dans ce cas, vous voudrez sûrement le mettre en serveur "par défaut", répondant à toutes les requêtes, SAUF celles qui correspondront à vos autres serveurs virtuels.
Nous renseignons le fichier /etc/hosts afin d'assurer la résolution de nom (Nom –> Adresse Ip) des hôtes Virtuels que nous allons créer. Ceci n'est nécessaire que si votre serveur DNS (Serveur Bind) n'est pas installé et/ou configuré pour vos domaines 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, 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.
Dans les 3 méthodes présentées sur ce tutoriel, on souhaite créer 2 hôtes virtuels : virtual1.fr et virtual2.fr ayant pour fichiers de configuration les fichiers virtual1.conf et virtual2.conf
Hôtes virtuels basés sur le nom
Cette méthode est la plus utilisée et la plus conseillée. Elle tend même
à devenir un standard. Il s'agit simplement d'associer plusieurs noms DNS à une seule adresse IP.
Attention, il faut également déclarer ces 2 sites dans le fichier /etc/hosts
Dans un premier temps nous allons définir des noms DNS pour nos sites : monsite1.fr et monsite2.fr
Il faut ajouter ces informations au fichier /etc/hosts pour que la résolution DNS pointe sur la machine locale (127.0.0.1) :
gksudo gedit /etc/hostset rajouter les deux lignes suivantes :
127.0.0.1 monsite1.fr 127.0.0.1 monsite2.frPuis nous allons créer deux dossiers dans le dossier /var/www qui est par défaut la racine d'apache. Vous pouvez les créer en interface graphique ou en ligne de commande via ces deux commandes :
sudo mkdir /var/www/monsite1 sudo mkdir /var/www/monsite2
Il n'est pas recommandé de
travailler directement dans des répertoires du serveur. Un lien
symbolique depuis le répertoire principal du serveur vers un répertoire
dans votre dossier personnel (par exemple: www-dev/monsite1) est mieux.
Pour travailler ainsi, il faut ignorer les deux commandes "sudo"
ci-dessus (Le mot "UTILISATEUR" dans les commandes ci-dessous doit être
remplacé par votre identifiant) :
Ces dossiers faits, nous allons créer les fichiers de configurations pour apache. Dans /etc/apache2/sites-available se trouve un fichier nommé default, ouvrez-le avec votre éditeur de texte favori (ne pas utiliser OpenOffice.org) puis modifiez de cette façon le fichier :
sudo mkdir /home/UTILISATEUR/www-dev/monsite1 sudo mkdir /home/UTILISATEUR/www-dev/monsite2 sudo ln -s /home/UTILISATEUR/www-dev/monsite1 /var/www/monsite1 sudo ln -s /home/UTILISATEUR/www-dev/monsite2 /var/www/monsite2 sudo chown -hR $USER:users /home/UTILISATEUR/www-dev/monsite1 sudo chown -hR $USER:users /home/UTILISATEUR/www-dev/monsite2 sudo chmod -R 755 /home/UTILISATEUR/www-dev/monsite1 sudo chmod -R 755 /home/UTILISATEUR/www-dev/monsite2
<VirtualHost *:80> ServerAdmin votre-mail@monsite1.fr ServerName monsite1.fr ServerAlias www.monsite1.fr DocumentRoot /var/www/monsite1 <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/monsite1> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>Ceci fait, enregistrez le fichier sous le nom monsite1 puis modifiez-le en mettant cette fois monsite2 à la place de monsite1, puis ré-enregistrez sous le nom de monsite2.
Si vous utilisez Drupal et le module apache mod_rewrite, vous devez corriger le fichier default dans /etc/apache2/sites-available qui est mentionné ci-dessus, et remplacer toutes les occurences
Pour terminer, il vous suffit de créer des liens des deux fichiers nouvellement créés dans le dossier /etc/apache2/sites-enabled. Pour ce faire, une commande a été faite spécialement :
AllowOverride Nonepar
AllowOverride All
sudo a2ensite monsite1 sudo a2ensite monsite2Puis, afin de recharger la configuration d'Apache :
sudo /etc/init.d/apache2 reloadVous pouvez alors accéder aux deux sites ! http://monsite1.fr affichera le contenu du dossier site1 et http://monsite2.fr affichera le contenu du dossier site2.
Si l'url http://monsite1.fr affiche seulement un index avec le dossier "home/www/monsite1", et que le contenu du site lui-même est dans http://monsite1.fr/monsite1,
c'est peut-être que votre lien vers home/www/monsite1 qui devrait se
trouver dans /var/www se trouve en fait dans /var/www/monsite1 (le
répertoire qu'il n'aurait pas fallut créer avant la mise en place du
lien symbolique).
Voici la commande pour désactiver le site "monsite1" :
sudo a2dissite monsite1 sudo /etc/init.d/apache2 reload
Astuce: empêcher l'accès au serveur via son adresse IP
Pour des raisons diverses, on peut souhaiter empêcher les utilisateurs
ne découvrant que l'adresse IP du serveur, de consulter son contenu.
La syntaxe est la suivante: il suffit de modifier le fichier /etc/apache2/site-enabled/000-default, et d'y ajouter au début un VirtualHost répondant à l'adresse IP:
Le Deny from all bloque l'accès à tout client qui appelle le site via l'adresse IP du serveur.
On garde ensuite, dans le même fichier, la configuration habituelle, avec une petite modification:
Attention: cette technique n'est pas, à proprement parler, une "sécurisation". Elle évite juste de recevoir du trafic inutile de la part de bots, ou de se faire fouiller son serveur par des gens pratiquant le scan de port. Bien évidemment, si vous rendez publique le nom de domaine menant à votre serveur, ça ne change pas grand chose.
La syntaxe est la suivante: il suffit de modifier le fichier /etc/apache2/site-enabled/000-default, et d'y ajouter au début un VirtualHost répondant à l'adresse IP:
<VirtualHost *:80> ServerName www.xxx.yyy.zzz <Directory /> Deny from all </Directory> </VirtualHost>Où "www.xxx.yyy.zzz" est l'adresse IP publique du serveur.
Le Deny from all bloque l'accès à tout client qui appelle le site via l'adresse IP du serveur.
On garde ensuite, dans le même fichier, la configuration habituelle, avec une petite modification:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName mon_joli_domaine [...]blah blah </VirtualHost>Il faut ajouter la directive ServerName et y placer le nom de domaine du serveur. Cela peut-être un nom dynamique (fourni par des services comme no-ip ou Dyndns).
Attention: cette technique n'est pas, à proprement parler, une "sécurisation". Elle évite juste de recevoir du trafic inutile de la part de bots, ou de se faire fouiller son serveur par des gens pratiquant le scan de port. Bien évidemment, si vous rendez publique le nom de domaine menant à votre serveur, ça ne change pas grand chose.
Hôtes virtuels basés sur le port
Par défaut, le Serveur Web Apache2 est configuré pour écouter sur le port 80. Il est possible d'utiliser des ports différents pour chaque hôte virtuel.
Dans cet exemple, les deux Sites 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 déclarer les 2 noms de domaine associés à 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 :
virtual1.conf :
Précisez au serveur Apache2 d'écouter sur le port 8080 en ajoutant la ligne suivante dans le fichier /etc/apache2/ports.conf
Le site virtual1.com sera accessible via l'url : http://virtual1.com et le site virtual2.com via l'url : http://virtual2.com:8080
Dans cet exemple, les deux Sites 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 déclarer les 2 noms de domaine associés à 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.comEnsuite, nous créons 2 fichiers de configuration virtual1.conf et virtual2.conf de la même manière qu'avec la méthode précédente, mais contenant :
virtual1.conf :
<VirtualHost 192.168.0.2:80> DocumentRoot /var/www/virtual1.com ServerName virtual1.com </VirtualHost>virtual2.conf :
<VirtualHost 192.168.0.2:8080> DocumentRoot /var/www/virtual2.com ServerName virtual2.com </VirtualHost>Activez alors les hôtes virtuels de la même manière qu'avec la première méthode.
Précisez au serveur Apache2 d'écouter sur le port 8080 en ajoutant la ligne suivante dans le fichier /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default # This is also true if you have upgraded from before 2.2.9-3 (i.e. from # Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and # README.Debian.gz NameVirtualHost *:80 Listen 80 Listen 8080 <IfModule mod_ssl.c> # SSL name based virtual hosts are not yet supported, therefore no # NameVirtualHost statement here Listen 443 </IfModule>Enfin, rechargez la configuration du serveur Apache2.
Le site virtual1.com sera accessible via l'url : http://virtual1.com et le site virtual2.com via l'url : http://virtual2.com:8080
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 , soit de plusieurs adresses IP associées à une seule
interface réseau.
Dans ce dernier cas, on parlera d'IP aliasing. Les systèmes GNU/Linux, notamment les distributions Ubuntu et Debian, permettent de mettre facilement en oeuvre cette fonctionnalité.
Association d'une 2nd adresse IP à une interface 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.
Consultons la configuration réseau de la machine :
Nous devons donc associer une seconde adresse IP à notre interface réseau avec la commande :
Ceci est vérifiable avec la commande :
Consultons la configuration réseau de la machine :
ifconfigNous obtenons quelque chose comme
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)Ce qui nous intéresse ici est la première série d'informations. Elle nous indique que nous disposons d'une interface réseau (eth0) de type Ethernet à laquelle est associée l'adresse IP 192.168.0.2.
Nous devons donc associer une seconde adresse IP à notre interface réseau avec la commande :
sudo ifconfig eth0:0 192.168.0.100Notre interface réseau dispose maintenant de 2 adresses IP bien distinctes : 192.168.0.2 (Adresse IP) et 192.168.0.100 (Alias IP)
Ceci est vérifiable avec la commande :
ifconfig -a
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 utilisant chacun une adresse IP.
Dans un premier temps, nous renseignons le fichier /etc/hosts avec deux noms de sites (ceux de nos hôtes Virtuels) associés respectivement aux deux adresses IP disponibles afin de permettre la résolution de nom (Nom ⇒ Adresse Ip).
Exemple de fichier hosts :
virtual1.conf :
Dans chacun des fichiers de configuration, on retrouve pour l'hôte virtuel, l'adresse IP choisie, ainsi que le port (80). Les 2 directives minimales sont DocumentRoot et ServerName.
DocumentRoot permet de déclarer l'emplacement de l'arborescence Web de l'hôte virtuel (l'emplacement des fichiers sur votre système). Le nom du répertoire ne doit pas comporter le caractère / final.
ServerName permet de définir le nom de domaine du Serveur Virtuel.
Dans un premier temps, nous renseignons le fichier /etc/hosts avec deux noms de sites (ceux de nos hôtes Virtuels) associés respectivement aux deux adresses IP disponibles afin de permettre 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.100 virtual2.comUne fois notre fichier
/etc/hosts
correctement renseigné,
il ne nous reste plus qu'à configurer nos hôtes virtuels en créant deux
nouveaux fichiers dans le répertoire /etc/apache2/sites-available :
virtual1.conf :
<VirtualHost 192.168.0.2:80> DocumentRoot /var/www/virtual1.com ServerName virtual1.com </VirtualHost>virtual2.conf :
<VirtualHost 192.168.0.100:80> DocumentRoot /var/www/virtual2.com ServerName virtual2.com </VirtualHost>Explication :
Dans chacun des fichiers de configuration, on retrouve pour l'hôte virtuel, l'adresse IP choisie, ainsi que le port (80). Les 2 directives minimales sont DocumentRoot et ServerName.
DocumentRoot permet de déclarer l'emplacement de l'arborescence Web de l'hôte virtuel (l'emplacement des fichiers sur votre système). Le nom du répertoire ne doit pas comporter le caractère / final.
ServerName permet de définir le nom de domaine du Serveur Virtuel.
Les répertoires
Pour les tests vous pouvez utiliser le chmod 755 sur ces répertoires.
Nos deux hôtes virtuels étant configurés, nous allons les activer avec les commandes :
/var/www/virtual1.com
et /var/www/virtual2.com
doivent exister et bénéficier des bonnes permissions.Pour les tests vous pouvez utiliser le chmod 755 sur ces répertoires.
sudo a2ensite virtual1.conf sudo a2ensite virtual2.confN'oubliez pas de recharger la configuration du serveur :
sudo /etc/init.d/apache2 reload