1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision : 659902 -->
5 <!-- French translation : Lucien GENTIS -->
8 Licensed to the Apache Software Foundation (ASF) under one or more
9 contributor license agreements. See the NOTICE file distributed with
10 this work for additional information regarding copyright ownership.
11 The ASF licenses this file to You under the Apache License, Version 2.0
12 (the "License"); you may not use this file except in compliance with
13 the License. You may obtain a copy of the License at
15 http://www.apache.org/licenses/LICENSE-2.0
17 Unless required by applicable law or agreed to in writing, software
18 distributed under the License is distributed on an "AS IS" BASIS,
19 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 See the License for the specific language governing permissions and
21 limitations under the License.
24 <manualpage metafile="mass.xml.meta">
25 <parentdocument href="./">Hébergement virtuel</parentdocument>
26 <title>Hébergement virtuel de masse configuré dynamiquement</title>
30 <p>Ce document propose une méthode performante pour servir un nombre
31 quelconque d'hôtes virtuels avec le serveur web httpd Apache.
36 <section id="motivation"><title>A qui ce document est-il destiné ?</title>
38 <p>Les techniques décrites ici vous concernent si votre
39 <code>httpd.conf</code> contient de nombreuses sections
40 <code><VirtualHost></code> très semblables,
44 NameVirtualHost 111.22.33.44<br />
45 <VirtualHost 111.22.33.44><br />
47 ServerName www.customer-1.com<br />
48 DocumentRoot /www/hosts/www.customer-1.com/docs<br />
49 ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin<br />
51 </VirtualHost><br />
52 <VirtualHost 111.22.33.44><br />
54 ServerName www.customer-2.com<br />
55 DocumentRoot /www/hosts/www.customer-2.com/docs<br />
56 ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin<br />
58 </VirtualHost><br />
60 <VirtualHost 111.22.33.44><br />
62 ServerName www.customer-N.com<br />
63 DocumentRoot /www/hosts/www.customer-N.com/docs<br />
64 ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin<br />
69 <p>L'idée de base consiste à remplacer toutes les configurations
70 <code><VirtualHost></code> par un mécanisme qui les génère
71 dynamiquement. Ceci présente certains avantages :</p>
74 <li>Votre fichier de configuration est plus petit, ainsi Apache
75 démarre plus rapidement et consomme moins de mémoire.</li>
77 <li>Pour ajouter des serveurs virtuels, il suffit de créer les
78 répertoires appropriés dans le système de fichiers et les entrées
79 dans le DNS - il n'est plus nécessaire de reconfigurer ou de
80 redémarrer Apache.</li>
83 <p>Le principal désavantage réside dans le fait que vous ne pouvez
84 pas définir un fichier journal différent pour chaque serveur
85 virtuel. De toute façon, ce serait une mauvaise idée si vous avez de
86 nombreux serveurs virtuels, car cela nécessiterait un nombre
87 important de descripteurs de fichiers. Il est préférable de
88 rediriger les journaux via un pipe ou une pile fifo vers un
89 programme, et faire en sorte que ce dernier distribue les journaux
90 les concernant aux différents clients (Ce qui peut aussi servir à
91 accumuler des données à des fins de statistiques, etc...).</p>
95 <section id="overview"><title>Vue d'ensemble</title>
97 <p>Un serveur virtuel peut être défini par deux informations : son
98 adresse IP, et le contenu de l'en-tête <code>Host:</code> de la
99 requête HTTP. La technique d'hébergement virtuel dynamique de masse
100 utilisée ici consiste à insérer automatiquement ces informations
101 dans le chemin du fichier à utiliser pour répondre à la requête. On
102 peut y parvenir assez facilement en utilisant
103 <module>mod_vhost_alias</module> avec Apache 2.0, mais on peut aussi
104 utiliser <module>mod_rewrite</module>. Par défaut, ces deux modules
105 sont désactivés ; vous devez activer l'un d'eux lors de la
106 compilation et de la configuration d'Apache si vous voulez utiliser
109 <p>Certains paramètres doivent être adaptés pour que le serveur
110 dynamique se présente comme un serveur dynamique normal. Le plus
111 important est le nom du serveur, qu'Apache utilise pour générer des
112 URLs d'auto-référencement, etc... Il est défini via la directive
113 <code>ServerName</code>, et les CGIs peuvent s'y référer via la
114 variable d'environnement <code>SERVER_NAME</code>. Sa véritable
115 valeur utilisée à l'exécution est contrôlée par la définition de la
117 <directive module="core">UseCanonicalName</directive>. Avec
118 <code>UseCanonicalName Off</code>, le nom du serveur correspond au
119 contenu de l'en-tête <code>Host:</code> de la requête. Avec
120 <code>UseCanonicalName DNS</code>, il est extrait d'une recherche
121 DNS inverse sur l'adresse IP du serveur virtuel. La première
122 configuration est utilisée pour l'hébergement virtuel dynamique par
123 nom, et la deuxième pour l'hébergement virtuel dynamique par IP. Si
124 Apache ne peut pas déterminer le nom du serveur, soit parce qu'il
125 n'y a pas d'en-tête <code>Host:</code>, soit parce que la recherche
126 DNS a échoué, il prend en compte la valeur définie par la directive
127 <code>ServerName</code>.</p>
129 <p>L'autre paramètre à adapter est la racine des documents (définie
130 via la directive <code>DocumentRoot</code> et disponible pour les
131 CGIs via la variable d'environnement <code>DOCUMENT_ROOT</code>).
132 Dans une configuration classique, il est utilisé par le module core
133 pour faire correspondre les URIs aux noms de fichiers, mais lorsque
134 la configuration du serveur comporte des serveurs virtuels, ce
135 traitement doit être pris en charge par un autre module (soit
136 <code>mod_vhost_alias</code>, soit <code>mod_rewrite</code>), qui
137 utilise un méthode de correspondance différente. Aucun de ces
138 modules ne se chargeant de définir la variable d'environnement
139 <code>DOCUMENT_ROOT</code>, si des CGIs ou des documents SSI
140 doivent en faire usage, ils obtiendront une valeur erronée.</p>
144 <section id="simple"><title>Méthode simple d'hébergement virtuel
147 <p>Cet extrait de fichier <code>httpd.conf</code> implémente
148 l'hébergement virtuel décrit dans la section <a
149 href="#motivation">À qui ce document est-il destiné ?</a> ci-dessus,
150 mais selon une méthode générique utilisant
151 <code>mod_vhost_alias</code>.</p>
154 # extrait le nom du serveur de l'en-tête Host:<br />
155 UseCanonicalName Off<br />
157 # ce format de journal peut être éclaté en journaux par serveur virtuel
158 # à l'aide du premier champ<br />
159 LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br />
160 CustomLog logs/access_log vcommon<br />
162 # inclut le nom du serveur dans les noms de fichiers ressources
163 # nécessaires aux traitements des requêtes<br />
164 VirtualDocumentRoot /www/hosts/%0/docs<br />
165 VirtualScriptAlias /www/hosts/%0/cgi-bin
168 <p>Pour changer cette configuration en solution de serveur virtuel
169 par IP, il suffit de remplacer <code>UseCanonicalName
170 Off</code> par <code>UseCanonicalName DNS</code>. Le nom du serveur
171 inséré dans le nom de fichier sera alors déduit de l'adresse IP du
176 <section id="homepages"><title>Un système de pages d'accueil hébergées
177 virtuellement</title>
179 <p>Il s'agit d'une adaptation du système ci-dessus, ajusté pour un
180 serveur de pages d'accueil de FAI. Avec une configuration un peu
181 plus compliquée, on peut extraire des sous-chaînes de caractères du
182 nom du serveur pour les utiliser dans le nom de fichier afin, par
183 exemple, de définir <code>/home/user/</code> comme emplacement des
184 documents pour <code>www.user.isp.com</code>. Un seul répertoire
185 <code>cgi-bin</code> suffit pour l'ensemble des
186 serveurs virtuels.</p>
189 # les directives préliminaires sont identiques à celles de l'exemple
190 # ci-dessus ; il vient ensuite :<br />
192 # insertion d'une partie du nom du serveur dans les noms de fichiers<br />
193 VirtualDocumentRoot /www/hosts/%2/docs<br />
195 # répertoire cgi-bin unique<br />
196 ScriptAlias /cgi-bin/ /www/std-cgi/<br />
199 <p>Vous trouverez des exemples plus élaborés d'utilisation de la
200 directive <code>VirtualDocumentRoot</code> dans la documentation du
201 module <module>mod_vhost_alias</module>.</p>
205 <section id="combinations"><title>Utiliser plusieurs systèmes
206 d'hébergement virtuel sur le même serveur</title>
208 <p>Moyennant une configuration un peu plus compliquée, vous pouvez
209 contrôler la portée des différentes configurations d'hébergement
210 virtuel à l'aide des directives <code><VirtualHost></code>
211 normales d'Apache. Par exemple, on peut associer une adresse IP pour
212 les pages d'accueil des clients en général, et une autre pour les
213 clients commerciaux avec la configuration suivante. Cette
214 configuration peut bien entendu être combinée avec les sections
215 <code><VirtualHost></code> conventionnelles.</p>
218 UseCanonicalName Off<br />
220 LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon<br />
222 <Directory /www/commercial><br />
224 Options FollowSymLinks<br />
225 AllowOverride All<br />
227 </Directory><br />
229 <Directory /www/homepages><br />
231 Options FollowSymLinks<br />
232 AllowOverride None<br />
234 </Directory><br />
236 <VirtualHost 111.22.33.44><br />
238 ServerName www.commercial.isp.com<br />
240 CustomLog logs/access_log.commercial vcommon<br />
242 VirtualDocumentRoot /www/commercial/%0/docs<br />
243 VirtualScriptAlias /www/commercial/%0/cgi-bin<br />
245 </VirtualHost><br />
247 <VirtualHost 111.22.33.45><br />
249 ServerName www.homepages.isp.com<br />
251 CustomLog logs/access_log.homepages vcommon<br />
253 VirtualDocumentRoot /www/homepages/%0/docs<br />
254 ScriptAlias /cgi-bin/ /www/std-cgi/<br />
261 <p>Si le premier bloc VirtualHost ne comporte <em>pas</em> de
262 directive <directive module="core">ServerName</directive>, c'est
263 le nom issu d'une recherche DNS inverse à partir de l'adresse IP
264 du serveur virtuel qui sera utilisé. Si ce nom ne correspond pas
265 à celui que vous voulez utiliser, vous pouvez ajouter une entrée
266 de remplacement (<code>ServerName
267 none.example.com</code>) pour éviter ce comportement.</p>
272 <section id="ipbased"><title>Pour un hébergement virtuel par IP plus
275 <p>Les changements de configuration suggérés pour transformer <a
276 href="#simple">le premier exemple</a> en hébergement virtuel par IP
277 conduisent à une configuration peu efficace. Chaque requête
278 nécessite une nouvelle recherche DNS. Pour éviter cette surcharge de
279 travail, le système de fichiers peut être organisé pour correspondre
280 aux adresses IP, plutôt qu'aux noms de serveurs, supprimant par
281 la-même la nécessité d'une recherche DNS. La journalisation doit
282 aussi être adaptée pour fonctionner sur un tel système.</p>
285 # obtention du nom du serveur par recherche DNS inverse
286 # sur l'adresse IP<br />
287 UseCanonicalName DNS<br />
289 # insertion de l'adresse IP dans les journaux afin de pouvoir les
290 # éclater<br />
291 LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon<br />
292 CustomLog logs/access_log vcommon<br />
294 # insertion de l'adresse IP dans les noms de fichiers<br />
295 VirtualDocumentRootIP /www/hosts/%0/docs<br />
296 VirtualScriptAliasIP /www/hosts/%0/cgi-bin<br />
301 <section id="simple.rewrite"><title>Configuration de base pour un
302 hébergement virtuel dynamique utilisant
303 <module>mod_rewrite</module></title>
305 <p>Cet extrait de <code>httpd.conf</code> fournit le même service
306 que le <a href="#simple">premier exemple</a>. La première moitié est
307 très similaire à sa contre-partie du <a href="#simple">premier
308 exemple</a>, mis à part quelques changements à des fins de
309 compatibilité ascendante et nécessaires au bon fonctionnement de la
310 partie concernant <code>mod_rewrite</code> ; la seconde moitié
311 configure <code>mod_rewrite</code> pour l'accomplissement du travail
314 <p>Cet exemple comporte quelques astuces assez spéciales : par
315 défaut, <code>mod_rewrite</code> effectue son traitement avant les
316 autres modules de transformation d'URI (<code>mod_alias</code>
317 etc...) - ainsi, si vous voulez utiliser ces modules, il faut en
318 tenir compte dans la configuration de <code>mod_rewrite</code>. De
319 même, l'implémentation d'un serveur virtuel dynamique équivalent à
320 <code>ScriptAlias</code> demande une certaine manipulation.</p>
323 # obtention du nom du serveur par la valeur de l'en-tête Host:<br />
324 UseCanonicalName Off<br />
326 # journaux pouvant être éclatés en journaux par serveurs virtuels<br />
327 LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon<br />
328 CustomLog logs/access_log vcommon<br />
330 <Directory /www/hosts><br />
332 # ExecCGI est ici nécessaire car nous ne pouvons pas forcer
333 # l'exécution des CGI de la manière dont ScriptAlias le fait<br />
334 Options FollowSymLinks ExecCGI<br />
336 </Directory><br />
338 # et maintenant, nous entrons dans le vif du sujet<br />
340 RewriteEngine On<br />
342 # un nom de serveur déduit de l'en-tête Host: dans pratiquement tous les
344 RewriteMap lowercase int:tolower<br />
346 ## traitement des documents normaux en premier:<br />
347 # permet le fonctionnement de "Alias /icons/" - à répéter pour les
348 # autres aliases<br />
349 RewriteCond %{REQUEST_URI} !^/icons/<br />
350 # permet le fonctionnement des CGIs<br />
351 RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
352 # la petite manipulation magique<br />
353 RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1<br />
355 ## on s'occupe maintenant des CGIs - on doit imposer l'utilisation d'un
357 RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
358 RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [H=cgi-script]<br />
365 <section id="homepages.rewrite"><title>Un système de pages d'accueil qui
366 utilise<code>mod_rewrite</code></title>
368 <p>Il s'agit d'une variante qui permet d'obtenir le même résultat
369 que le <a href="#homepages">deuxième exemple</a>.</p>
372 RewriteEngine on<br />
374 RewriteMap lowercase int:tolower<br />
376 # permet l'exécution des CGIs<br />
377 RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
379 # vérifie la validité du nom du serveur pour le bon fonctionnement de la
380 # règle RewriteRule<br />
381 RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$<br />
383 # ajoute le nom du serveur virtuel comme préfixe à l'URI<br />
384 # le drapeau [C] signifie que la réécriture suivante doit être effectuée
385 # sur le résultat de la règle courante<br />
386 RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]<br />
388 # et maintenant, on crée le véritable nom de fichier<br />
389 RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2<br />
391 # définition du répertoire des CGIs global<br />
392 ScriptAlias /cgi-bin/ /www/std-cgi/
397 <section id="xtra-conf"><title>Utilisation d'un fichier de configuration
398 séparé pour les serveurs virtuels</title>
400 <p>Cette méthode utilise des fonctionnalités de
401 <module>mod_rewrite</module> plus avancées pour venir à bout de la
402 traduction d'un serveur virtuel en une racine de documents, à partir
403 d'un fichier de configuration séparé. Elle procure d'avantage de
404 souplesse, mais nécessite une configuration
405 un peu plus compliquée.</p>
407 <p>Le fichier <code>vhost.map</code> doit se présenter sous cette
411 www.customer-1.com /www/customers/1<br />
412 www.customer-2.com /www/customers/2<br />
414 www.customer-N.com /www/customers/N<br />
417 <p>Le fichier <code>httpd.conf</code> doit contenir les lignes
421 RewriteEngine on<br />
423 RewriteMap lowercase int:tolower<br />
425 # définition du fichier de correspondances<br />
426 RewriteMap vhost txt:/www/conf/vhost.map<br />
428 # traite les alias comme précédemment<br />
429 RewriteCond %{REQUEST_URI} !^/icons/<br />
430 RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
431 RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
432 # une nouvelle mise en correspondance par fichier<br />
433 RewriteCond ${vhost:%1} ^(/.*)$<br />
434 RewriteRule ^/(.*)$ %1/docs/$1<br />
436 RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
437 RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
438 RewriteCond ${vhost:%1} ^(/.*)$<br />
439 RewriteRule ^/(.*)$ %1/cgi-bin/$1 [H=cgi-script]