Virtual Hosting

Une zone pour les utilisateurs enregistrés qui désirent contribuer au site et faire profiter la communauté de leur expérience d'Apache.

Modérateur : Gandalf

Avatar de l’utilisateur
apis
Pilier de forum
Pilier de forum
Messages : 1107
Inscription : sam. 21 févr. 2004, 14:50
Localisation : Lyon
Contact :

Messagepar apis » mer. 16 juin 2004, 14:24

A quoi servent les Vhost ?

Les Vhost sont un outil qui permet à un serveur Apache de répondre à des requêtes de façon différentes en fonction du domaine ou sous-domaine concerné. Pour cela, les navigateurs WEB envoie dans les entêtes HTTP la spécification 'Host:' qui est implémentée par défaut dans HTTP1.1 et que l'on peut ajouter comme extension aux navigateurs HTTP1.0.

Les domaines http://www.domaine1.com et http://www.domaine2.com sont liés par les serveurs DNS à une adresse IP. On peut indiquer la même adresse IP pour deux domaines, à condition d'utiliser la méthode Virtual Host, sous peine d'avoir le même site répondant à deux URL différentes.

Ce mécanisme puissant permet de repartir les requêtes en fonction de nom de domaine sur plusieurs machines, de varier les consignes de sécurité, on simplement de personnaliser différents sous-domaines

Nous allons voir dans cet article les prérequis à son utilisation, puis comment installer les hôtes virtuels pour un domaine ou des sous-domaines, et enfin nous verrons comment se servir de cette différenciation.


1.0 - Configuration d'Apache

Afin de se servir des Vhosts, il va falloir activer le mod vhost_alias_module à l'aide de LoadModule qui se trouve aux alentours de la ligne 130 dans le fichier 'httpd.conf' Ce mode est normalement activé par défaut. Si ce n'est pas le cas, enlevez le # devant la ligne 'LoadModule vhost_alias_module modules/mod_vhost_alias.so' ou copiez la si elle n'existe pas. Pour ceux qui ne trouverait pas le fichier de configuration, il se trouve dans '%ApacheRoot%/conf/http.conf'.

Pour simplifier la mise en place des Hôtes Virtuels, nous faire cela dans un fichier annexe nommé 'Vhost.conf' a placer dans le répertoire '%ApacheRoot%/conf/'

Pour que le serveur aille verifier notre second fichier de configuration, il faudra ajouter à la fin de 'httpd.conf' la ligne :

#VHOSTS CONFIGURATION
include conf/vhost.conf


2.0 - Installer les hôtes virtuels

Le vhosts nécessite qu'on les déclare préalablement au moyen de 'NameVirtualHost host:port'.
Le tag 'port' est facultatif, par defaut, c'est celui indiqué au début de 'httpd.conf', le port 80 si vous ne l'avez pas changé.Sinon, indiquer le port d'écoute de l'hôte virtuel à cet emplacement. Le tag 'host' est obligatoire. Il doit être remplacé par l'adresse IP d'où proviendront les requêtes HTTP. On peut aussi écrire le nom hostname du vhost (ex: 'www.domaine1.com') ou alors simplement mettre une étoile (*) qui indique que le serveur Apache répondra aux requêtes provenant sur n'importe quel adresse ip.

Attention: il peut être interressant d'indiquer une adresse ip fixe dans le cas ou le serveur réponde aux requêtes venant d'une carte réseau reliée à l'Intranet, et d'une autre reliée à Internet. Sinon, il est préférable de placer une étoile (*).

si vous indiquez une adresse ip fixe, quand votre adresse ip changera, le serveur ne répondra plus aux requêtes du Vhost si vous ne le redemarrez pas.
si vous utilisez un domaine dynamique de type DynDns ou NoIp.com, sachez que Apache va transformer ce nom en adresse IP à son démarrage. Si l'IP du domaine change, Apache ne répondera plus.
Pour pouvoir utiliser les vhost avec les sous-domaine, il faut qu'un ping sur 'sous.domaine.com' renvoi la même adresse IP que 'domaine.com'

2.1 ? Les hôtes statics

Ensuite, nous allons écrire les balises '<VirtualHost host:port></VirtualHost>' dans le fichier 'vhost.conf' où host et port DEVRONT avoir été nommé par 'NameVirtualHost' pour éviter un mauvais fonctionnement des avertissements logs au démarrage d'Apache.


