Sunteți pe pagina 1din 17

Conception dtaille d'htes virtuels sous Apache

par Julien Pauli

doctorrock

Date de publication : 8 dcembre 2009 Dernire mise jour : 7 mars 2011

Souvent peu compris, l'hbergement virtuel est de nos jours un acquis. Un mme serveur physique/logiciel capable d'hberger plusieurs sites parfois trs diffrents, voila ce qu'est le "virtual hosting" (vhost) Dans cet article, nous allons voir comment mettre en place un hbergement virtuel sous Apache, avec le dtail de toutes les facettes : types de vhost, scurit, contrle d'accs, DNS...

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

I - Introduction au Virtual Hosting................................................................................................................................3 II - Thorie gnrale du Virtual Host et d'Apache...................................................................................................... 4 III - Virtual Host par adresse rseau (IP / port TCP).................................................................................................. 5 IV - Virtual Host par noms...........................................................................................................................................8 IV-A - Virtual Host par noms et par IP.................................................................................................................. 9 IV-B - Rcapitulatif et considrations de scurit................................................................................................12 V - Exemple concret - complet..................................................................................................................................15 VI - Les configurations plus complexes et les modules tiers....................................................................................17

-2Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

I - Introduction au Virtual Hosting


L'hbergement virtuel (virtual hosting) est le fait de servir plusieurs sites web sur une mme instance de serveur. Ainsi, une machine serveur possde un et un seul serveur Apache et elle pourra servir (virtuellement) une infinit de sites qui n'ont aucunement besoin de "se connatre" l'un l'autre. La flexibilit d'Apache fait que chaque site pourra tre configur de manire trs diffrente de son voisin. Aussi, les clients (en grande partie des navigateurs web) n'auront aucune ide du fait qu'il existe plusieurs sites sur le serveur qu'ils ont contact. Sauf erreurs de configuration, ils n'auront aucun moyen de le savoir. L'hbergement virtuel est trs utilis chez les hbergeurs proposant des serveurs dits "mutualiss". Dans ce cas l, un mme Apache sert un (trs) grand nombre de sites web diffrents et ses ressources sont donc entirement partages entre tous les sites de manire quitable. Il est possible de rgler la charge par hte virtuel, mais il faut pour cela compiler un module externe. Mais, comment hberge-t-on plusieurs applications webs sur un seul serveur Apache ? Il existe globalement 2 grandes mthodes de multi-hbergement (4 manires relles) : 1 2 3 tout d'abord, l'hbergement virtuel par adresse : la machine serveur possde plusieurs adresses IP, et chacune mne vers un site distinct ; ensuite l'hbergement virtuel par nom : la machine ne possde qu'une seule adresse IP et ce sont les noms des sites qui vont aiguiller la requte ; puis enfin des manires qui dcoulent des deux prcdentes : la machine possde une ou plusieurs adresses IP, mais elle peut diffrencier les sites par port TCP. En dernier lieu on peut tout mixer : hbergement par adresse, port et nom. Dans ce cas, la machine possde plusieurs adresses IP et coute sur chacune d'elles plusieurs ports TCP, tout en distinguant les noms des sites web.

Nous allons dtailler le processus de routage des htes virtuels d'Apache, de manire claire afin qu'aucune confusion ne puisse tre faite. Ca n'est pas complexe, c'est mme simple et totalement logique, mais il faudra bien retenir certains points. La version d'Apache considre est 2.2.x, mais il n'existe que trs peu de diffrences avec les versions suprieures ou gales 1.3. Enfin nous parlerons des modules externes, rcuprer et compiler, qui peuvent rendre de gros services. Dans cet article, nous parlons htes virtuels et nous supposons que vous savez dj configurer un serveur Apache de manire fonctionnelle. Ainsi, nous n'allons pas chaque fois dtailler la configuration complte du serveur, mais juste ce qui nous intressera. Nous supposerons le reste de la configuration (qui peut demeurer tout fait "classique" et minimale nanmoins) prsent et fonctionnel.

-3Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

II - Thorie gnrale du Virtual Host et d'Apache


