Les hôtes virtuels (virtual hosts) avec Apache2 cc
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.
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.
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/hosts
et rajouter les deux lignes suivantes :
127.0.0.1 monsite1.fr 127.0.0.1 monsite2.fr
Puis 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
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
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 :
<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.conf puis modifiez-le en mettant cette fois monsite2 à la place de monsite1, puis ré-enregistrez sous le nom de monsite2.conf.
AllowOverride None
par
AllowOverride All
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 :
sudo a2ensite monsite1.conf sudo a2ensite monsite2.conf
Puis, afin de recharger la configuration d'Apache :
sudo /etc/init.d/apache2 reload
Vous 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.
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/sites-enabled/000-default, et d'y ajouter au début un VirtualHost répondant à l'adresse IP:
<VirtualHost www.xxx.yyy.zzz: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 :
127.0.0.1 localhost 192.168.0.2 virtual1.com 192.168.0.2 virtual2.com
Ensuite, 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 adresse IP.
Consultons la configuration réseau de la machine :
ifconfig
Nous 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.100
Notre 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 :
127.0.0.1 localhost 192.168.0.2 virtual1.com 192.168.0.100 virtual2.com
Une 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.
/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.
Nos deux hôtes virtuels étant configurés, nous allons les activer avec les commandes :
sudo a2ensite virtual1.conf sudo a2ensite virtual2.conf
N'oubliez pas de recharger la configuration du serveur :
sudo /etc/init.d/apache2 reload
Ressources externes
- Exemples de la documentation officielle : https://httpd.apache.org/docs/2.4/vhosts/ (fr)
Contributeurs : M. DECLERCQ, _Enchained, dolmen, stephaneguedon, monsar01