Dans le cas de plusieurs domaines, écrivez :

NameVirtualHost *

<VirtualHost *:80>
ServerAlias http://www.domaine1.com
DocumentRoot d:/web/www1/
</VirtualHost>

<VirtualHost *:80>
ServerAlias http://www.domaine2.com
DocumentRoot d:/web/www2/
</VirtualHost>


Ou pour plusieurs sous-domaines:

NameVirtualHost *

<VirtualHost *:80>
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
</VirtualHost>

<VirtualHost *:80>
ServerAlias www2.domaine.com
DocumentRoot d:/web/www2/
</VirtualHost>


Pour tout les sous-domaines :

NameVirtualHost *

<VirtualHost *:80>
ServerAlias *.domaine.com
DocumentRoot d:/web/sous-domaines/
</VirtualHost>

La directive 'ServerAlias' indique à Apache que la configuration qui suit ne concernera que les demandes venant de domaine précisé. Dans le dernier cas, tout les requêtes concernant un sous-domaine de 'domaine.com' seront dirigés vers le 'd:/web/sous-domaines/'.


2.2 - Les hôtes dynamiques

Encore une fois, Apache n'a pas fait la moitié des choses. Dans les exemples précédents, l'ajout d'un domaine ou sous domaine nécessite la modification de notre fichier 'vhost.conf'. Une fonction très interréssante du mod vhost est 'VirtualDocumentRoot' qui permet ne spécifier le repertoire racine en fonction du nom d'hôte recherché.

NameVirtualHost *

<VirtualHost *:80>
ServerName nwh.ath.cx
ServerAlias *.nwh.ath.cx
VirtualDocumentRoot d:/web/%1/
</VirtualHost>


La directive 'ServerName' indique à quel hôte est rattaché le sous-domaine. Ecrivez simplement le nom de domaine.
Pour utiliser les racines virtuels, il est bon de s'avoir certains codes :

%0
nom complet de l'hôte: http://www.domaine.com

%1
1ère partie du domaine: www

%2
2ème partie du domaine: domaine

%3
3ème partie du domaine: com

%2.1
1ère lettre de la 2ème partie: d

%2.2
2ème lettre de la 2ème partie: o

%2+
2ème partie et suite: domaine.com

%2.-3
3ème lettre en partant de la fin de la 2ème partie: i

Classiquement, les gros hebergeurs comme free classent les sites web ainsi:

/usr/%1.1/%1.2/%1.3/%1

Ce qui pour le site 'triptika.free.fr' donne '/usr/t/r/i/triptika/'

Pour les sites personnels, le premier exemple de 'VirtualDocumentRoot' est le plus commun.


2.3? Des hôtes différents

Apache permet également d'utiliser une seule adresse IP mais plusieurs domaines correspondant derrière à plusieurs machine.


NameVirtualHost *

<VirtualHost *:80>
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
</VirtualHost>

<VirtualHost *:80>
ServerAlias www2.domaine.com
VirtualDocumentRootIP d:/web/%0/
</VirtualHost>


Toutes les demandes concernant le sous-domaine www2.domaine.com seront redirigée dynamiquement vers le root d:/web.
Si on se connecte ici sur www2.domain.com avec l'ip 1.2.3.4, le root sera
d:/web/1/

3.0- Utilisation avancée des hôtes virtuels

Pour utiliser les capacités offertes par le module vhost, nous allons personnaliser chaque vhost.




NameVirtualHost *

<VirtualHost *:80>
ServerAdmin admin@domaine1.com
ServerAlias www1.domaine.com
DocumentRoot d:/web/www1/
RewriteEngine On
RewriteLog d:/web/log1/rewrite.log
SetOuputFiler INJECTION
InjectAfter '>'
InjectString '<b>Vous naviguez sur domaine1</b>'
</VirtualHost>

<VirtualHost *:80>
ServerAdmin admin@domaine2.com
ServerAlias www2.domaine.com
DocumentRoot d:/web/www2/
ErrorLog d:/web/log2/error.log
TransfertLog d:/web/log2/acces.log
php_value open_base_dir d:/web/www2/
</VirtualHost>



