Configuration d'hôtes virtuels sur Apache avec support automatique des sous-domaines, du SSL et de l'authentification

Les hôtes virtuels du serveur web Apache permettent d'héberger plusieurs domaines sur la même IP. Le champ Host: de la requête HTTP détermine l'hôte virtuel qui devra traiter la requête.

La génération automatique des domaines est utile si les <VirtualHost> sont nombreux et sensiblement les mêmes, par exemple :

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.customer-1.com
DocumentRoot /www/hosts/www.customer-1.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.44>
ServerName www.customer-2.com
DocumentRoot /www/hosts/www.customer-2.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.44>
ServerName www.customer-N.com
DocumentRoot /www/hosts/www.customer-N.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin
</VirtualHost>

L'idée de base est de remplacer la configuration <VirtualHost> statique par un mécanisme dynamique. Ainsi, Le fichier de configuration est plus petitAjouter des serveurs virtuels revient à créer les répertoires appropriés dans le système de fichiers et les entrées dans le DNS sans reconfigurer ni redémarrer Apache.Un hôte virtuel est défini par : son adresse IPet le contenu de l'entête Host: de la requête HTTP.Pour cela, cette information est insérée dynamiquement dans le chemin d'accès du fichier utilisé pour satisfaire la demande.

Pré-requis

Il faut activer le module mod_vhost_alias par :

USER@MACHINE:~$ sudo a2enmod vhost_alias

Première étape

Pour rendre dynamique un hôte virtuel, il faut modifier : UseCanonicalName Off → le nom du serveur est fourni par l'entête Host: de la requête. Si Apache ne trouve pas nom du serveur, c'est la valeur configurée avec ServerName qui est utiliséeDocumentRoot

Hôte virtuel dynamique simple

Cet extrait met en œuvre un hôte virtuel simple, mais d'une façon générique à l'aide de mod_vhost_alias :

...
# obtenir le nom du serveur à partir de l'en-tête Host:
UseCanonicalName Off
# ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# inclure le nom du serveur dans les noms de fichiers
VirtualDocumentRoot /www/hosts/%0/docs
VirtualScriptAlias /www/hosts/%0/cgi-bin
...

Le nom du serveur qui est inséré dans le nom de fichier est déduit de l'adresse IP de l'hôte virtuel.

Un serveur de pages d'accueil virtuel : c'est une adaptation du système ci-dessus pour créer des pages d'accueil. Des sous-chaînes du nom du serveur sont utilisées dans le nom du fichier de sorte que, par exemple les documents pour www.user.isp.com se trouvent dans /home/user/.

...
# obtenir le nom du serveur à partir de l'en-tête Host:
UseCanonicalName Off
# ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# include part of the server name in the filenames
VirtualDocumentRoot /www/hosts/%2/docs
# single cgi-bin directory
ScriptAlias /cgi-bin/ /www/std-cgi/

Serveur virtuel basé sur l'IP plus efficace : Amélioration des hôtes virtuels dynamiques simples. Pour éviter la recherche DNS pour transformer un nom en une adresse IP, on peut se baser sur les adresses IP elles-mêmes plutôt que sur les noms correspondants

# obtenir le nom du serveur à partir du reverse DNS de l'adresse IP
UseCanonicalName DNS
# inclure l'adresse IP dans les journaux afin qu'ils puissent être scindés
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# inclure l'adresse IP dans les noms de fichiers
VirtualDocumentRootIP /var/www/html/hosts/%0/docs
VirtualScriptAliasIP /var/www/html/hosts/%0/cgi-bin

Plus d'un hôte virtuel sur le même serveur

Par exemple, une adresse IP pour les pages d'accueil des clients les et un autre pour les commerciaux avec :

UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
<Directory /var/www/html/commercial>
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/html/homepages>
Options FollowSymLinks
AllowOverride None
</Directory>
<VirtualHost 111.22.33.44>
ServerName www.commercial.isp.com
CustomLog logs/access_log.commercial vcommon
VirtualDocumentRoot /var/www/html/commercial/%0/docs
VirtualScriptAlias /var/www/html/commercial/%0/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.45>
ServerName www.homepages.isp.com
CustomLog logs/access_log.homepages vcommon
VirtualDocumentRoot /var/www/html/homepages/%0/docs
ScriptAlias /cgi-bin/ /var/www/html/std-cgi/
</VirtualHost>

Sous-domaines par nom : pour chaque domaine, on crée un fichier /etc/apache2/sites-available/domaineX.comen local, sous-domaines du localhost : Exemple : sous-domaine doc.localhost, accessible localement sur le PC lui-même (localhost) ; cela permet de tester le serveur. Pour cela,déclarer doc.localhost dans le fichier hosts : éditez avec les droits d'administration le fichier /etc/hosts pour lui ajouter la ligne :

127.0.0.1 doc.localhost

Créez avec les droits d'administration le fichier /etc/apache2/sites-available/doc.localhost :

ServerAdmin	administrateur@domaine.fr
UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
<VirtualHost *:80>
ServerName	doc.localhost
DocumentRoot	/home/<USER>/www/doc
</VirtualHost>

sur le web : sous-domaines d'un domaine : pour créer doc.mondomaine.com, sous-domaine de mondomaine.com,

