Pré-requis


Installation du serveur Apache


On installe le paquet et on démarre le service :
yum install httpd
chkconfig httpd on
service httpd start


Installation du module mod_ssl pour Apache


Il suffit d'installer le paquet :
yum install mod_ssl
service httpd restart

Configuration DNS


Pour mettre en œuvre le name-based virtual host, il est nécessaire de pouvoir déclarer des CName dans votre DNS. Pour chaque Vhost Apache, il devra y avoir au moins un CName correspondant. En entreprise ça ne pose pas de problème, mais par exemple pour un particulier qui n'a pas d'IP fixe, il peut être impossible de mettre cette méthode en œuvre.

Configuration globale du serveur Apache


On va commencer par faire un peu de ménage dans le répertoire conf.d/ d'Apache, premièrement on dégage la page d'accueil par défaut :
rm /etc/httpd/conf.d/welcome.conf

Puis on va supprimer le default VHost sur le port 443 dans le fichier ssl.conf :
vim /etc/httpd/conf.d/ssl.conf

Supprimez tout le contenu comprit entre <VirtualHost _default_:443> et </VirtualHost>. Supprimez les directives <VirtualHost></VirtualHost>.

Avant de déclarer des VHosts, il y a pas mal de configuration a revoir par rapport au fichier httpd.conf livré par défaut. Il s'agit surtout de bonnes pratiques pour sécuriser son serveur. Éditer le fichier httpd.conf :
vim /etc/httpd/conf/httpd.conf

Il faut modifier une série de directive :
ServerAdmin <adresse_mail_admin>
ServerSignature Off
AddDefaultCharset UTF-8


On ajoute aussi quelques interdiction sur types de fichiers (par exemple les fichiers temporaires qu'Emacs laisse trainer partout) :
<Files ~ ".*~$">
      Order allow,deny
      Deny from all
</Files>


A la fin du fichier, on active le name-based virtual host sur les ports 80 et 443 :
NameVirtualHost *:80
NameVirtualHost *:443


Enfin, on ajoute un include pour les futurs fichiers de conf des VHosts :
Include conf/vhosts/*.conf

On crée ensuite le répertoire, on test la configuration et on relance le serveur :
mkdir /etc/httpd/conf/vhosts
service httpd configtest
service httpd restart


Déclaration des VHosts


Pour faciliter le travail d'administration par la suite, on va créer un fichier de conf par virutal host. Je trouve ce système très pratique quand il y a beaucoup de sites hébergés sur le serveur et en plus c'est cohérent : La conf commune dans httpd.conf et les spécificités dans un fichier dédié.

J'utilise une convention pour le nom du fichier de conf, en fait j'utilise le nom complet suivit de .conf :
vim /etc/httpd/conf/vhosts/<cname>.<domaine>.conf

VirtualHost HTTP simple


Un premier exemple très simple, un vhost qui répond sur le port 80 :
<VirtualHost *:80>
    ServerName <cname>.<domaine>
    ServerAlias <cname>
    ServerAdmin <admin_name>@<domaine>

    DocumentRoot /var/www/<cname>/
    <Directory />
        Options FollowSymLinks
        AllowOverride none
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>


VirtualHost HTTPS simple


Un virtualhost qui répond cette fois ci sur le port 443 :
<VirtualHost *:443>
    ServerName <cname>.<domaine>
    ServerAlias <cname>
    ServerAdmin <admin_name>@<domaine>

    SSLEngine on
    SSLCertificateFile /etc/httpd/conf/ssl/<cname>.<domaine>.crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl/key/<cname>.<domaine>.key

    DocumentRoot /var/www/<cname>/
    <Directory />
        Options FollowSymLinks
        AllowOverride none
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>


VirtualHost pour forcer le HTTPS


Ce virtualhost renvoi toutes les requêtes vers le port 443. On reprend la conf du VHost Http simple et on ajoute la directive Redirect :
<VirtualHost *:80>
    ServerName <cname>.<domaine>
    ServerAlias <cname>
    ServerAdmin <admin_name>@<domaine>

    RedirectMatch permanent ^/(.*)$ https://<cname>.<domaine>/$1
</VirtualHost>


Cette méthode peut aussi être utiliser pour rediriger les requêtes sur <domaine> vers www.<domaine> ou encore l'adresse IP vers www.<domaine>, cela évitera des doublons dans le référencement de votre site.

VirtualHost pour application PHP


Lorsqu'on mutualise un serveur web pour plusieurs applications PHP, il faut veiller à les cloisonner. On reprend notre VHost simple et on y ajoute quelques directives qui vont surcharger le fichier php.ini.
<VirtualHost *:80>
    ServerName <cname>.<domaine>
    ServerAlias <cname>
    ServerAdmin <admin_name>@<domaine>

    DocumentRoot /var/www/<cname>/
    <Directory />
        Options FollowSymLinks
        AllowOverride none
        Order allow,deny
        Allow from all

        php_admin_flag safemode 1
        php_admin_value open_basedir "/var/www/<cname>"
        php_admin_value include_path ".:/usr/share/pear"
    </Directory>
</VirtualHost>


Fichiers de log dédiés à un VHost


Il est conseillé de séparer les logs des différents Vhosts pour simplifier par la suite la maintenance. Pour se faire, il suffit de rajouter dans le contenu de la directive <VirtualHost> les ligne suivantes :
CustomLog /var/log/httpd/<cname>-access.log combined
ErrorLog /var/log/httpd/<cname>-error.log
LogLevel warn


Conclusion


Cette méthode est simple a utiliser et apporte énormément d'avantage. Elle permet de séparer d'un point de vue logique les différents sites hébergés. Un seul serveur peut hébergé autant de VHost que l'on souhaite, appartenant à autant de domaine que l'on souhaite. De plus en jouant sur les réécritures et les redirections entre VHost, on peut faire des choses très puissantes.