Une grande partie des directives de 'httpd.conf' peuvent être specialement definies entre deux balises '<Virtual Host>' ce qui vous permet de personnaliser en profondeur chaque hôte virtuel pour lui permettre ou non l'execution de script '.cgi', pour changer le repertoire de 'perl.exe', ou encore injecter du texte dans un des deux domaine (ici domaine1).




4.0 - Conclusion

Ce module permet à Apache d'offrir encore plus de fonctions très interressantes pour une organisation plus lisible des URL d'un domaine, ou encore pour sécurisé le serveur en le divisant en plusieurs 'sous-serveurs' n'ayant pas les mêmes droits. Tout ce qui a été présenté ici a été appris grace à la documentation apache et peut-être approfondit grâce à celle-ci
Nekralium Admin: Au jour du jugement, la plume du savant pèsera autant que l'épée du guerrier.

Avatar de l’utilisateur
Geronimo
Grand chef des forums
Grand chef des forums
Messages : 212
Inscription : jeu. 04 déc. 2003, 21:14
Localisation : France
Contact :

Messagepar Geronimo » lun. 12 juil. 2004, 11:00

Pour info, voici la config Vhost du httpd.conf utilisé par SourceForge !

Code : Tout sélectionner

# *.sourceforge.net mass virtual host
<VirtualHost 10.4.1.43>
        ServerName %1.sourceforge.net

        # rewrite sf.net -> sourceforge.net
        RewriteEngine on
        RewriteCond     %{HTTP_HOST}    ^(.*)\.sf\.net [NC]
        RewriteRule     ^(.*)           http://%1.sourceforge.net$1 [R,L]
        
        VirtualDocumentRoot /home/groups/%1.1/%1.1%1.2/%1/htdocs
        VirtualScriptAlias /home/groups/%1.1/%1.1%1.2/%1/cgi-bin
</VirtualHost>

<VirtualHost 10.4.1.53>
        RewriteEngine on
        CustomLog   "|/usr/sbin/cronolog --symlink=/var/local/logs/vhost_log /var/local/logs/%Y/%m/%d/vhost_log" vhost
    
        #  define two maps: one for fixing the URL and one which defines
        #  the available virtual hosts with their corresponding
        #  DocumentRoot.
        RewriteMap   lowercase  int:tolower
        RewriteMap   vhost      txt:/etc/apache/vhost.map

        # add an trailing / if needed
#       RewriteCond  %{REQUEST_URI}               !^/.*/
#       RewriteRule  ^/(.*)$                      %1/$1/
#       RewriteCond  %{REQUEST_URI}               !^/icons/

        RewriteCond  %{REQUEST_URI}               ^/cgi-bin/
        RewriteCond  ${lowercase:%{SERVER_NAME}}  ^(.+)$
        RewriteCond  ${vhost:%1}                  ^(/.*)$
        RewriteRule  ^/(.*)$                      %1/$1 [T=application/x-httpd-cgi] [E=VHOST:${lowercase:%{SERVER_NAME}}]
        
        RewriteCond  %{REQUEST_URI}               !^/cgi-bin/
        RewriteCond  %{REQUEST_URI}               !^/icons/
        RewriteCond  ${lowercase:%{SERVER_NAME}}  ^(.+)$
        # this does the file-based remap
        RewriteCond  ${vhost:%1}                  ^(/.*)$
        RewriteRule  ^/(.*)$                      %1/htdocs/$1 [E=VHOST:${lowercase:%{SERVER_NAME}}] [E=DOCUMENT_ROOT:%1/htdocs/$1]
</VirtualHost>


Voici également un extrait du fichier vhost.map utilisé dans le code ci-dessus.

Code : Tout sélectionner

browsecode.org                                    /home/groups/s/sh/sheets
btechmux.cjb.net                                  /home/groups/b/bt/btech
budakdegil.org                                    /home/groups/b/bo/borak
budakkl.net                                       /home/groups/k/ka/kaypo
buffbot.org                                       /home/groups/a/ac/acmm
bug-inventory.org                                 /home/groups/b/bu/buginventory
bug-invoicing.org                                 /home/groups/b/bu/buginvoic
bug-mall.org                                      /home/groups/b/bu/bugmall
bug.sqml.org                                      /home/groups/s/sq/squirrelmail
bug.squirrelmail.org                              /home/groups/s/sq/squirrelmail
Donne un poisson à un homme, tu le nourriras une journée.
Apprends-lui à pêcher, il mangera toute sa vie.