ServerAdmin	administrateur@domaine.fr
UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
<VirtualHost *:80>
ServerName	doc.mondomaine.com
DocumentRoot	/home/<USER>/www/doc
</VirtualHost>

<VirtualHost *:80>
ServerName	localhost
ServerAlias	*.localhost
#	DocumentRoot	/home/nicolas/www
VirtualDocumentRoot /home/nicolas/www/%-2
</VirtualHost>
#<VirtualHost *:80>
#	ServerName	cloud.localhost
#	DocumentRoot	/home/nicolas/www/cloud
#</VirtualHost>

Voici un exemple d'organisation :config → Contiendra toute la configuration “magique”:auth → liens symboliques vers les sous-domaines (subdir*) nécessitant une authentification.ssl → liens symboliques vers les sous-domaines (subdir*) nécessitant un accès SSL.logs → logs d'accès et logs d'erreur pour le domaine concernéwww → racine de l'arborescence web où se trouveront nos pages et scripts éventuels et les sous-domaines (subdir*).

mondomaine.tld/
|-- config
| |-- auth
| `-- ssl
|-- logs
| |-- access.log
| `-- error.log
`-- www
|-- subdir1
|-- subdir2
|-- subdir3
`-- subdir4

Configuration du domaine mondomaine.com :Pour ce domaine, nous créons les 2 configurations suivantes dans le fichier /etc/apache2/sites-available/mondomaine.com

# Configuration HTTP du domaine mondomaine.com
<VirtualHost *:80>
ServerName mondomaine.com
ServerAlias *.mondomaine.com
ServerAlias *.mondomaine.net
ServerAlias *.mondomaine.fr
ServerAlias *.mondomaine.eu
ServerAlias *.mondomaine.info
ServerAdmin webmaster@mondomaine.com
DocumentRoot /var/www/mondomaine.com/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mondomaine.com/www/>
Options FollowSymLinks
AllowOverride none
Order allow,deny
allow from all
</Directory>
########## Log Directives
ErrorLog /var/www/mondomaine.com/logs/error.log
CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
</VirtualHost>
# Configuration HTTPS du domaine mondomaine.com
<VirtualHost *:443>
ServerName mondomaine.com
ServerAlias *.mondomaine.com
ServerAlias *.mondomaine.net
ServerAlias *.mondomaine.fr
ServerAlias *.mondomaine.eu
ServerAlias *.mondomaine.info
ServerAdmin webmaster@mondomaine.com
DocumentRoot /var/www/mondomaine.com/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mondomaine.com/www/>
Options FollowSymLinks
AllowOverride none
Order allow,deny
allow from all
</Directory>
########## Log Directives
ErrorLog /var/www/mondomaine.com/logs/error.log
CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
########## SSL Directives
SSLEngine on
SSLCertificateFile /var/www/mondomaine.com/config/mondomaine.com.pem
SSLCertificateKeyFile /var/www/mondomaine.com/config/mondomaine.com.pem
SSLCACertificateFile /var/www/mondomaine.com/config/ca.crt
</VirtualHost>

Activation du domaine mondomaine.com :

USER@MACHINE:~$ sudo a2ensite mondomaine.com

Redémarrage d'Apache :

USER@MACHINE:~$ /etc/init.d/apache restart

Cas du vhost par défaut : Pour gérer le cas d'une requête à destination d'un domaine qui n'est pas hébergé, un vhost par défaut est défini. Il est défini en premierCréer un fichier /etc/apache2/site-available/0000-default en y ajoutant la configuration suivante :

NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
RewriteEngine on
RewriteRule ^/(.*) http://www.mondomaine.com/$1 [R=301,L]
</VirtualHost>

On redirige tout le trafic vers le “vrai” domaine. Par exemple, toute requête vers http://ip_du_serveur, traitée par ce vhost, sera visiteur redirigée vers http://www.mondomaine.com/

On active le vhost :

USER@MACHINE:~$ a2ensite 0000-default

Règles de comportement : Nous souhaitons héberger le domaine mondomaine.com.Nous devons rediriger mondomaine.com vers www.mondomaine.com.Nous voulons pouvoir obtenir, le plus simplement possible, différents sous-domaines. Par exemple :blog.domaine.com doit être accessible en HTTP ou en SSL. L'authentification est gérée par l'application elle-même.webmail.domaine.com doit être obligatoirement en SSL. L'authentification est gérée par l'application elle-même.protected.domaine.com ne sera accessible qu'après authentification, mais l'accès n'est pas forcé en SSL.maitredumonde.domaine.com ne sera accessible qu'après authentification, mais l'accès est en plus forcé en SSL.Comme nous avons également loué le domaine mondomaine.fr, il faut que les 2 pointent sur le même espace d'hébergement.En ce qui concerne les alias de domaines (différentes extensions tld), il est nécessaire de modifier la configuration du vhost en ajoutant les directives ServerAlias. En effet, les domaines n’apparaissant ni en ServerName, ni en ServerAlias seront traités par le vhost par défaut.Utilisation des virtualhosts

Autres étapes

Conclusion

Problèmes connus

Voir aussi

(fr) Configuration d'hôtes virtuels sur Apache avec support automatique des sous-domaines, du SSL et de l'authentification(en) Article

Basé sur « Configuration d'hôtes virtuels sur Apache avec support automatique des sous-domaines, du SSL et de l'authentification » par jbfavre.