Apache utilise des sockets TCP pour servir ses requtes. Indpendamment du concept mme de l'hbergement virtuel, il convient de prciser Apache quelle(s) IP il doit couter et quel(s) port(s). Une seule directive entre en jeu pour cela : Listen. Elle est dfinie pour tout le serveur Apache. Le cas nous intressant est "une seule instance d'Apache sert plusieurs sites". Tous les sites tourneront donc avec le mme utilisateur Unix, ce qui peut crer des problmes de scurit. Certains modules peuvent rsoudre ceci, l'utilisation de scripts CGI peut aussi tre pargne, sinon il faudra dmarrer autant d'instances d'Apache que de sites. Cette ide est assez idiote, car dmarrer X instances d'Apache, c'est augmenter la charge mmoire de la machine car beaucoup de modules d'Apache sont compils statiquement, et auront donc X images en mmoire, gaspillant d'autant plus celle-ci. Le mieux serait qu'une seule instance d'Apache puisse grer X sites, chacun sous un utilisateur Unix diffrent. Certains modules (non officiels) permettent cela, mais pas Apache par dfaut. L'hbergement par nom se base sur l'en-tte Host: de la requte HTTP, afin de slectionner le bon site. Cet en-tte n'existe qu'en HTTP1.1 et aujourd'hui, certains (rares) clients parlent toujours en HTTP1.0 et sont donc en thorie incompatibles avec l'hbergement virtuel par nom. Apache introduit cependant une directive pour tenter d'enrayer ce problme. Les htes virtuels sont supports par dfaut par Apache, il n'y a aucun module spcial prciser la compilation car il est compil statiquement par dfaut : il s'agit de mod_core, le module minimal ncessaire Apache pour tourner. Apache sait grer nativement les htes virtuels, il n'y a rien de spcial faire pour a.

-4Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

III - Virtual Host par adresse rseau (IP / port TCP)


L'hbergement par rseau consiste disposer de plusieurs ports TCP et/ou de plusieurs adresses IP (physiques ou virtuelles) sur la machine serveur. La commande Linux ifconfig permet de configurer les interfaces rseaux. Nous allons supposer que la machine utilise 2 adresses IP : 192.168.0.1 et 192.168.0.2. Dans le cas de plusieurs adresses, il faut spcifier Apache sur lesquelles couter, et sur quels ports TCP, ceci grce la directive Listen httpd.conf, directive Listen
Listen 80 Listen 192.168.0.2:81

