Apache : Les Virtual Hosts
Table des matières
Votre serveur ne dispose que d'une seule adresse IP, et de nombreux alias (CNAMES) pointent vers cette adresse dans le DNS. Pour l'exemple, dev.linuxtricks.fr et marjo21.linuxtricks.fr doivent tourner sur cette machine mais dans 2 racines de sites différents.
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/
Voici l'exemple de mon site de développement : dev.linuxtricks.fr
Pour me repérer facilement, le fichier est nomdedomaine.conf :
Et le deuxième :
Je reprends mon fichier précédent et vais expliquer les lignes du "Virtual Host" :
Pour les droits, on a :
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 (pointant sur le 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 alias (CNAMES) pointent vers cette adresse dans le DNS. Pour l'exemple, dev.linuxtricks.fr et marjo21.linuxtricks.fr doivent tourner sur cette machine mais dans 2 racines de sites différents.
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
Voici l'exemple de mon site de développement : dev.linuxtricks.fr
Pour me repérer facilement, le fichier est 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>
Et le deuxième :
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>
Explications
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
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.
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.
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 (pointant sur le 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 écoutant que sur une 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]