Avatar de l’utilisateur
apis
Pilier de forum
Pilier de forum
Messages : 1107
Inscription : sam. 21 févr. 2004, 14:50
Localisation : Lyon
Contact :

Messagepar apis » dim. 10 oct. 2004, 0:54

j'ajoute également, une fonction interessante, beaucoup de gens demande comment se servir d'apache en serveur front.

Il faut utiliser le mod_proxy et les directives proxypass et proxypassreverse


Un exemple

NameVirtualHost *

<VirtualHost *:443>
ServerName domain.tld
DocumentRoot bidon
ProxyPass / <a href='http://machinelocal2:443/' target='_blank'>http://machinelocal2:443/</a>
ProxyPassReverse <a href='http://machinelocal2:443/' target='_blank'>http://machinelocal2:443/</a>
</VirtualHost>


L'exemple ici, permet de rediriger les requetes SSL venant sur domain.tld, vers machinelocal2



Du coup, on peut aussi s'en servir pour utiliser plusieurs domaines sur plusieur smachines, mais avec un serveur front.

NameVirtualHost *

<VirtualHost *:80>
ServerName domain1.tld
ServerAlias *.domain1.tld
DocumentRoot bidon
</VirtualHost>

<VirtualHost *:80>
ServerName domain2.tld
DocumentRoot bidon
ProxyPass / <a href='http://192.168.0.100:81/' target='_blank'>http://192.168.0.100:81/</a>
ProxyPassReverse / <a href='http://192.168.0.100:81/' target='_blank'>http://192.168.0.100:81/</a>
</VirtualHost>


Ici, toutes les requetes concernant un domaine en domain2.tld sont redirigés vers 192.168.0.100.

MAJ du Lundi 21 Aout 2006
Vous pouvez également rediriger tous les domaines de la forme *.domain2.tld vers 192.168.0.100, en ajoutant ServerAlias *.domain2.tld
Le problème qui se pose, c'est que le serveur 192.168.0.100 voit toutes les requetes envoyées par le serveur front comme venant de domain2.tld.
Le champ Host : des requetes redirigées par le VirtualHost domain2.tld est remplacé par le ServerName de ce Vhost.
Pour éviter cela, il faut ajouter ProxyPreserveHost On.
Cela vous permet donc d'utiliser également des hotes virtuels sur le second serveur

Si l'on remplace 192.168.0.100 par localhost, et qu'on lance un deuxieme serveur apache qui ecoute sur le port 81 sur la meme machine que le premier serveur apache, le second recevra toutes les requetes venant pour domain2.tld sur son port 81. Ceci est utile, si par exemple, vous souhaitez autoriser certains modules php pour un domaine, et pas pour un autre (exemple simpliste) ou si vous pensez qu'un domaine est plus sur, et qui merite des autorisations plus souples.



Dans ces exemples, le premier serveur apache est en front. S'il tombe en panne, les requetes ne seront pas redirigées vers le deuxieme serveur, donc tout les domaines seront en pannes
Nekralium Admin: Au jour du jugement, la plume du savant pèsera autant que l'épée du guerrier.

Avatar de l’utilisateur
christophedlr
Nouveau membre
Messages : 9
Inscription : mar. 09 nov. 2004, 12:21

Messagepar christophedlr » sam. 05 nov. 2005, 11:41

Bonjour,

Je vien d'essayer ce que vous dites sur le virtual hosting, mais cela ne fonctionne pas chez moi.

J'ai bien activer le module vhost_alias, j'ai rajouter à la fin de mon httpd.conf, le inlcude de mon fichier contenant les virtual hosting(vhost.conf), dans mon virtual hosting, j'ai repris exactement votre exemple(sauf ServerAlias ou j'ai changer le nom, et DocumentRoot qui pointe vers mon dossier de mes sites: c:/weblocal/), j'ai redémarrer apache, et ca ne marche pas.

Je vous donne mon vhost.conf:

Code : Tout sélectionner

NameVirtualHost *

<VirtualHost *:80>
ServerAlias christest.joe
DocumentRoot c:/weblocal/
</VirtualHost>


Revenir vers « Articles »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités