Services et serveurs

Apache : Les Virtual Hosts

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

apache_logo



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.

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/

Vous l'aurez compris, tous mes "virtual hosts" vont être des fichiers du style xxx.conf dans /etc/apache2/vhosts.d/

Sur CentOS le fichier se trouve dans /etc/httpd/conf/httpd.conf

On peut placer les vhosts dans un dossier conf aussi en vérifiant la ligne Include conf/vhost.conf



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.

En IPv4, on procédera ainsi :
Code TEXT :
<VirtualHost 192.168.21.100:443>
...
</VirtualHost>


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]