Tout sur le name-based virtual host !

Friday, October 21, 2011

Apache est la référence en matière de serveur de documents web. Mais il y a 36 façons de configurer son serveur, chacun à ses petites astuces. Dans cet article, je vais décrire ma façon de configurer Apache en m’appuyant sur le module mod_vhost_alias …

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 et . Supprimez les directives .

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 vers www. ou encore l’adresse IP vers www., 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 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.

ArticleGeekapachecnamehttphttpd.confhttpsmod_vhost_aliasredirectsslvhostVirtualHost
Le contenu de ce site est sous licence Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Gamb

DIY

PowerShell : Superviser Exchange 2010 sans supervision ^^

Exchange et Thunderbird : Un mariage improbable