Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Configuration d'hôtes virtuels sur Apache avec support automatique des sous-domaines, du SSL et de l'authentification

Les hôtes virtuels du serveur web Apache permettent d'héberger plusieurs domaines sur la même IP. Le champ Host: de la requête HTTP détermine l'hôte virtuel qui devra traiter la requête.

La génération automatique des domaines est utile si les <VirtualHost> sont nombreux et sensiblement les mêmes, par exemple :

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
  ServerName www.customer-1.com
  DocumentRoot /www/hosts/www.customer-1.com/docs
  ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin
</VirtualHost>

<VirtualHost 111.22.33.44>
  ServerName www.customer-2.com
  DocumentRoot /www/hosts/www.customer-2.com/docs
  ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin
</VirtualHost>

<VirtualHost 111.22.33.44>
  ServerName www.customer-N.com
  DocumentRoot /www/hosts/www.customer-N.com/docs
  ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin
</VirtualHost> 

L'idée de base est de remplacer la configuration <VirtualHost> statique par un mécanisme dynamique. Ainsi,

  • Le fichier de configuration est plus petit
  • Ajouter des serveurs virtuels revient à créer les répertoires appropriés dans le système de fichiers et les entrées dans le DNS sans reconfigurer ni redémarrer Apache.

Un hôte virtuel est défini par :

  • son adresse IP
  • et le contenu de l'entête Host: de la requête HTTP.

Pour cela, cette information est insérée dynamiquement dans le chemin d'accès du fichier utilisé pour satisfaire la demande.

Pré-requis

Il faut activer le module mod_vhost_alias par :

USER@MACHINE:~$ sudo a2enmod vhost_alias

Première étape

Pour rendre dynamique un hôte virtuel, il faut modifier :

  • UseCanonicalName Off → le nom du serveur est fourni par l'entête Host: de la requête. Si Apache ne trouve pas nom du serveur, c'est la valeur configurée avec ServerName qui est utilisée
  • DocumentRoot

Hôte virtuel dynamique simple

  1. Cet extrait met en œuvre un hôte virtuel simple, mais d'une façon générique à l'aide de mod_vhost_alias :
    /etc/apache2/sites-available/monsite.tld.conf
    ...
        # obtenir le nom du serveur à partir de l'en-tête Host:
        UseCanonicalName Off
        
        # ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
        LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
        CustomLog logs/access_log vcommon
        
        # inclure le nom du serveur dans les noms de fichiers
        VirtualDocumentRoot /www/hosts/%0/docs
        VirtualScriptAlias /www/hosts/%0/cgi-bin
    ...

    Le nom du serveur qui est inséré dans le nom de fichier est déduit de l'adresse IP de l'hôte virtuel.

  2. Un serveur de pages d'accueil virtuel : c'est une adaptation du système ci-dessus pour créer des pages d'accueil. Des sous-chaînes du nom du serveur sont utilisées dans le nom du fichier de sorte que, par exemple les documents pour www.user.isp.com se trouvent dans /home/user/.
    ...
        # obtenir le nom du serveur à partir de l'en-tête Host:
        UseCanonicalName Off
      
        # ce format de journal peut être divisé par hôte virtuel sur la base du premier champ
        LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
        CustomLog logs/access_log vcommon
    
        # include part of the server name in the filenames
        VirtualDocumentRoot /www/hosts/%2/docs
    
        # single cgi-bin directory
        ScriptAlias /cgi-bin/ /www/std-cgi/
  3. Serveur virtuel basé sur l'IP plus efficace : Amélioration des hôtes virtuels dynamiques simples. Pour éviter la recherche DNS pour transformer un nom en une adresse IP, on peut se baser sur les adresses IP elles-mêmes plutôt que sur les noms correspondants
        # obtenir le nom du serveur à partir du reverse DNS de l'adresse IP
        UseCanonicalName DNS
        
        # inclure l'adresse IP dans les journaux afin qu'ils puissent être scindés
        LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
        CustomLog logs/access_log vcommon
        
        # inclure l'adresse IP dans les noms de fichiers
        VirtualDocumentRootIP /var/www/html/hosts/%0/docs
        VirtualScriptAliasIP /var/www/html/hosts/%0/cgi-bin

Plus d'un hôte virtuel sur le même serveur