Le port est obligatoire, l'adresse est facultative, si on ne la prcise pas (en ne prcisant qu'un numro de port), Apache utilisera toutes les addresses IP disponibles sur la machine, c'est donc plutt dconseill pour des raisons de scurit (oubli lors de l'ajout d'une interface sur la machine par exemple). Le port utilis par HTTP est 80 par dfaut, ainsi les navigateurs web et autres clients HTTP l'utilisent sans devoir le prciser. Si un autre port est employ, il conviendra de le prciser sur le client. Ici, notre serveur coute le port 81 mais uniquement sur l'adresse 192.168.0.2. Les commandes Linux netstat et lsof permettent de vrifier qu'Apache coute bien les adresses/ports spcifis. Rappel : Toute ouverture de socket en coute sur un port infrieur 1024 ncessite les droits root sur les systmes *nix. Rappel : Apache doit dans la grande majorit des cas, tre dmarr par root ( cause du port qu'il doit couter, par dfaut 80, infrieur 1024 donc). Cependant, les processus qu'il va faire natre pour traiter les requtes des clients tourneront sous un autre utilisateur ayant beaucoup moins de droits ("www", "httpd" ou encore "daemon", a dpend de votre systme). Cet utilisateur et son groupe sont prciser dans la configuration globale d'Apache, via les directives User et Group. Ces utilisateurs sont globaux tout Apache, donc tous les sites/htes virtuels qu'il va servir. Un hte virtuel se configure grce la directive <VirtualHost>. Cette directive ouvre un bloc, dans lequel toutes les directives de contexte virtualhost peuvent tre crites. La liste est grande, voyez le manuel pour plus d'informations. Voyez cette page pour une explication des diffrents contextes de configuration Apache Chaque site se prsente sous la forme d'un bloc <VirtualHost> et celui-ci doit prciser un port et ventuellement une adresse d'coute, en thorie en correspondance avec la directive Listen ou du moins en corrlation avec. Exemple d'htes virtuels Apache bass sur le rseau : IP/ports
Listen 80 Listen 192.168.0.2:81 <VirtualHost 192.168.0.1:80> DocumentRoot /var/www1 ServerName server1 </Virtualhost> <VirtualHost 192.168.0.2:80> DocumentRoot /var/www2 ServerName server2 </VirtualHost> <VirtualHost 192.168.0.2:81> DocumentRoot /var/www3 ServerName server3 </VirtualHost>

-5Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

Tant que l'ensemble des blocs <VirtualHost> "attrapent" tout ce qui peut entrer via Listen, tout va bien. Les directives minimales prciser sont DocumentRoot et ServerName, c'est dire la liaison entre cette adresse/ port, et le systme de fichiers : c'est la fonction centrale et la dfinition mme du serveur HTTP. Le nom (ServerName) est ici "facultatif" au niveau du choix du bloc excuter, c'est--dire que quel que soit le nom de domaine qui pointe sur l'IP, ServerName n'est pas utilis pour aiguiller la requte dans le cas d'un hbergement par IP. Important : seul le couple IP/Port est utilis pour aiguiller la requte dans le cas d'htes virtuels bass sur le rseau. Que se passe-t-il si aucun bloc <VirtualHost> ne correspond la demande ? En effet, imaginons ceci : Il semble manquer des blocs VirtualHost?
Listen 80 Listen 81 <VirtualHost 192.168.0.1> DocumentRoot /var/www1 ServerName server1 </VirtualHost>

Qu'advient-il d'une requte vers http://192.168.0.2:81 par exemple ? La rgle est simple : toute requte qui ne peut tre satisfaite par un hte virtuel tombe sur la configuration classique La configuration classique, c'est tout simplement l'ensemble DocumentRoot/ServerName qui est crit hors des blocs <VirtualHost> et qui pour rappel dfinit ce que l'on appelle le "serveur par dfaut" : ces directives sont obligatoires pour lancer Apache. le serveur par dfaut reoit la requte que les blocs VirtualHost n'attrapent pas
Listen 80 Listen 81 # attrape tout ce qui chappe aux blocs <VirtualHost> # dans notre exemple 192.168.0.1:80 sera attrap ici DocumentRoot /var/www ServerName ServerParDefaut # attrape 192.168.0.1:80 uniquement <VirtualHost 192.168.0.1:80> DocumentRoot /var/www1 ServerName server1 </VirtualHost> # attrape le port 81 de toutes les adresses de la machine <VirtualHost *:81> DocumentRoot /var/www2 ServerName server2 </VirtualHost>

Voila, vous venez de comprendre le fonctionnement des htes virtuels par IP sous Apache, il n'y a rien ajouter. A vous d'crire dans chaque bloc <VirtualHost> la configuration de votre serveur. Toute directive crite en dehors des blocs sera alors crase par celle crite dans le bloc, les autres seront traites normalement. Voila qui devrait donner un sens la notion "d'hte virtuel". Attention tout de mme, il y a des choses qu'Apache n'aime pas : les situations ambigus. Son statut est alors indfini et il finira souvent par planter. Voici une situation ambigu : une situation ambigu qu'Apache n'aime pas
Listen 192.168.0.1:80 Listen 81

-6Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

une situation ambigu qu'Apache n'aime pas


DocumentRoot /var/www ServerName ServerParDefaut

<VirtualHost 192.168.0.1> DocumentRoot /var/www1 ServerName server1 </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www2 ServerName server2 </VirtualHost>

Avec une telle configuration, une requte vers le port 81 mne vers le serveur par dfaut car aucun bloc <VirtualHost> ne peut l'attraper, mais quid d'une requte vers 192.168.0.1:80 ? Une telle requte peut tre attrape par 2 blocs <VirtualHost> (dans notre cas un prcise l'adresse sans port, et l'autre le port sans adresse), Apache ne sait pas lequel choisir et plantera souvent face un tel cas. Veiller toujours ce qu'il n'y ait aucune ambigut lors de la correspondance de la requte sur la socket d'entre et les blocs <VirtualHost>. Si tel est le cas, Apache entre dans un tat indfini. Pour viter cela, il suffit que les <VirtualHost> renseignent une IP et un port afin d'tre le plus prcis possible. Si possible, vitez le joker *.

-7Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

IV - Virtual Host par noms


L'hbergement virtuel par noms a t rendu possible par HTTP1.1. En effet, si vous rvisez vos connaissances d'HTTP ( par ici par exemple), vous remarquerez que HTTP1.1 introduit l'en-tte de requte Host:, qui prcise le nom de l'hte que le client souhaite contacter. Apache va utiliser ce nom pour aiguiller la requte sur le bon bloc <VirtualHost> grce ServerName. Important : la directive ServerName va servir aiguiller la requte sur le bon hte. Le DNS est donc important dans un tel cas. Nous allons y revenir. Prenons un exemple simple. Notre serveur dispose d'une seule adresse IP et n'coute qu'un seul port : 192.168.0.1:80. Le serveur DNS a t configur pour relier cette adresse IP 2 noms de domaines diffrents : server1 et server2. La configuration va alors ressembler ceci :
Listen 192.168.0.1:80 ServerName DefaultServer DocumentRoot /var/www NameVirtualHost 192.168.0.1:80 <VirtualHost 192.168.0.1:80> ServerName server1 DocumentRoot /var/www1 </VirtualHost> <VirtualHost 192.168.0.1:80> ServerName server2 DocumentRoot /var/www2 </VirtualHost>

Important : dans le cas d'un hbergement virtuel par noms, la directive NameVirtualHost est obligatoire. Inversement : la prsence d'une directive NameVirtualHost signifie qu'Apache va utiliser l'en-tte Host: de la requte, dans une partie du routage vers le bon hte virtuel. Les adresses renseignes dans les blocs <VirtualHost> doivent tre exactement les mmes que celles crites dans NameVirtualHost Dans notre exemple, une requte vers http://server1 mnera dans le premier bloc, une requte vers http://server2 vers le deuxime. Rappelons le schma d'une requte HTTP : Exemple simple d'une requte HTTP1.1
GET /foo/bar HTTP/1.1 Host: server1 {autres en-ttes ici}

C'est bien la valeur de Host: qui va dterminer le bloc <VirtualHost> choisir, en fonction de la directive ServerName loge l'intrieur A quoi peut bien servir cette directive NameVirtualHost ? C'est trs simple : elle sert router l'IP et le port dans le cas o le serveur en coute plusieurs. Apache effectue donc un double routage de la requte, ce qui nous amne la section immdiatement suivante de cet article.

-8Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

IV-A - Virtual Host par noms et par IP


Ce chapitre ncessite que vous aiyez compris le principe de l'hbergement virtuel par rseau (IP/port). Relisez le chapitre si ncessaire. Un serveur Apache peut la fois couter plusieurs IP/ports et diffrencier les noms des serveurs. Il s'agit alors d'un hbergement virtuel par IP et par noms. Prenons l'exemple d'un serveur qui coute 192.168.0.1:80 et 192.168.0.2:80. Il doit servir les noms server1, server2, server3 et server4. En jouant avec NameVirtualHost, on va indiquer Apache le premier aiguillage : celui de l'IP/ port. Une fois cet aiguillage effectu, Apache va analyser le nom dans l'en-tte Host:, et l'aiguiller dans le bloc <VirtualHost> qui le prcise avec la directive ServerName Exemple de virtual host par IP et par nom en mme temps
Listen 192.168.0.1:80 Listen 192.168.0.2:80 ServerName DefaultServer DocumentRoot /var/www # Voici les htes virtuels considrer si la requte arrive # sur 192.168.0.1:80 NameVirtualHost 192.168.0.1:80 <VirtualHost 192.168.0.1:80> ServerName server1 DocumentRoot /var/www1 </VirtualHost> <VirtualHost 192.168.0.1:80> ServerName server2 DocumentRoot /var/www2 </VirtualHost> # Voici les htes virtuels considrer si la requte arrive # sur 192.168.0.2:80 NameVirtualHost 192.168.0.2:80 <VirtualHost 192.168.0.2:80> ServerName server3 DocumentRoot /var/www3 </VirtualHost> # server4 n'est pas prcis, nous allons voir ce qui se passe

Dans cet exemple, http://server1 est suppos tre rout dans le DNS vers 192.168.0.1. La requte arrive donc vers 192.168.0.1:80 et Apache entre donc dans la premire section NameVirtualHost. Une fois dedans, il analyse l'hte demand dans la requte : il s'agit de server1. server1 est bien prcis dans le premier bloc <VirtualHost>, il sera donc choisi comme second aiguillage, et /var/www1 sera servi. la valeur de NameVirtualHost doit tre systmatiquement la mme que celle de tous les blocs <VirtualHost> qui vont suivre. la valeur de NameVirtualHost doit tre un couple IP (* possible) et port. L'ensemble des directives NameVirtualHost se comportent comme dans le cas de l'hbergement par IP : il ne doit pas y avoir ambigut pour Apache. Continuons sur le mme exemple. Imaginons que server4 soit rout dans le DNS vers 192.168.0.2. Comme dans la section NameVirtualHost 192.168.0.2:80 il n'existe aucun bloc dont ServerName vaut "server4", une telle requte sera aiguille vers le serveur par dfaut qui sera server3. Voici les rgles du choix du serveur par dfaut lorsque des noms interviennent :

-9Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

1 2 3

dans le cas d'un serveur faisant intervenir des noms (NameVirtualHost), le serveur par dfaut n'est pas celui dclar hors des blocs <VirtualHost> (comme c'est le cas pour l'hbergement virtuel par IP) si et seulement si une directive NameVirtualHost a dj aiguill la requte ; le serveur par dfaut dans un hbergement virtuel par noms est le premier bloc <VirtualHost> qui suit le premier filtre : NameVirtualHost si et seulement si celui-ci a dj pu aiguiller la requte par son IP/port ; dans le cas d'un hbergement virtuel par noms, le serveur dclar hors des blocs <VirtualHost> est le serveur par dfaut si aucun couple IP/port n'a trouv de correspondance dans les directives NameVirtualHost dclares. Nous avons vu dans la partie "Virtual Host par rseau (IP/ports)" qu'il ne faut pas crer de situation ambigu. Dans les hbergements virtuels par noms, plusieurs blocs <VirtualHost> possdent exactement la mme syntaxe, ce qui a premire vue cre une confusion pour Apache. Il n'en est rien, car ces blocs ne seront interrogs que lorsque la directive NameVirtualHost du mme nom qu'eux aura trouv une correspondance vis vis de la requte en entre. Cette directive est donc indispensable dans le cas d'un hbergement virtuel se basant sur les noms et elle ne doit pas amener des situations ambigus car elle est teste ds l'entre de la requte. Une ou plusieurs IP, un ou plusieurs ports, peu importe : si un hbergement bas sur le nom d'hte est utilis, NameVirtualHost est indispensable. Mme avec une seule IP, on peut aussi parler "d'hbergement par IP et par nom", une IP, il en existe de toute faon toujours au moins une.

Voyons un dernier exemple plus complexe d'un serveur disposant de deux adresses IP : 192.168.0.1 et 192.168.0.2. En appliquant les principes dcrits auparavant, tout est clair : Exemple plus complexe d'hbergement virtuel plusieurs IP/ports et plusieurs noms
Listen 80 Listen 81 # Le serveur DefaultServer sera utilis si et seulement si # aucune des directives NameVirtualHost futures ne trouvent correspondance # par rapport au couple IP/port de la requte en entre ServerName DefaultServer DocumentRoot /var/www # Si la requte arrive sur 192.168.0.1:80 NameVirtualHost 192.168.0.1:80 # premier site : server1, *mais aussi* le site qui sera servi par dfaut # pour le couple 192.168.0.1:80 si un nom mne dessus sans tre dclar dans un VirtualHost <VirtualHost 192.168.0.1:80> ServerName server1 DocumentRoot /var/www1 </VirtualHost> # deuxime site : server2, le DNS devrait alors le faire pointer vers 192.168.0.1, # sinon il ne sera jamais atteignable moins de le deviner <VirtualHost 192.168.0.1:80> ServerName server2 DocumentRoot /var/www2 </VirtualHost> # Si la requte arrive sur 192.168.0.1:81 NameVirtualHost 192.168.0.1:81 # premier site : server3, *mais aussi* le site qui sera servi par dfaut # pour le couple 192.168.0.1:81 si un nom mne dessus sans tre dclar dans un VirtualHost <VirtualHost 192.168.0.1:81> ServerName server3 DocumentRoot /var/www3 </VirtualHost> <VirtualHost 192.168.0.1:81> - 10 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

Exemple plus complexe d'hbergement virtuel plusieurs IP/ports et plusieurs noms


ServerName server4 DocumentRoot /var/www4 </VirtualHost>

# Si la requte arrive sur 192.168.0.2:81 NameVirtualHost 192.168.0.2:81 # premier site : server5, *mais aussi* le site qui sera servi par dfaut # pour le couple 192.168.0.2:81 si un nom mne dessus sans tre dclar dans un VirtualHost <VirtualHost 192.168.0.2:81> ServerName server5 DocumentRoot /var/www5 </VirtualHost>

Suivons le guide : http://server1 mne vers /var/www1 condition que le domaine server1 soit rout vers 192.168.0.1 dans le DNS. http://server2 mne vers /var/www2 condition que le domaine server2 soit rout vers 192.168.0.1 dans le DNS. http://server3:81 mne vers /var/www3 condition que le domaine server3 soit rout vers 192.168.0.1 dans le DNS. http://server3 mne vers /var/www1 (server1) car server3 est point par le DNS sur 192.168.0.1 menant la requte "192.168.0.1:80", c'est donc cette directive NameVirtualHost qui la prend en charge http://server4:81 mne vers / var/www4 condition que le domaine server4 soit rout vers 192.168.0.1 dans le DNS. http://server5:81 mne vers /var/www5 condition que le domaine server5 soit rout 192.168.0.2 dans le DNS. http://server5 mne vers /var/www (DefaultServer) car le couple IP/port 192.168.0.2:80 n'a aucune correspondance NameVirtualHost etc etc. C'est tout la fois simple et logique. Un fichier "hosts" (ou un enregistrement dans le DNS) comme le suivant est donc correct : un fichier hosts en accord avec la configuration d'Apache
192.168.0.1 server1 server2 server3 server4 192.168.0.2 server5

Ds que le nom d'hte intervient (hbergement virtuel bas sur les noms), le DNS possde une place primordiale. Il doit tre en toute logique en corrlation avec le mapping que fait Apache. Pour le "simuler" lors de tests, le fichier /etc/hosts peut tre dit en consquence. Si le DNS ne pointe pas comme il faut, rappelez vous qu'Apache aiguille d'abord l'IP/port via NameVirtualHost puis cherche un bloc <VirtualHost> en regardant les ServerName, si aucun ne correpond : le premier bloc <VirtualHost> est slectionn. Dans cet exemple-l, une requte vers http://une_ip_que_le_serveur_ecoute mne systmatiquement vers le serveur par dfaut, car mme si une des directives NameVirutalHost va aiguiller cette IP, aucun bloc <VirtualHost> sous-jacent ne dclare un ServerName correspondant exactement cette IP. Rappelons qu'une requte HTTP utilisant l'IP directement, possde comme en-tte Host: (donc comme "nom de serveur") l'IP elle-mme.

- 11 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

IV-B - Rcapitulatif et considrations de scurit

Schma de routage des htes virtuels d'Apache Une erreur de DNS, ou l'oubli du fait que quelqu'un peut accder http://une_adresse_ip et non pas http://un_nom_de_domaine peut mener des catastrophes. N'oubliez jamais qu'une simple session telnet permet d'crire la main la requte HTTP et donc de forger n'importe quel "Host:" pour toute IP Regardez cette configuration : un exemple peu scuris, sauf si on sait parfaitement ce que l'on fait
Listen *:80 ServerName DefaultServer DocumentRoot /var/www NameVirtualHost 192.168.0.1:80 <VirtualHost 192.168.0.1:80> ServerName server1 DocumentRoot /var/www1 </VirtualHost> <VirtualHost 192.168.0.1:80> - 12 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

un exemple peu scuris, sauf si on sait parfaitement ce que l'on fait


ServerName server2 DocumentRoot /var/www2 </VirtualHost>

NameVirtualHost 192.168.0.2:80 <VirtualHost 192.168.0.2:80> ServerName server3 DocumentRoot /var/www3 </VirtualHost>

L'administrateur doit clairement se focaliser sur le paramtre IP/port et supposer que le DNS peut tomber, tre modifi, ou que la requte HTTP peut tre forge. Ce qui suit n'est pas une bizarrerie : http://server2, dont le reverse DNS donne comme IP 192.168.0.1 mnera sur server2, mais http://192.168.0.1 mnera sur server1, elle. On peut aussi crire la requte suivante: Requte HTTP forge
# telnet 192.168.0.1 80 HEAD / HTTP/1.1 Host: foo

Et on arrive sur server1 aussi, puisqu'aucun site n'a comme nom "foo". Plus brutal : si helloworld.server2 existe dans le DNS et pointe vers 192.168.0.1, http://helloworld.server2 mnera vers server1. Pensez aussi HTTP1.0. Cette version du protocole (parle trs trs rarement mais prendre en compte), n'inclut pas l'en-tte Host: ncessaire au fonctionnement des htes virtuels par noms. Apache dfinit ServerPath pour pallier ce problme, mod_rewrite peut aussi jouer de sa magie dans une moindre mesure. L'exemple que l'on traite possde aussi une grosse faiblesse : la directive Listen coute toutes les IP. Si la machine venait changer d'IP pour une raison quelconque, c'est DefaultServer qui sera interrog ! (Aucun NameVirtualHost ne matche autre chose que 192.168.0.1). Attention l encore. Ces "petites faiblesses" du systme d'hbergement virtuel par noms peuvent tre compenses par Apache via la directive ServerAlias qui permet de donner d'autres noms au serveur. Corrigeons notre exemple : exemple plus scuris
# Nous dclarons clairement le mapping rseau # utilis par Apache, pas d'embrouille ou de "magie" possible, # pas de caractre * assez risqu Listen 192.168.0.1:80 Listen 192.168.0.2:80 ServerName DefaultServer DocumentRoot /var/www NameVirtualHost 192.168.0.1:80 # catchall : celui-ci attrape l'accs par "http://192.168.0.1" # et le redirige vers une page 403 (directive order) <VirtualHost 192.168.0.1:80> ServerName 192.168.0.1 DocumentRoot /var/www <Directory /var/www> order allow, deny </Directory> </VirtualHost> #server1 mais aussi "nimporte-quoi.server1" <VirtualHost 192.168.0.1:80> ServerName server1 ServerAlias *.server1 - 13 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

exemple plus scuris

DocumentRoot /var/www1 </VirtualHost> #server2 mais aussi "nimporte-quoi.server2" <VirtualHost 192.168.0.1:80> ServerName server2 ServerAlias *.server2 DocumentRoot /var/www2 </VirtualHost> NameVirtualHost 192.168.0.2:80 # catchall <VirtualHost 192.168.0.2:80> ServerName 192.168.0.2 DocumentRoot /var/www <Directory /var/www> order allow, deny </Directory> </VirtualHost> <VirtualHost 192.168.0.2:80> ServerName server3 ServerAlias *.server3 DocumentRoot /var/www3 </VirtualHost>

On s'assure que les sous-domaines sont interprts comme il faut et aussi que les accs par l'adresse IP mnent vers une page d'erreur (403).

- 14 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

V - Exemple concret - complet


Exemple pratique concret. Le serveur considr doit se comporter diffremment selon qu'il soit interrog en local ou via le rseau. Aussi, il est serveur Web et proxy sur le port 8080. L'exemple n'est pas si complet que cela : la configuration Apache prend rapidement beaucoup de pages, cet exemple est simplement un peu plus dtaill. N'oubliez pas que tout ne doit pas se trouver dans le fichier global httpd.conf, la directive Include permet de tout sparer et de tout ranger convenablement.
# le serveur n'coute 81 que pour des requtes locales Listen 127.0.0.1:81 Listen 80 Listen 8080 # PHP est configur de manire globale LoadModule php5_module modules/libphp5.so AddType application/x-httpd-php .php # catch-all server NameVirtualHost *:80 <VirtualHost *:80> ServerName julien DocumentRoot /media/www/external # PHP n'est pas interprt AddType text/plain .php DirectoryIndex none ReadmeName /apache/footerext.shtml HeaderName /apache/headerext.shtml </VirtualHost> # server pour 127.0.0.1 : accs local NameVirtualHost 127.0.0.1:80 <VirtualHost 127.0.0.1:80> ServerName jp DocumentRoot /media/www setEnv APP_MODE dev Alias /sql /media/data/phpmyadmin Script PUT /put.php ReadmeName /apache/footer.shtml HeaderName /apache/header.shtml <Location /server-status> SetHandler server-status Order deny,allow Deny from all # 2 scurits valent mieux qu'une Allow from 127.0.0.1 </Location> <Location /server-info> SetHandler server-info Order deny,allow Deny from all # 2 scurits valent mieux qu'une Allow from 127.0.0.1 </Location> </VirtualHost> # serveur pour 127.0.0.1 port 81 NameVirtualHost 127.0.0.1:81 <VirtualHost 127.0.0.1:81> - 15 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli ServerName jp DocumentRoot /media/www # PHP5.3 tourne en CGI sur ce serveur ScriptAlias /php/ "/usr/local/php53/bin/" Action php5-fastcgi "/php/php-cgi53" AddHandler php5-fastcgi .php ReadmeName /apache/footer.shtml HeaderName /apache/header.shtml </VirtualHost> # server sur le port 8080 : un proxy forward NameVirtualHost *:8080 <VirtualHost *:8080> ServerName proxy.jp ProxyRequests On ProxyVia On AllowCONNECT 443 563 <Proxy *> Order deny,allow Allow from 192.168 Allow from 127.0.0.1 Deny from all </Proxy> # l'interrogation directe mnera vers un accs interdit <directory /> Order allow,deny Deny from all </directory> </VirtualHost>

doctorrock

- 16 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

Conception dtaille d'htes virtuels sous Apache par Julien Pauli

doctorrock

VI - Les configurations plus complexes et les modules tiers


Apache propose un module : mod_vhost_alias, dont le but est de crer des VirtualHosts dynamiques en fonction de paramtres dans l'URL. Pour aller plus loin, il faudra se tourner vers des modules tiers. Au plus simple, mod_vhost_limit dfinit une seule directive : MaxVhostClients dont le nom est plus qu'explicite. Si le nombre de clients par virtualhost est dpass, une erreur 503 est retourne. Pour des besoins plus pointus, je vous invite lire les documentations de mod_qos ou mod_cband qui permettent notamment de contrler trs finement les ressources que chaque VirtualHost consomme. D'autres modules existent encore "dans la nature", vous n'avez qu' les tlcharger, les compiler et les tester, ils ne demandent que cela ;-) Rappelons aussi que leurs codes sources sont ouverts. Remerciements Hdhili Jadane pour ses relectures.

- 17 Copyright 2009 Julien PAULI. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://julien-pauli.developpez.com/tutoriels/apache/vhosts/

S-ar putea să vă placă și