Sommaire
Configurer des VirtualHosts Apache2 pour héberger plusieurs sites web sur un même serveur Debian, avec ou sans HTTPS.
🎯 Objectifs de la fiche
- Principe des VirtualHosts — Héberger plusieurs sites sur un seul serveur
- VirtualHost par nom (Name-based) — Différencier les sites par le nom de domaine
- Créer et activer un VirtualHost — Fichier .conf, a2ensite, reload
- VirtualHost HTTPS avec certificat auto-signé — Générer un certificat, configurer SSL
- VirtualHost avec redirection HTTP vers HTTPS — Forcer le HTTPS sur tous les accès
Prérequis
Apache2 installé et fonctionnel (voir fiche 9). Connaître les bases de la configuration Apache2. Avoir un ou plusieurs noms de domaine ou entrées DNS (ou fichier /etc/hosts pour les tests).
1. Principe des VirtualHosts
Un VirtualHost permet à Apache2 d'héberger plusieurs sites web sur le même serveur (même IP, même port). Apache choisit quel site afficher en fonction du nom de domaine de la requête HTTP (en-tête Host envoyé par le navigateur).
| Type de VirtualHost | Critère de sélection | Usage |
|---|---|---|
| Name-based (par nom) | Nom de domaine (en-tête HTTP Host) | Le plus courant — un site par nom de domaine |
| IP-based (par IP) | Adresse IP du serveur | Plusieurs IP sur le serveur — rare aujourd'hui |
| Port-based (par port) | Port TCP (ex: 80, 8080, 443) | Plusieurs ports sur la même IP |
2. Structure d'un fichier VirtualHost
Chaque site est décrit dans un fichier .conf dans /etc/apache2/sites-available/. Voici la structure minimale :
<VirtualHost *:80>
ServerName www.monsite.fr
ServerAlias monsite.fr
DocumentRoot /var/www/monsite
ErrorLog ${APACHE_LOG_DIR}/monsite-error.log
CustomLog ${APACHE_LOG_DIR}/monsite-access.log combined
</VirtualHost>
| Directive | Rôle | Exemple |
|---|---|---|
| ServerName | Nom de domaine principal du site | www.monsite.fr |
| ServerAlias | Noms alternatifs (ex: sans www) | monsite.fr *.monsite.fr |
| DocumentRoot | Répertoire racine des fichiers du site | /var/www/monsite |
| ErrorLog | Fichier de log des erreurs | /var/log/apache2/monsite-error.log |
| CustomLog | Fichier de log des accès | /var/log/apache2/monsite-access.log combined |
| ServerAdmin | Email de l'administrateur (affiché sur erreurs) | admin@monsite.fr |
| Directory | Bloc de configuration pour un répertoire | Options -Indexes, AllowOverride All |
3. Créer un VirtualHost HTTP (port 80)
3.1 Créer le répertoire et la page d'accueil
sudo mkdir -p /var/www/monsite echo "<h1>Bienvenue sur monsite.fr</h1>" | sudo tee /var/www/monsite/index.html sudo chown -R www-data:www-data /var/www/monsite sudo chmod -R 755 /var/www/monsite
3.2 Créer le fichier de configuration
sudo nano /etc/apache2/sites-available/monsite.conf
<VirtualHost *:80>
ServerName www.monsite.fr
ServerAlias monsite.fr
ServerAdmin admin@monsite.fr
DocumentRoot /var/www/monsite
<Directory /var/www/monsite>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/monsite-error.log
CustomLog ${APACHE_LOG_DIR}/monsite-access.log combined
</VirtualHost>
3.3 Activer le site et recharger Apache2
sudo a2ensite monsite.conf sudo apachectl configtest # doit afficher Syntax OK sudo systemctl reload apache2
4. VirtualHost HTTPS avec certificat auto-signé
Pour un environnement de test (sans Let's Encrypt), on peut générer un certificat auto-signé.
4.1 Activer le module SSL et générer un certificat
sudo a2enmod ssl
sudo systemctl reload apache2
# Générer un certificat auto-signé valable 365 jours
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/monsite.key \
-out /etc/ssl/certs/monsite.crt \
-subj "/C=FR/ST=Normandie/L=Avranches/O=NDLP/CN=www.monsite.fr"
4.2 Créer le VirtualHost HTTPS
sudo nano /etc/apache2/sites-available/monsite-ssl.conf
<VirtualHost *:443>
ServerName www.monsite.fr
ServerAlias monsite.fr
ServerAdmin admin@monsite.fr
DocumentRoot /var/www/monsite
SSLEngine on
SSLCertificateFile /etc/ssl/certs/monsite.crt
SSLCertificateKeyFile /etc/ssl/private/monsite.key
<Directory /var/www/monsite>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/monsite-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/monsite-ssl-access.log combined
</VirtualHost>
sudo a2ensite monsite-ssl.conf sudo apachectl configtest sudo systemctl reload apache2
5. Redirection HTTP vers HTTPS
Bonne pratique : rediriger automatiquement toutes les requêtes HTTP (port 80) vers HTTPS (port 443).
# Modifier le VirtualHost port 80 pour rediriger vers HTTPS
<VirtualHost *:80>
ServerName www.monsite.fr
ServerAlias monsite.fr
Redirect permanent / https://www.monsite.fr/
</VirtualHost>
6. Gérer plusieurs sites sur le même serveur
Exemple d'un serveur hébergeant trois sites distincts :
# Structure des fichiers /etc/apache2/sites-available/ ├── 000-default.conf # Site par défaut (désactivé si on n'en a pas besoin) ├── monsite.conf # Site HTTP monsite.fr ├── monsite-ssl.conf # Site HTTPS monsite.fr ├── autresite.conf # Site HTTP autresite.fr └── blog.conf # Site HTTP blog.monsite.fr # Activer tous les sites sudo a2ensite monsite.conf monsite-ssl.conf autresite.conf blog.conf sudo a2dissite 000-default.conf # désactiver le site par défaut si inutile sudo apachectl configtest sudo systemctl reload apache2
7. Commandes de gestion récapitulatives
# Lister les sites disponibles ls /etc/apache2/sites-available/ # Lister les sites actifs ls /etc/apache2/sites-enabled/ # Voir tous les VirtualHosts configurés sudo apache2ctl -S # Vérifier la configuration sudo apachectl configtest # Recharger sans interruption sudo systemctl reload apache2 # Redémarrer complètement sudo systemctl restart apache2
- ☐ Répertoire du site créé avec les bonnes permissions (www-data)
- ☐ Fichier .conf créé dans /etc/apache2/sites-available/
- ☐ ServerName et DocumentRoot correctement définis
- ☐ Site activé avec a2ensite
- ☐ apachectl configtest retourne Syntax OK
- ☐ Apache2 rechargé avec systemctl reload apache2
- ☐ Site accessible depuis le navigateur
- ☐ Redirection HTTP vers HTTPS configurée (si HTTPS activé)
Dans quel dossier crée-t-on le fichier de configuration d'un nouveau VirtualHost ?
✅ Réponse : /etc/apache2/sites-available/
Quelle directive définit le nom de domaine principal d'un VirtualHost ?
✅ Réponse : ServerName
Après avoir créé un fichier VirtualHost, quelle commande l'active ?
✅ Réponse : a2ensite
Quel module Apache faut-il activer pour le HTTPS ?
✅ Réponse : ssl
Comment forcer la redirection HTTP vers HTTPS simplement dans un VirtualHost port 80 ?
✅ Réponse : Redirect permanent / https://www.monsite.fr/
Quelle commande affiche tous les VirtualHosts configurés et actifs ?
✅ Réponse : apache2ctl -S