Dans le tutoriel précédent, nous avons importé notre base de données et uploadé nos fichiers sur le serveur.
Sur un serveur dédié, Apache peut héberger plusieurs sites sur la même machine grâce aux virtual hosts. Chaque domaine possède sa propre configuration, son dossier web, ses logs et, idéalement, son certificat HTTPS.
Sur Debian et Ubuntu, la méthode propre consiste à créer un fichier de configuration dans /etc/apache2/sites-available/, à l’activer avec a2ensite, puis à recharger Apache après un test de syntaxe.
Voici une méthode moderne, propre et réutilisable pour créer un virtual host Apache sans casser les autres sites du serveur.
Qu’est-ce qu’un virtual host Apache ?
Un virtual host permet à Apache de servir plusieurs sites depuis le même serveur. Par exemple :
example.com;www.example.com;blog.example.com;client.example.net.
Chaque domaine peut avoir son propre DocumentRoot, ses propres règles Apache, ses propres logs et sa propre configuration HTTPS.
Dans la majorité des cas, on utilise des virtual hosts par nom. Cela signifie que plusieurs sites partagent la même IP, et qu’Apache choisit le bon site grâce au nom de domaine reçu dans la requête HTTP.
Préparer le dossier du site
Commençons par créer un dossier pour le site. Adaptez le domaine et le chemin à votre serveur.
sudo mkdir -p /var/www/example.com/public_htmlCode language: JavaScript (javascript)
Créez une page de test :
echo '<h1>example.com fonctionne</h1>' | sudo tee /var/www/example.com/public_html/index.htmlCode language: PHP (php)
Donnez ensuite les bons droits au dossier. Sur un serveur classique, vous pouvez attribuer le dossier à votre utilisateur et au groupe Apache :
sudo chown -R "$USER":www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;Code language: JavaScript (javascript)
Pour un site WordPress, ajustez les permissions selon votre modèle PHP-FPM, votre utilisateur système et votre politique de déploiement. Le point important : Apache doit pouvoir lire les fichiers, et PHP doit pouvoir écrire uniquement là où c’est nécessaire.
Créer le fichier virtual host
Créez un fichier de configuration dans /etc/apache2/sites-available/. Sur Debian/Ubuntu, utilisez l’extension .conf.
sudo nano /etc/apache2/sites-available/example.com.conf
Ajoutez une configuration HTTP simple :
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>Code language: HTML, XML (xml)
Les directives importantes :
ServerNamedéfinit le domaine principal du site ;ServerAliasajoute des domaines secondaires, souventwww;DocumentRootpointe vers le dossier public du site ;Directorydéfinit les droits Apache sur ce dossier ;ErrorLogetCustomLogséparent les logs du site.
Activer le virtual host avec a2ensite
Une fois le fichier créé, activez le site :
sudo a2ensite example.com.confCode language: CSS (css)
Cette commande crée un lien symbolique dans /etc/apache2/sites-enabled/. Elle n’applique pas encore la configuration en production. Pour cela, il faut tester puis recharger Apache.
Vérifiez que le lien existe :
ls -l /etc/apache2/sites-enabled/
Tester la configuration Apache
Avant de recharger Apache, testez toujours la syntaxe :
sudo apachectl configtest
Ou :
sudo apache2ctl configtest
Si tout va bien, Apache répond :
Votre hébergement est devenu un problème ?
Serveur partagé saturé, limites PHP trop basses, support qui répond en 48h — à un certain niveau de trafic, l'hébergement mutualisé devient le goulot. Je migre et configure des serveurs dédiés.
Parlons de votre infrastructure →Syntax OK
La commande apachectl configtest vérifie la syntaxe de la configuration et affiche les erreurs éventuelles. C’est le petit garde-fou qui évite de casser tous les sites pour une accolade mal placée.
Recharger Apache sans couper les connexions
Si la syntaxe est valide, rechargez Apache :
sudo systemctl reload apache2
Vous pouvez aussi utiliser un rechargement gracieux :
sudo apachectl graceful
Un reload applique la nouvelle configuration sans arrêt brutal du service. Apache documente aussi le mode graceful, qui évite d’interrompre les connexions en cours.
Tester le virtual host
Si le DNS pointe déjà vers le serveur, testez directement :
curl -I http://example.comCode language: JavaScript (javascript)
Vous devriez obtenir une réponse HTTP, par exemple :
HTTP/1.1 200 OKCode language: HTTP (http)
Si le DNS n’est pas encore propagé, testez le vhost en forçant l’en-tête Host vers l’IP du serveur :
curl -I -H "Host: example.com" http://203.0.113.10Code language: JavaScript (javascript)
Remplacez 203.0.113.10 par l’adresse IP de votre serveur. Ce test permet de vérifier Apache avant même que le DNS soit prêt.
Vérifier quel vhost répond
Apache permet de lister les virtual hosts chargés avec :
sudo apachectl -S
Cette commande affiche les vhosts, leurs ports, leurs ServerName, leurs aliases et le fichier de configuration utilisé.
Elle est très utile si un domaine affiche le mauvais site. Dans ce cas, Apache utilise souvent le premier vhost correspondant à l’IP et au port, faute de ServerName correct.
Désactiver le site par défaut si nécessaire
Sur Ubuntu, Apache active souvent un site par défaut : 000-default.conf. Vous pouvez le garder, mais sur un serveur de production propre, il est parfois préférable de le désactiver ou de le transformer en vhost de secours explicite.
sudo a2dissite 000-default.conf
sudo apachectl configtest
sudo systemctl reload apache2Code language: JavaScript (javascript)
Ne désactivez pas le vhost par défaut au hasard si vous ne savez pas quel site doit répondre aux requêtes inconnues. Un vhost de secours bien contrôlé peut être utile.
Ajouter HTTPS avec Let’s Encrypt
Un virtual host HTTP seul suffit pour un test, mais un site public doit servir HTTPS. La méthode la plus courante consiste à utiliser Let’s Encrypt avec Certbot.
Installez Certbot et le plugin Apache :
sudo apt update
sudo apt install certbot python3-certbot-apache
Générez ensuite le certificat :
sudo certbot --apache -d example.com -d www.example.comCode language: CSS (css)
Certbot peut modifier automatiquement la configuration Apache pour ajouter le vhost HTTPS et la redirection HTTP vers HTTPS. Relisez toujours le résultat généré, surtout sur un serveur qui héberge plusieurs sites.
Pour tester le certificat :
curl -I https://example.comCode language: JavaScript (javascript)
Et pour vérifier le renouvellement automatique :
sudo certbot renew --dry-run
Apache documente aussi les virtual hosts SSL/TLS, mais Certbot reste souvent la méthode la plus simple pour un site public classique.
Exemple de virtual host HTTPS manuel
Si vous gérez vous-même vos certificats, par exemple avec acme.sh, vous pouvez créer un vhost HTTPS manuellement.
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/example.com/privkey.pem
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>Code language: HTML, XML (xml)
Activez le module SSL si nécessaire :
sudo a2enmod ssl
sudo apachectl configtest
sudo systemctl reload apache2
Adaptez les chemins des certificats à votre serveur. Un chemin faux suffit à empêcher Apache de recharger. Apache est charmant comme ça : il refuse de faire semblant.
Virtual host Apache pour WordPress
Pour WordPress, le vhost doit généralement autoriser les règles .htaccess, car WordPress y écrit ses règles de permaliens sur Apache.
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>Code language: HTML, XML (xml)
Assurez-vous aussi que le module rewrite est actif :
sudo a2enmod rewrite
sudo apachectl configtest
sudo systemctl reload apache2
Ensuite, dans WordPress, allez dans Réglages → Permaliens et enregistrez. En ligne de commande :
wp rewrite flush --hard
Si vous cherchez plutôt l’équivalent nginx, l’article sur The SEO Framework et les erreurs 404 de sitemap sous nginx montre bien la différence : nginx ne lit pas de .htaccess, donc les règles doivent être écrites dans le server block.
Vérifier les logs du virtual host
Avec des logs séparés par site, le diagnostic devient beaucoup plus simple.
Voir les dernières erreurs :
sudo tail -n 100 /var/log/apache2/example.com-error.logCode language: JavaScript (javascript)
Voir les dernières requêtes :
sudo tail -n 100 /var/log/apache2/example.com-access.logCode language: JavaScript (javascript)
Suivre les erreurs en temps réel :
sudo tail -f /var/log/apache2/example.com-error.logCode language: JavaScript (javascript)
En cas d’erreur Apache générale, regardez aussi :
sudo journalctl -u apache2 --since "1 hour ago"Code language: JavaScript (javascript)
Pour une méthode plus large d’analyse serveur, vous pouvez consulter le guide sur l’analyse des performances d’un serveur dédié.
Erreurs fréquentes
Le domaine affiche le mauvais site
Lancez :
sudo apachectl -S
Vérifiez que ServerName et ServerAlias correspondent bien au domaine. Vérifiez aussi que le DNS pointe vers la bonne IP.
Erreur 403 Forbidden
Une erreur 403 vient souvent d’un problème de permissions ou d’une directive Directory trop restrictive.
Vérifiez :
namei -l /var/www/example.com/public_html
sudo tail -n 100 /var/log/apache2/example.com-error.logCode language: JavaScript (javascript)
Assurez-vous que le vhost contient bien :
<Directory /var/www/example.com/public_html>
Require all granted
</Directory>Code language: HTML, XML (xml)
Pour un cas WordPress proche, l’article sur les images qui renvoient une erreur 403 détaille la logique permissions/serveur côté fichiers statiques.
Erreur 404 sur toutes les pages WordPress sauf l’accueil
Activez mod_rewrite et autorisez .htaccess avec AllowOverride All dans le bon bloc Directory.
sudo a2enmod rewrite
sudo apachectl configtest
sudo systemctl reload apache2
wp rewrite flush --hard
Si les permaliens restent cassés, vérifiez que le fichier .htaccess existe et qu’Apache peut le lire.
Apache ne redémarre plus après activation
Ne relancez pas à l’aveugle. Lisez l’erreur :
sudo apachectl configtest
sudo journalctl -u apache2 --since "10 minutes ago"Code language: JavaScript (javascript)
Causes fréquentes :
- directive mal écrite ;
- module manquant ;
- chemin de certificat invalide ;
- fichier de log inaccessible ;
- balise
<VirtualHost>non fermée ; - copier-coller avec guillemets typographiques.
Certificat HTTPS non trouvé
Vérifiez les chemins :
sudo ls -l /etc/ssl/example.com/fullchain.pem
sudo ls -l /etc/ssl/example.com/privkey.pem
Puis testez Apache :
sudo apachectl configtest
Si vous utilisez Certbot, regardez les chemins dans le vhost généré ou dans /etc/letsencrypt/live/example.com/.
Désactiver un virtual host
Pour désactiver un site sans supprimer son fichier de configuration :
sudo a2dissite example.com.conf
sudo apachectl configtest
sudo systemctl reload apache2Code language: CSS (css)
Le fichier reste disponible dans sites-available, mais Apache ne le charge plus via sites-enabled.
Supprimer proprement un virtual host
Pour retirer un site :
- désactivez le vhost ;
- testez Apache ;
- rechargez Apache ;
- archivez ou supprimez les fichiers du site ;
- archivez ou supprimez les logs si nécessaire ;
- retirez les certificats si vous êtes sûr qu’ils ne servent plus.
sudo a2dissite example.com.conf
sudo apachectl configtest
sudo systemctl reload apache2Code language: CSS (css)
Ne supprimez pas les fichiers avant d’avoir désactivé le vhost, sinon Apache peut continuer à pointer vers un DocumentRoot absent.
Checklist rapide
- Créer le dossier du site dans
/var/wwwou votre chemin habituel. - Créer un fichier
.confdans/etc/apache2/sites-available/. - Définir
ServerNameetServerAlias. - Définir le bon
DocumentRoot. - Ajouter un bloc
DirectoryavecRequire all granted. - Ajouter des logs séparés par site.
- Activer le site avec
a2ensite. - Tester avec
apachectl configtest. - Recharger Apache avec
systemctl reload apache2. - Tester avec
curl -I. - Vérifier les vhosts chargés avec
apachectl -S. - Ajouter HTTPS avec Certbot ou votre client ACME.
Commandes utiles à garder
Créer le dossier web :
sudo mkdir -p /var/www/example.com/public_htmlCode language: JavaScript (javascript)
Créer le fichier vhost :
sudo nano /etc/apache2/sites-available/example.com.conf
Activer le vhost :
sudo a2ensite example.com.confCode language: CSS (css)
Tester Apache :
sudo apachectl configtest
Recharger Apache :
sudo systemctl reload apache2
Lister les vhosts :
sudo apachectl -S
Tester un domaine sans DNS :
curl -I -H "Host: example.com" http://203.0.113.10Code language: JavaScript (javascript)
Désactiver un vhost :
sudo a2dissite example.com.conf
sudo apachectl configtest
sudo systemctl reload apache2Code language: CSS (css)
Conclusion
Pour activer un virtual host Apache sur Debian ou Ubuntu, la commande centrale reste simple :
sudo a2ensite example.com.confCode language: CSS (css)
Mais une configuration propre ne s’arrête pas là. Créez un vhost clair, définissez le bon ServerName, séparez les logs, testez avec apachectl configtest, rechargez Apache sans interruption, puis vérifiez avec curl et apachectl -S.
Un virtual host Apache bien nommé, bien testé et bien loggé, c’est un site plus simple à maintenir. Et quand le serveur héberge plusieurs domaines, la simplicité n’est pas un luxe : c’est l’assurance anti-nuit blanche.
Sources
- Apache HTTP Server — Name-based Virtual Host Support
- Apache HTTP Server — Virtual Host documentation
- Ubuntu Manpages — a2ensite, a2dissite
- Apache HTTP Server — apachectl configtest
- Apache HTTP Server — arrêt et redémarrage gracieux
- Apache HTTP Server — SSL/TLS How-To
Votre hébergement est devenu un problème ?
Serveur partagé saturé, limites PHP trop basses, support qui répond en 48h — à un certain niveau de trafic, l'hébergement mutualisé devient le goulot. Je migre et configure des serveurs dédiés.
Parlons de votre infrastructure →

Mise à jour des directives pour Apache 2.4+