Les serveurs virtuels, ou VirtualHost, permettent de faire cohabiter plusieurs serveurs web sur une même machine. C’est intéressant notamment dans le cadre d’un poste de développement pour pouvoir gérer tous ses projets et pouvoir y accéder par des urls différentes.

Emplacement des VirtualHost

Vous allez pouvoir trouver vos VirtualHost dans le répertoire :

cd /etc/apache2

Là, deux dossiers vont nous intéresser tout particulièrement : « sites-available » dans lequel vous trouverez tous les serveurs virtuels créés et disponibles, et « sites-enabled » où vous trouverez les hôtes disponibles ayant été activés.

Création d’un VirtualHost

Dans le cas d’un poste de développement, vous allez créer des hôtes virtuels basés sur le nom (une seule IP, plusieurs noms de domaines).

Déjà, il vous faut modifier votre fichier host local pour que le nom de domaine que vous allez créer avec votre VirtualHost pointe sur votre machine locale. Pour cela, vous pouvez faire un

sudo vi /etc/hosts

en édition, vous allez rajouter :

127.0.0.1 votre.virtual.host

Vous allez maintenant pouvoir vous rendre dans le dossier « sites-available » pour créer un nouveau fichier avec votre éditeur préféré.

Votre fichier va être encadré par les balises <VirtualHost> et </VirtualHost>. Dans la balise ouvrante, vous allez pouvoir spécifier les ip et ports entrants si besoin. Si vous souhaitez utilise n’importe quelle IP, vous pouvez mettre « * ».
Par exemple, voici deux balises ouvrantes, une pour n’importe quelle IP sur le port 80 (http) et une sur n’importe quelle IP sur le port 443 (https) :

<VirtualHost *:80>
<VirtualHost *:443>

Voici maintenant un exemple plus complet de VirtualHost, qui va gérer le http et le https, les cerfificats https, le chargement d’un fichier de configuration PHP contenant les constantes, mais également l’emplacement des logs erreur php et apache.
Le voici, nous détaillerons ensuite les différents éléments de ce serveur virtuel :

<VirtualHost *:80>

ServerName dev.monsite.com
ServerAdmin webmaster@localhost

DocumentRoot /var/www/monSite/public_html
 ErrorLog /var/www/monSite/logs/apache/error_log
 TransferLog /var/www/monSite/logs/apache/access_log

<Directory "/var/www/monSite/public_html">
 AllowOverride All
 php_value auto_prepend_file /var/www/monSite/config/dev.monsite.config.php
 php_value error_log /var/www/monSite/logs/php/php.err
 </Directory>
</VirtualHost>

<VirtualHost *:443>

ServerName dev.monsite.com
 ServerAdmin webmaster@localhost

 SSLEngine on
 SSLCertificateFile /etc/ssl/certs/dev.monsite.pem
 SSLCertificateKeyFile /etc/ssl/certs/dev.monsite.pem

DocumentRoot /var/www/monSite/public_html
 ErrorLog /var/www/monSite/logs/apache/error_log
 TransferLog /var/www/monSite/logs/apache/access_log

<Directory "/var/www/monSite/public_html">
 AllowOverride All
 php_value auto_prepend_file /var/www/monSite/config/dev.monsite.config.php
 php_value error_log /var/www/monSite/logs/php/php.err
</Directory>

</VirtualHost>
<pre>

Voici le détail des éléments :

  • DocumentRoot : la racine html de votre projet.
  • ErrorLog et TransferLog : les chemins vers les logs d’erreur Apache.
  • Les balises Directory contiennent des instructions spécifiques au dossier en question.
  • AllowOverride All donne la priorité au fichier htaccess par rapport à la configuration du vhost.
  • auto-prepend permet de spécifier un fichier à charger. En général il s’agit d’un fichier de configuration PHP contenant les constantes.
  • error_log dans le cadre d’une php_value permet d’indiquer le chemin du log d’erreur PHP.
  • Pour le port 443, vous pouvez spécifier que le SSL est actif avec SSLEngine.
  • Vous pouvez ensuite vers le certificat et la clé de certificat avec SSLCertificateFile et SSLCertificateKeyFile.

Activer et desactiver un VirtualHost

Si vous souhaitez activer un Virtualhost disponible, il suffit de taper la commande :

sudo a2ensite votre.virtual.host

Pour le désactiver, il faudra taper cette commande :


sudo a2dissite votre.virtual.host

A chaque fois, vous devrez faire un reload d’apache :

/etc/init.d/apache2 reload

Pour plus d’informations, je vous invite à consulter la documentation Apache sur le sujet.