Apache : sites virtuels
Un site virtuel (VirtualHost) permet d’héberger plusieurs noms de domaine sur un même serveur. Les exemples utilisent des noms génériques.
Site statique
Section intitulée « Site statique »/etc/apache2/sites-available/exemple.com.conf :
<VirtualHost *:80> ServerName exemple.com ServerAlias www.exemple.com DocumentRoot /var/www/exemple.com
<Directory /var/www/exemple.com> Options -Indexes AllowOverride None Require all granted </Directory>
ErrorLog ${APACHE_LOG_DIR}/exemple.com.error.log CustomLog ${APACHE_LOG_DIR}/exemple.com.access.log combined</VirtualHost>sudo a2ensite exemple.comsudo apache2ctl configtest && sudo systemctl reload apache2Plusieurs sites sur le même serveur
Section intitulée « Plusieurs sites sur le même serveur »Un fichier par site, avec son propre ServerName :
<VirtualHost *:80> ServerName blog.exemple.com DocumentRoot /var/www/blog</VirtualHost>
<VirtualHost *:80> ServerName boutique.exemple.com DocumentRoot /var/www/boutique</VirtualHost>Apache choisit le site d’après l’en-tête Host de la requête. Les DNS de chaque nom doivent pointer vers le serveur. sudo apache2ctl -S affiche les sites reconnus et leur ordre.
Redirections
Section intitulée « Redirections »# www vers le domaine nu<VirtualHost *:80> ServerName www.exemple.com Redirect permanent / http://exemple.com/</VirtualHost>
# Dans le site : une ancienne page vers une nouvelleRedirect permanent /ancienne-page /nouvelle-page
# Un dossier entier, en conservant la suite du cheminRedirectMatch permanent "^/ancien/(.*)$" "/nouveau/$1"| Mot-clé | Code |
|---|---|
permanent |
301, redirection permanente |
temp (défaut) |
302, redirection temporaire |
La redirection de HTTP vers HTTPS est décrite dans HTTPS et certificats.
Pages d’erreur personnalisées
Section intitulée « Pages d’erreur personnalisées »ErrorDocument 404 /404.htmlErrorDocument 500 /erreur.htmlErrorDocument 503 "Service momentanément indisponible"Le code de réponse reste 404 : bon pour le référencement.
Application monopage (SPA)
Section intitulée « Application monopage (SPA) »FallbackResource renvoie une page unique pour toute URL qui ne correspond à aucun fichier :
<Directory /var/www/application> Require all granted FallbackResource /index.html</Directory>Pour une application avec des fichiers statiques qui doivent rester des 404 :
<Directory /var/www/application> Require all granted FallbackResource /index.html</Directory><Directory /var/www/application/assets> FallbackResource disabled</Directory>Alternative avec le module rewrite (sudo a2enmod rewrite) :
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^ /index.html [L]Lister le contenu d’un dossier
Section intitulée « Lister le contenu d’un dossier »<Directory /var/www/fichiers> Options +Indexes IndexOptions FancyIndexing HTMLTable NameWidth=* SuppressDescription Require all granted</Directory>Servir un dossier hors de DocumentRoot
Section intitulée « Servir un dossier hors de DocumentRoot »Alias /images /srv/images<Directory /srv/images> Require all granted</Directory>Sans le bloc <Directory>, l’accès est refusé (403) : Ubuntu refuse le système de fichiers par défaut.
Site PHP avec PHP-FPM
Section intitulée « Site PHP avec PHP-FPM »sudo apt install php-fpmsudo a2enmod proxy_fcgi setenvifls /etc/apache2/conf-available | grep php # php8.3-fpm.conf (24.04), php8.5-fpm.conf (26.04)sudo a2enconf php8.3-fpm # adapter à la version installéesudo apache2ctl configtest && sudo systemctl reload apache2Ou dans le site :
<FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"</FilesMatch>DirectoryIndex index.php index.html définit les fichiers d’index.
Site par défaut
Section intitulée « Site par défaut »Apache répond aux noms inconnus avec le premier site chargé (par ordre alphabétique des fichiers : 000-default.conf). Pour ne servir aucun contenu :
<VirtualHost *:80> ServerName inconnu.invalid <Location /> Require all denied </Location></VirtualHost>Le préfixe 000- garantit que ce site est lu en premier.
Tester un site sans DNS
Section intitulée « Tester un site sans DNS »curl -I -H "Host: exemple.com" http://127.0.0.1/curl --resolve exemple.com:80:127.0.0.1 http://exemple.com/Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
| Le mauvais site s’affiche | ServerName ou ServerAlias incorrect ; sudo apache2ctl -S |
403 Forbidden |
Require all granted manquant, droits (www-data), ou pas de fichier d’index avec -Indexes |
404 sur des routes d’application monopage |
Ajouter FallbackResource /index.html |
AH00112: Warning: DocumentRoot [...] does not exist |
Dossier inexistant : le créer |
| PHP s’affiche en texte brut | proxy_fcgi ou la configuration php-fpm non activés |
503 Service Unavailable avec PHP |
Service PHP-FPM arrêté (systemctl status php8.3-fpm) ou mauvais socket |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Documentation : Virtual Hosts
- Suite : Reverse proxy