Apache : Les Virtual Hosts
Table des matières
Votre serveur ne dispose que d'une seule adresse IP, et de nombreux noms de domaines pointent vers cette adresse dans le DNS?
Vous devez donc utiliser les VirtualHosts pour différencier quel site afficher en fonction de quel nom de domaine.
D'abord, s'assurer que dans le fichier httpd.conf on ait une ligne de ce style :
Grâce à cette ligne, on inclura tous les .conf de /etc/apache2/vhosts.d/
Vous l'aurez compris, tous mes "virtual hosts" vont être des fichiers du style xxx.conf dans /etc/apache2/vhosts.d/
Je reprends mon fichier précédent et vais expliquer les lignes du "Virtual Host" :
Pour les droits, on a :
Voici l'exemple avec 2 VirtualHosts représentant 2 sites hébergés sur la même machine : dev.linuxtricks.fr et marjo21.linuxtricks.fr. On peut avoir autant de VirtualHosts qu'on le souhaite sur une même machine.
Pour me repérer facilement, je nomme chaque fichier nomdedomaine.conf :
Je vais faire simple, je vous montre pour le miroir Calculate Linuxtricks les 2 Virtualhosts configurés (simultanément) afin que vous voyiez les différences (ce qui a été ajouté). A savoir le port d'écoute et les 3 lignes commençant par SSL.
Dans ce cas, l'accès en HTTP reste en HTTP.
L'accès HTTPS reste HTTPS.
Si on souhaite forcer le HTTP vers HTTPS, on ajoute ceci dans le bloc Virtualhost *:80 :
La ligne RewriteCond permet de conserver du HTTP simple pour les requêtes Lets Encrypt (dossier .well-known/acme-challenge à la racine du site).
Si on souhaite ajouter un vhost qui écoute sur un autre port, il suffit d'ajouter une directive listen en plus dans le fichier de configuration du vhost :
Si on dispose de plusieurs adresses IP sur le serveur, on peut avoir besoin de spécifier que le VirtualHost n'écoute sur qu'une adresse IP.
Précédemment, on a vu
Le * signifie toutes les IP.
En IPv4, on procédera ainsi :
En IPv6, on mettra l'IP entre crochets :
Pour ceux qui voudront tester l'accès au VirtualHost en IPv6, il faut taper l'IPv6 entre crochets dans le navigateur internet :
Introduction
Votre serveur ne dispose que d'une seule adresse IP, et de nombreux noms de domaines pointent vers cette adresse dans le DNS?
Vous devez donc utiliser les VirtualHosts pour différencier quel site afficher en fonction de quel nom de domaine.
Configurer httpd.conf
D'abord, s'assurer que dans le fichier httpd.conf on ait une ligne de ce style :
Code BASH :
Include /etc/apache2/vhosts.d/*.conf
Grâce à cette ligne, on inclura tous les .conf de /etc/apache2/vhosts.d/
Vous l'aurez compris, tous mes "virtual hosts" vont être des fichiers du style xxx.conf dans /etc/apache2/vhosts.d/
Création des Virtual Hosts
Explications sur la structure de base
Je reprends mon fichier précédent et vais expliquer les lignes du "Virtual Host" :
Code BASH :
<VirtualHost *:80> # Virtualhost écoutant sur le port 80 ServerName dev.linuxtricks.fr # Nom du serveur auquel le vhost doit répondre ServerAlias dev.linuxtricks.fr # Eventuel alias supplémentaire ServerAdmin webmaster@linuxtricks.fr # Mail du webmaster ErrorLog /var/log/apache2/dev.linuxtricks.fr-error_log # Délocaliser pour ce vhost les logs d'erreur TransferLog /var/log/apache2/dev.linuxtricks.fr-access_log # Délocaliser pour ce vhost les logs d'accès DocumentRoot "/var/www/localhost/htdocs/dev/" # Racile des fichiers du site <Directory "/var/www/localhost/htdocs/dev/"> #Définition des droits d'un répertoire Options Indexes FollowSymLinks # Options choisies AllowOverride All # Permet d'utiliser le htaccess dans un site Require all granted # On autorise tout le monde </Directory> # Fin de la définition des droits </VirtualHost> # Fin de la définition du vhost
Pour les droits, on a :
- Require all denied => Tout refuser
- Require all granted => Tout accepter
- Require host example.org => Accepter example.org
- Require ip 1.2.3.4 => Accepter 1.2.3.4
- Require not ip 1.2.3.4 => Refuser 1.2.3.4
Exemples avec 2 Noms de domaines
Voici l'exemple avec 2 VirtualHosts représentant 2 sites hébergés sur la même machine : dev.linuxtricks.fr et marjo21.linuxtricks.fr. On peut avoir autant de VirtualHosts qu'on le souhaite sur une même machine.
Pour me repérer facilement, je nomme chaque fichier nomdedomaine.conf :
Code BASH :
vi /etc/apache2/vhosts.d/dev.linuxtricks.conf
Code BASH :
<VirtualHost *:80> ServerName dev.linuxtricks.fr ServerAlias dev.linuxtricks.fr ServerAdmin webmaster@linuxtricks.fr ErrorLog /var/log/apache2/dev.linuxtricks.fr-error_log TransferLog /var/log/apache2/dev.linuxtricks.fr-access_log DocumentRoot "/var/www/localhost/htdocs/dev/" <Directory "/var/www/localhost/htdocs/dev/"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Code BASH :
vi /etc/apache2/vhosts.d/marjo21.linuxtricks.conf
Code BASH :
<VirtualHost *:80> ServerName marjo21.linuxtricks.fr ServerAlias marjo21.linuxtricks.fr ServerAdmin webmaster@linuxtricks.fr ErrorLog /var/log/apache2/marjo21.linuxtricks.fr-error_log TransferLog /var/log/apache2/marjo21.linuxtricks.fr-access_log DocumentRoot "/var/www/localhost/htdocs/marjo21/" <Directory "/var/www/localhost/htdocs/marjo21/"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Et pour du SSL ?
Je vais faire simple, je vous montre pour le miroir Calculate Linuxtricks les 2 Virtualhosts configurés (simultanément) afin que vous voyiez les différences (ce qui a été ajouté). A savoir le port d'écoute et les 3 lignes commençant par SSL.
Accès au site en HTTP et HTTPS
Code BASH :
<VirtualHost *:80> DocumentRoot /home/miroir/public_html/ ServerName miroir.linuxtricks.fr ServerAdmin adrien.d@mageialinux-online.org ErrorLog /var/log/httpd/miroir.linuxtricks.fr-error_log TransferLog /var/log/httpd/miroir.linuxtricks.fr-access_log ServerSignature Off <Directory /home/miroir/public_html> Options Indexes +FollowSymLinks AllowOverride All </Directory> </VirtualHost> <VirtualHost *:443> DocumentRoot /home/miroir/public_html/ ServerName miroir.linuxtricks.fr ServerAdmin adrien.d@mageialinux-online.org ErrorLog /var/log/httpd/miroir.linuxtricks.fr-error_log TransferLog /var/log/httpd/miroir.linuxtricks.fr-access_log ServerSignature Off SSLEngine on SSLCertificateFile /etc/letsencrypt/live/miroir.linuxtricks.fr/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/miroir.linuxtricks.fr/privkey.pem <Directory /home/miroir/public_html> Options Indexes +FollowSymLinks AllowOverride All </Directory> </VirtualHost>
Dans ce cas, l'accès en HTTP reste en HTTP.
L'accès HTTPS reste HTTPS.
Forcer le HTTP en HTTPS
Si on souhaite forcer le HTTP vers HTTPS, on ajoute ceci dans le bloc Virtualhost *:80 :
Code BASH :
RewriteEngine On RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/ RewriteRule (.*) https://www.linuxtricks.fr$1 [R=301,L]
La ligne RewriteCond permet de conserver du HTTP simple pour les requêtes Lets Encrypt (dossier .well-known/acme-challenge à la racine du site).
Ecouter sur plusieurs ports
Si on souhaite ajouter un vhost qui écoute sur un autre port, il suffit d'ajouter une directive listen en plus dans le fichier de configuration du vhost :
Code BASH :
Listen 8080 <VirtualHost *:8080> #Le contenu du vhost </VirtualHost>
Les Virtualhosts qui doivent écouter que sur une seule IP
Si on dispose de plusieurs adresses IP sur le serveur, on peut avoir besoin de spécifier que le VirtualHost n'écoute sur qu'une adresse IP.
Précédemment, on a vu
Code TEXT :
<VirtualHost *:443> ... </VirtualHost>
Le * signifie toutes les IP.
Filtrer avec une seule IPv4
En IPv4, on procédera ainsi :
Code TEXT :
<VirtualHost 192.168.21.100:443> ... </VirtualHost>
Filtrer avec une seule IPv6
En IPv6, on mettra l'IP entre crochets :
Code TEXT :
<VirtualHost [fe80::225:64ff:feb4:44fe]:443> ... </VirtualHost>
Pour ceux qui voudront tester l'accès au VirtualHost en IPv6, il faut taper l'IPv6 entre crochets dans le navigateur internet :
Code TEXT :
https://[fe80::225:64ff:feb4:44fe]