Serveur Apache HTTP Version 2.4
Ce document propose une m�thode performante pour servir un nombre
quelconque d'h�tes virtuels avec le serveur HTTP Apache. Un document s�par� d�crit comment
utiliser mod_rewrite
pour g�rer l'h�bergement
virtuel de masse dynamique.
Les techniques d�crites ici vous concernent si votre
apache2.conf
contient de nombreuses sections
<VirtualHost>
tr�s semblables,
dans le style :
<VirtualHost 111.22.33.44> ServerName customer-1.example.com DocumentRoot /www/hosts/customer-1.example.com/docs ScriptAlias /cgi-bin/ /www/hosts/customer-1.example.com/cgi-bin </VirtualHost> <VirtualHost 111.22.33.44> ServerName customer-2.example.com DocumentRoot /www/hosts/customer-2.example.com/docs ScriptAlias /cgi-bin/ /www/hosts/customer-2.example.com/cgi-bin </VirtualHost> <VirtualHost 111.22.33.44> ServerName customer-N.example.com DocumentRoot /www/hosts/customer-N.example.com/docs ScriptAlias /cgi-bin/ /www/hosts/customer-N.example.com/cgi-bin </VirtualHost>
Nous voulons remplacer toutes les configurations
<VirtualHost>
par un m�canisme qui les g�n�re
dynamiquement. Ceci pr�sente certains avantages :
Le principal d�savantage r�side dans le fait que vous ne pouvez pas d�finir un fichier journal diff�rent pour chaque serveur virtuel. De toute fa�on, ce serait une mauvaise id�e si vous avez de nombreux serveurs virtuels, car cela n�cessiterait un nombre important de descripteurs de fichier. Il est pr�f�rable de rediriger les journaux via un pipe ou une file fifo vers un programme, et faire en sorte que ce dernier �clate les journaux en un journal par serveur virtuel. L'utilitaire split-logfile constitue un exemple de ce traitement.
Un serveur virtuel peut �tre d�fini par deux informations : son
adresse IP, et le contenu de l'en-t�te Host:
de la
requ�te HTTP. La technique d'h�bergement virtuel dynamique de masse
utilis�e ici consiste � ins�rer automatiquement ces informations
dans le chemin du fichier � utiliser pour r�pondre � la requ�te. On
peut y parvenir assez facilement en utilisant
mod_vhost_alias
avec Apache httpd, mais on peut aussi
utiliser mod_rewrite.
Par d�faut, ces deux modules sont d�sactiv�s ; vous devez activer l'un d'eux lors de la compilation et de la configuration d'Apache httpd si vous voulez utiliser cette technique.
Certains param�tres doivent �tre extraits de la requ�te pour que le serveur
dynamique se pr�sente comme un serveur dynamique normal. Le plus
important est le nom du serveur, que le serveur utilise pour g�n�rer des
URLs d'auto-r�f�rencement, etc... Il est d�fini via la directive
ServerName
, et les CGIs peuvent s'y r�f�rer via la
variable d'environnement SERVER_NAME
. Sa v�ritable
valeur utilis�e � l'ex�cution est contr�l�e par la d�finition de la
directive
UseCanonicalName
. Avec
UseCanonicalName Off
, le nom du serveur correspond au
contenu de l'en-t�te Host:
de la requ�te. Avec
UseCanonicalName DNS
, il est extrait d'une recherche
DNS inverse sur l'adresse IP du serveur virtuel. La premi�re
configuration est utilis�e pour l'h�bergement virtuel dynamique par
nom, et la deuxi�me pour l'h�bergement virtuel dynamique par IP. Si
httpd ne peut pas d�terminer le nom du serveur, soit parce qu'il
n'y a pas d'en-t�te Host:
, soit parce que la recherche
DNS a �chou�, il prend en compte la valeur d�finie par la directive
ServerName
.
L'autre param�tre � extraire est la racine des documents (d�finie
via la directive DocumentRoot
et disponible pour les
scripts CGI via la variable d'environnement DOCUMENT_ROOT
).
Dans une configuration classique, il est utilis� par le module core
pour faire correspondre les URIs aux noms de fichiers, mais lorsque
la configuration du serveur comporte des serveurs virtuels, ce
traitement doit �tre pris en charge par un autre module (soit
mod_vhost_alias
, soit mod_rewrite
), qui
utilise un m�thode de correspondance diff�rente. Aucun de ces
modules ne se chargeant de d�finir la variable d'environnement
DOCUMENT_ROOT
, si des CGIs ou des documents SSI
doivent en faire usage, ils obtiendront une valeur erron�e.
Cet extrait de fichier apache2.conf
impl�mente
l'h�bergement virtuel d�crit dans la section � qui ce document est-il destin� ? ci-dessus
en utilisant mod_vhost_alias
.
# extrait le nom du serveur de l'en-t�te Host: UseCanonicalName Off # ce format de journal peut �tre �clat� en journaux par serveur virtuel # � l'aide du premier champ via l'utilitaire split-logfile LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon # inclut le nom du serveur dans les noms de fichiers ressources # n�cessaires aux traitements des requ�tes VirtualDocumentRoot /www/hosts/%0/docs VirtualScriptAlias /www/hosts/%0/cgi-bin
Pour changer cette configuration en solution de serveur virtuel
par IP, il suffit de remplacer UseCanonicalName
Off
par UseCanonicalName DNS
. Le nom du serveur
ins�r� dans le nom de fichier sera alors d�duit de l'adresse IP du
serveur virtuel. La variable %0
fait r�f�rence au nom
de serveur de la requ�te, tel qu'il est indiqu� dans l'en-t�te
Host:
.
Voir la documentation du module mod_vhost_alias
pour d'avantages d'exemples d'utilisation.
Il s'agit d'une adaptation du syst�me ci-dessus, ajust� pour un
serveur d'h�bergement web de FAI. Gr�ce � la variable
%2
, on peut extraire des sous-cha�nes de caract�res du
nom du serveur pour les utiliser dans le nom de fichier afin, par
exemple, de d�finir /home/user/www
comme emplacement des
documents pour www.user.example.com
. Un seul r�pertoire
cgi-bin
suffit pour l'ensemble des
serveurs virtuels.
UseCanonicalName Off LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon # insertion d'une partie du nom du serveur dans les noms de fichiers VirtualDocumentRoot /home/%2/www # r�pertoire cgi-bin unique ScriptAlias /cgi-bin/ /www/std-cgi/
Vous trouverez des exemples plus �labor�s d'utilisation de la
directive VirtualDocumentRoot
dans la documentation du
module mod_vhost_alias
.
Moyennant une configuration un peu plus compliqu�e, vous pouvez
contr�ler la port�e des diff�rentes configurations d'h�bergement
virtuel � l'aide des directives <VirtualHost>
normales de httpd. Par exemple, on peut associer une adresse IP pour
les pages d'accueil des clients en g�n�ral, et une autre pour les
clients commerciaux avec la configuration suivante. Cette
configuration peut �tre combin�e avec les sections
<VirtualHost>
conventionnelles, comme indiqu�
plus loin.
UseCanonicalName Off LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon <Directory /www/commercial> Options FollowSymLinks AllowOverride All </Directory> <Directory /www/homepages> Options FollowSymLinks AllowOverride None </Directory> <VirtualHost 111.22.33.44> ServerName www.commercial.example.com CustomLog logs/access_log.commercial vcommon VirtualDocumentRoot /www/commercial/%0/docs VirtualScriptAlias /www/commercial/%0/cgi-bin </VirtualHost> <VirtualHost 111.22.33.45> ServerName www.homepages.example.com CustomLog logs/access_log.homepages vcommon VirtualDocumentRoot /www/homepages/%0/docs ScriptAlias /cgi-bin/ /www/std-cgi/ </VirtualHost>
Si le premier bloc VirtualHost ne comporte pas de
directive ServerName
, c'est
le nom issu d'une recherche DNS inverse � partir de l'adresse IP
du serveur virtuel qui sera utilis�. Si ce nom ne correspond pas
� celui que vous voulez utiliser, vous pouvez ajouter une entr�e
de remplacement (par exemple ServerName
none.example.com
) pour �viter ce comportement.
Les changements de configuration sugg�r�s pour transformer le premier exemple en h�bergement virtuel par IP conduisent � une configuration peu efficace. Chaque requ�te n�cessite une nouvelle recherche DNS. Pour �viter cette surcharge de travail, le syst�me de fichiers peut �tre organis� pour correspondre aux adresses IP, plut�t qu'aux noms de serveurs, supprimant par la-m�me la n�cessit� d'une recherche DNS. La journalisation doit aussi �tre adapt�e pour fonctionner sur un tel syst�me.
# obtention du nom du serveur par recherche DNS inverse # sur l'adresse IP UseCanonicalName DNS # insertion de l'adresse IP dans les journaux afin de pouvoir les # �clater LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon # insertion de l'adresse IP dans les noms de fichiers VirtualDocumentRootIP /www/hosts/%0/docs VirtualScriptAliasIP /www/hosts/%0/cgi-bin
L'h�bergement virtuel de masse peut aussi �tre effectu� en utilisant
mod_rewrite
, soit � l'aide de simples directives RewriteRule
, soit en utilisant des
techniques plus compliqu�es comme le stockage externe des d�finitions
des serveurs virtuels, ces derni�res �tant accessibles via des
directives RewriteMap
. Ces
techniques sont d�crites dans la documentation sur la r��criture.