Configurer des VirtualHosts Apache2 pour héberger plusieurs sites web sur un même serveur Debian, avec ou sans HTTPS.
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).
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 |
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 |
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
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>
sudo a2ensite monsite.conf sudo apachectl configtest # doit afficher Syntax OK sudo systemctl reload apache2
Pour un environnement de test (sans Let's Encrypt), on peut générer un certificat auto-signé.
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"
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
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>
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
# 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éponse : /etc/apache2/sites-available/
✅ Réponse : ServerName
✅ Réponse : a2ensite
✅ Réponse : ssl
✅ Réponse : Redirect permanent / https://www.monsite.fr/
✅ Réponse : apache2ctl -S