Utilisateur d'origine : Pierre
Une des questions récurrentes des utilisateurs Apache est : "Puis-je héberger plusieurs sites sur un seul serveur ?". La réponse est oui, grâce aux virtualhosts.
D'une manière générale, tous les sites hébergés sur Apache sont des virtualhosts, même le premier site créé automatiquement par Apache. Leurs configurations se trouvent dans le dossier /etc/apache2/sites-available/
.
Techniquement, qu'est-ce qu'un virtualhost ?
Concrètement, un virtualhost est une sous-unité d'Apache qui écoute sur un port particulier et dont la racine se trouve dans le répertoire de votre choix.
On peut par exemple imaginer l'architecture suivante :
- Un site HTTP
example.com
sur le port 80 avec comme racine /var/www/example.com/
- Un site HTTPS
example.com
sur le port 443 avec comme racine /var/www/example.com/
- Un site HTTP
dashboard.example.com
sur le port 80 avec comme racine /var/www/dashboard.example.com/
- Un site HTTPS
dashboard.example.com
sur le port 443 avec comme racine /var/www/dashboard.example.com/
- Un site HTTP
admin.example.com
sur le port 8080 avec comme racine /var/www/admin.example.com/
- Un site HTTPS
admin.example.com
sur le port 8443 avec comme racine /var/www/admin.example.com/
Pour l'exemple ci-dessus, il nous faudra donc 6 virtualhosts. On peut également faire en sorte qu'un même virtualhost réponde à plusieurs domaines, et on peut faire tourner plusieurs virtualhosts sur le même port (du moment qu'ils répondent à des domaines différents).
Le virtualhost par défaut
Nous allons déjà étudier la configuration du virtualhost par défaut avant d'essayer d'en créer un autre. Vous le savez certainement, mais lorsque Apache est installé, si vous essayez de taper l'adresse IP de votre serveur dans votre navigateur, vous atterrissez sur une page "It Works !". Cette page est servie par le virtualhost par défaut, dont la configuration se trouve dans /etc/apache2/sites-availables/000-default.conf
:
<VirtualHost *:80>
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Par souci de clarté, j'ai volontairement omis les commentaires et les explications se trouvant dans le fichier. Analysons-le ligne par ligne.
<VirtualHost *:80>
Cette première ligne est primordiale. Elle contient deux paramètres :
- L'étoile correspond à l'adresse IP à laquelle doit écouter le virtualhost. Cette propriété est très peu utile dans la mesure où les VPS grand public ne possèdent qu'une adresse IP. Je vous conseille donc de laisser l'étoile qui signifie "n'importe quelle adresse".
- Le deuxième, en revanche, est beaucoup plus intéressant car il désigne le port sur lequel écoute le virtualhost. Généralement, ce sera 80 mais vous pouvez en saisir un autre si vous souhaitez. En revanche, il faudra ajouter le port à la liste des ports utilisés par Apache (voir à la fin de ce tutoriel).
ServerName www.example.com
Cette propriété est également très importante car elle désigne à quel domaine doit répondre votre virtualhost. En gros, si elle vaut example.com
, et que dans votre table DNS vous avez ajouté une règle pour faire pointer monsite.fr
vers l'IP de votre VPS, le virtualhost ne répondra pas aux requêtes faites avec cette adresse.
Dans le virtualhost par défaut, la ligne est commentée, ce qui signifie qu'il répond à toutes les requêtes, sauf si un virtualhost a défini cette propriété, auquel cas c'est lui qui y répond.
ServerAlias
Cette propriété n'est pas présente dans le fichier de configuration par défaut, mais elle permet à un virtualhost de répondre à d'autres domaines, en plus du domaine principal défini par ServerName
. Par exemple :
ServerName example.com
ServerAlias www.example.com www1.example.com
ServerAdmin webmaster@localhost
Ici, vous pouvez mettre votre adresse mail. Elle sera incluse dans les erreurs envoyées au client (navigateur web). Ce n'est pas forcément utile, vous pouvez supprimer la propriété si vous voulez.
DocumentRoot /var/www/html
Propriété plus que primordial ! C'est tout simplement la racine de votre site web. Vous pouvez tout à fait la mettre autre part que dans /var/www/
, mais, par convention on utilise ce répertoire en créant un sous-dossier par domaine (comme dans l'exemple en première partie de ce tutoriel).
LogLevel
, ErrorLog
et CustomLog
Ces propriétés permettent de définir les informations qui apparaîtront dans les fichiers de log, ainsi que leur localisation. Je vous conseille de les laissez telles quelles, dans tous les virtualhosts que vous créerez.
Créer un virtualhost
Assez parlé, créons désormais un virtualhost ! Pour vous entraîner, je vous propose un petit exercice (domaines fictifs) :
- Le virtualhost répond sur le port 8080, peu importe l'IP locale
- Le domaine pointant sur le serveur est
blog-pierre.fr
- J'aimerais qu'on puisse aussi accéder à mon site grâce à
www.blog-pierre.fr
ainsi que blog-pierre.com
et enfin www.blog-pierre.com
- Je ne souhaite pas que mon adresse mail apparaisse dans les erreurs envoyées au client
- Je souhaite un système de logs standard
- La racine du site se situe dans
/home/pierre/blog-pierre.fr/
Alors ? Facile, non ? Voici la solution :
<VirtualHost *:8080>
ServerName blog-pierre.fr
ServerAlias www.blog-pierre.fr blog-pierre.com www.blog-pierre.com
DocumentRoot /home/pierre/blog-pierre.fr/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Les propriétés ServerAdmin
et LogLevel
ne sont pas obligatoires, mais si vous les avez mis, c'est juste aussi, à condition qu'elles soient commentées.
Une fois la configuration écrite, il faut l'enregistrer dans les virtualhosts d'Apache (/etc/apache2/sites-availables/blog-pierre.fr.conf
), puis activer le site et recharger Apache :
a2ensite blog.pierre.fr
service apache2 reload
L'argument à passer à la commande a2ensite
est le nom du fichier de configuration de votre virtualhost, sans le .conf
. Vous pouvez mettre ce que vous voulez, mais, par convention, on met le nom du domaine principal (ServerName
). A noter que la commande de rechargement d'Apache (la deuxième), doit être exécutée à chaque modification de virtualhost.
Les ports "exotiques"
Si vous utilisez, dans votre virtualhost, des ports autres que 80 et 443, vous devez les ajouter à la configuration d'Apache. Pour cela, éditez le fichier /etc/apache2/ports.conf
et rajoutez le port voulu avec la propriété Listen
. Par exemple :
Listen 80
Listen 8080
Listen 8888
Relancez ensuite Apache :
service apache2 restart
Attention, les ports choisis ne doivent pas être occupés par un autre processus, sinon Apache ne démarrera pas.
Letsencrypt
Pour activer le SSL sur vos sites Letsencrypt va créer un deuxième virtualhost écoutant sur le port 443 et portant le même nom de fichier de configuration que le premier, avec -le-ssl
à la fin. Vous pouvez modifier le port dans le fichier en question, n'oubliez pas de recharger Apache ensuite.
Supprimer un virtualhost
Commencez déjà par désactiver le virtualhost et rechargez Apache. Vous pourrez ensuite supprimer son fichier de configuration.
a2dissite blog-pierre.fr
rm /etc/apache2/sites-availables/blog-pierre.fr.conf
# Si SSL actif :
a2dissite blog-pierre.fr-le-ssl
rm /etc/apache2/sites-availables/blog-pierre.fr-le-ssl.conf
# Dans tous les cas :
service apache2 reload
Pour aller plus loin
Les virtualhosts permettent de faire beaucoup plus de choses que d'héberger plusieurs sites à la fois :
- Activer des modules pour des virtualhosts spécifiques
- Déclarer des règles de redirection pour chaque virtualhost
- Définir des règles d'accès pour chaque virtualhost
- Et encore plus...
Toutes ces propriétés sont disponibles sur la documentation d'Apache (en français !).