Services et serveurs

Apache : Les Virtual Hosts

Table des matières

apache_logo



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.

La base de cet article est Gentoo, mais en adaptant les chemins, c'est applicable à n’importe quelle distribution.


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/

Sur CentOS, on peut placer les vhosts dans le fichier conf/vhost.conf

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.

Voici un exemple pour ce site www.linuxtricks.fr :

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]
Cette page a été vue 21700 fois