Par exemple, une adresse IP pour les pages d'accueil des clients les et un autre pour les commerciaux avec :

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon

<Directory /var/www/html/commercial>
    Options FollowSymLinks
    AllowOverride All
</Directory>

<Directory /var/www/html/homepages>
    Options FollowSymLinks
    AllowOverride None
</Directory>

<VirtualHost 111.22.33.44>
    ServerName www.commercial.isp.com
  
    CustomLog logs/access_log.commercial vcommon
  
    VirtualDocumentRoot /var/www/html/commercial/%0/docs
    VirtualScriptAlias /var/www/html/commercial/%0/cgi-bin
</VirtualHost>

<VirtualHost 111.22.33.45>
    ServerName www.homepages.isp.com
  
    CustomLog logs/access_log.homepages vcommon
  
    VirtualDocumentRoot /var/www/html/homepages/%0/docs
    ScriptAlias /cgi-bin/ /var/www/html/std-cgi/
</VirtualHost>

  1. Sous-domaines par nom : pour chaque domaine, on crée un fichier /etc/apache2/sites-available/domaineX.com
    1. en local, sous-domaines du localhost : Exemple : sous-domaine doc.localhost, accessible localement sur le PC lui-même (localhost) ; cela permet de tester le serveur. Pour cela,
      • déclarer doc.localhost dans le fichier hosts : éditez avec les droits d'administration le fichier /etc/hosts pour lui ajouter la ligne :
        /etc/hosts
        127.0.0.1    doc.localhost
      • Créez avec les droits d'administration le fichier /etc/apache2/sites-available/doc.localhost :
        /etc/apache2/sites-available/doc.localhost
        ServerAdmin	administrateur@domaine.fr
        UseCanonicalName Off
        LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
        CustomLog logs/access_log vcommon
        
        <VirtualHost *:80>
        	ServerName	doc.localhost
        	DocumentRoot	/home/<USER>/www/doc
        </VirtualHost>
    2. sur le web : sous-domaines d'un domaine : pour créer doc.mondomaine.com, sous-domaine de mondomaine.com,
      doc.mondomaine.com
      ServerAdmin	administrateur@domaine.fr
      UseCanonicalName Off
      LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
      CustomLog logs/access_log vcommon
      
      <VirtualHost *:80>
      	ServerName	doc.mondomaine.com
      	DocumentRoot	/home/<USER>/www/doc
      </VirtualHost>
      <VirtualHost *:80>
      	ServerName	localhost
      	ServerAlias	*.localhost
      #	DocumentRoot	/home/nicolas/www
      	VirtualDocumentRoot /home/nicolas/www/%-2
      </VirtualHost>
      
      #<VirtualHost *:80>
      #	ServerName	cloud.localhost
      #	DocumentRoot	/home/nicolas/www/cloud
      #</VirtualHost>
  2. Voici un exemple d'organisation :
    • config → Contiendra toute la configuration “magique”:
      • auth → liens symboliques vers les sous-domaines (subdir*) nécessitant une authentification.
      • ssl → liens symboliques vers les sous-domaines (subdir*) nécessitant un accès SSL.
    • logs → logs d'accès et logs d'erreur pour le domaine concerné
    • www → racine de l'arborescence web où se trouveront nos pages et scripts éventuels et les sous-domaines (subdir*).
      mondomaine.tld/
      |-- config
      |   |-- auth
      |   `-- ssl
      |-- logs
      |   |-- access.log
      |   `-- error.log
      `-- www
          |-- subdir1
          |-- subdir2
          |-- subdir3
          `-- subdir4
  3. Configuration du domaine mondomaine.com :
    1. Pour ce domaine, nous créons les 2 configurations suivantes dans le fichier /etc/apache2/sites-available/mondomaine.com
      # Configuration HTTP du domaine mondomaine.com
      <VirtualHost *:80>
              ServerName mondomaine.com
              ServerAlias *.mondomaine.com
              ServerAlias *.mondomaine.net
              ServerAlias *.mondomaine.fr
              ServerAlias *.mondomaine.eu
              ServerAlias *.mondomaine.info
      
              ServerAdmin webmaster@mondomaine.com
      
              DocumentRoot /var/www/mondomaine.com/www/
              <Directory />
                      Options FollowSymLinks
                      AllowOverride None
              </Directory>
              <Directory /var/www/mondomaine.com/www/>
                      Options FollowSymLinks
                      AllowOverride none
                      Order allow,deny
                      allow from all
              </Directory>
      
      ########## Log Directives
              ErrorLog /var/www/mondomaine.com/logs/error.log
              CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
      </VirtualHost>
      
      # Configuration HTTPS du domaine mondomaine.com
      <VirtualHost *:443>
              ServerName mondomaine.com
              ServerAlias *.mondomaine.com
              ServerAlias *.mondomaine.net
              ServerAlias *.mondomaine.fr
              ServerAlias *.mondomaine.eu
              ServerAlias *.mondomaine.info
      
              ServerAdmin webmaster@mondomaine.com
      
              DocumentRoot /var/www/mondomaine.com/www/
              <Directory />
                      Options FollowSymLinks
                      AllowOverride None
              </Directory>
              <Directory /var/www/mondomaine.com/www/>
                      Options FollowSymLinks
                      AllowOverride none
                      Order allow,deny
                      allow from all
              </Directory>
      
      ########## Log Directives
              ErrorLog /var/www/mondomaine.com/logs/error.log
              CustomLog /var/www/mondomaine.com/logs/access.log vhost_combined
      
      ########## SSL Directives
              SSLEngine on
              SSLCertificateFile /var/www/mondomaine.com/config/mondomaine.com.pem
              SSLCertificateKeyFile /var/www/mondomaine.com/config/mondomaine.com.pem
              SSLCACertificateFile /var/www/mondomaine.com/config/ca.crt
      </VirtualHost>
    2. Activation du domaine mondomaine.com :

      USER@MACHINE:~$ sudo a2ensite mondomaine.com

    3. Redémarrage d'Apache :

      USER@MACHINE:~$ /etc/init.d/apache restart

  4. Cas du vhost par défaut : Pour gérer le cas d'une requête à destination d'un domaine qui n'est pas hébergé, un vhost par défaut est défini. Il est défini en premier
    1. Créer un fichier /etc/apache2/site-available/0000-default en y ajoutant la configuration suivante :
      /etc/apache2/site-available/0000-default
      NameVirtualHost *:80
      NameVirtualHost *:443
      <VirtualHost *:80>
              RewriteEngine on
              RewriteRule ^/(.*) http://www.mondomaine.com/$1 [R=301,L]
      </VirtualHost>

      On redirige tout le trafic vers le “vrai” domaine. Par exemple, toute requête vers http://ip_du_serveur, traitée par ce vhost, sera visiteur redirigée vers http://www.mondomaine.com/

    2. On active le vhost :

      USER@MACHINE:~$ a2ensite 0000-default

  5. Règles de comportement : Nous souhaitons héberger le domaine mondomaine.com.
    1. Nous devons rediriger mondomaine.com vers www.mondomaine.com.
    2. Nous voulons pouvoir obtenir, le plus simplement possible, différents sous-domaines. Par exemple :
      • blog.domaine.com doit être accessible en HTTP ou en SSL. L'authentification est gérée par l'application elle-même.
      • webmail.domaine.com doit être obligatoirement en SSL. L'authentification est gérée par l'application elle-même.
      • protected.domaine.com ne sera accessible qu'après authentification, mais l'accès n'est pas forcé en SSL.
      • maitredumonde.domaine.com ne sera accessible qu'après authentification, mais l'accès est en plus forcé en SSL.
    3. Comme nous avons également loué le domaine mondomaine.fr, il faut que les 2 pointent sur le même espace d'hébergement.
    4. En ce qui concerne les alias de domaines (différentes extensions tld), il est nécessaire de modifier la configuration du vhost en ajoutant les directives ServerAlias. En effet, les domaines n’apparaissant ni en ServerName, ni en ServerAlias seront traités par le vhost par défaut.
  6. Utilisation des virtualhosts

Autres étapes

Conclusion

Problèmes connus

Voir aussi

Navigation
  • Pages :
    • créer :
QR Code
QR Code Configuration d&#039;hôtes virtuels sur Apache avec support automatique des sous-domaines, du SSL et de l&#039;authentification (generated for current page)