← Retour au portail

Fiche 10 - Apache2 – VirtualHosts (sites multiples sur un seul serveur)

Configurer des VirtualHosts Apache2 pour héberger plusieurs sites web sur un même serveur Debian, avec ou sans HTTPS.

Intermédiaire — SISR 1ère année ⏱️ 20 min 📁 Administration système

🎯 Objectifs de la fiche

  1. Principe des VirtualHosts — Héberger plusieurs sites sur un seul serveur
  2. VirtualHost par nom (Name-based) — Différencier les sites par le nom de domaine
  3. Créer et activer un VirtualHost — Fichier .conf, a2ensite, reload
  4. VirtualHost HTTPS avec certificat auto-signé — Générer un certificat, configurer SSL
  5. 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 VirtualHostCritère de sélectionUsage
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 serveurPlusieurs IP sur le serveur — rare aujourd'hui
Port-based (par port)Port TCP (ex: 80, 8080, 443)Plusieurs ports sur la même IP
ℹ️ En pratique, on utilise presque toujours les VirtualHosts par nom. Un serveur avec une seule IP publique peut héberger des dizaines de sites grâce à cette méthode.

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>
DirectiveRôleExemple
ServerNameNom de domaine principal du sitewww.monsite.fr
ServerAliasNoms alternatifs (ex: sans www)monsite.fr *.monsite.fr
DocumentRootRépertoire racine des fichiers du site/var/www/monsite
ErrorLogFichier de log des erreurs/var/log/apache2/monsite-error.log
CustomLogFichier de log des accès/var/log/apache2/monsite-access.log combined
ServerAdminEmail de l'administrateur (affiché sur erreurs)admin@monsite.fr
DirectoryBloc de configuration pour un répertoireOptions -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
💡 Pour les tests en local (sans DNS), ajoutez une entrée dans /etc/hosts de votre PC : 192.168.1.10 www.monsite.fr monsite.fr (remplacez l'IP par celle du serveur).

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
ℹ️ Un certificat auto-signé provoquera un avertissement dans le navigateur. C'est normal en développement/test. En production, utilisez Let's Encrypt (certbot) pour un certificat gratuit et valide.

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>
💡 Avec le module rewrite, on peut aussi utiliser : RewriteEngine On / RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]. La méthode Redirect est plus simple et suffisante.

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
⚠️ Si plusieurs VirtualHosts ont le même ServerName, Apache utilisera le premier déclaré. Veillez à ce que chaque site ait un ServerName unique. Le fichier 000-default.conf capte toutes les requêtes qui ne correspondent à aucun autre VirtualHost.

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
Dans quel dossier crée-t-on le fichier de configuration d'un nouveau VirtualHost ?
  • /etc/apache2/sites-enabled/
  • /etc/apache2/sites-available/
  • /var/www/html/
  • /etc/apache2/conf-available/

✅ Réponse : /etc/apache2/sites-available/

Quelle directive définit le nom de domaine principal d'un VirtualHost ?
  • ServerAlias
  • ServerAdmin
  • ServerName
  • DocumentRoot

✅ Réponse : ServerName

Après avoir créé un fichier VirtualHost, quelle commande l'active ?
  • a2enmod
  • a2enconf
  • a2ensite
  • apachectl enable

✅ Réponse : a2ensite

Quel module Apache faut-il activer pour le HTTPS ?
  • tls
  • https
  • ssl
  • certs

✅ Réponse : ssl

Comment forcer la redirection HTTP vers HTTPS simplement dans un VirtualHost port 80 ?
  • Redirect permanent / https://www.monsite.fr/
  • ForceHTTPS on
  • SSLRedirect on
  • Rewrite ^ https://www.monsite.fr

✅ Réponse : Redirect permanent / https://www.monsite.fr/

Quelle commande affiche tous les VirtualHosts configurés et actifs ?
  • apache2ctl -S
  • apachectl --list
  • a2ensite --list
  • apache2 -v

✅ Réponse : apache2ctl -S