Apache : créer et activer un virtual host sur Debian ou Ubuntu

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.

Distingo, le livret à 2%

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 :

  • ServerName définit le domaine principal du site ;
  • ServerAlias ajoute des domaines secondaires, souvent www ;
  • DocumentRoot pointe vers le dossier public du site ;
  • Directory définit les droits Apache sur ce dossier ;
  • ErrorLog et CustomLog sé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/
Distingo, le livret à 2%

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 :

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 :

  1. désactivez le vhost ;
  2. testez Apache ;
  3. rechargez Apache ;
  4. archivez ou supprimez les fichiers du site ;
  5. archivez ou supprimez les logs si nécessaire ;
  6. 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/www ou votre chemin habituel.
  • Créer un fichier .conf dans /etc/apache2/sites-available/.
  • Définir ServerName et ServerAlias.
  • Définir le bon DocumentRoot.
  • Ajouter un bloc Directory avec Require 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

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

1 pensée sur “Apache : créer et activer un virtual host sur Debian ou Ubuntu”

Opinions