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
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
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
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.