GoldZone Web Hosting

Rédigé par Gaëtan Trellu (goldyfruit)

Outils pour utilisateurs

Outils du site


virtualhost_dynamique

Utilisation des virtualhosts dynamiques.

Elle permet une gestion beaucoup plus simple que les virtualhosts basiques quand une grande quantité de sites est à gérer, elle a aussi le plus de ne pas avoir à relancer Apache après l'ajout d'un site web par exemple.
L'utilité de cette méthode est que vous n'avez presques rien à faire, en effet il suffit simplement de créer un répertoire racine portant le même nom que le nom de domaine (ou sous-domaine).

Exemple :

Pour le site "la-maman-de.marcel.com" on créé un répertoire "la-maman-de.marcel.com" dans "/var/www/".

Il n'y a rien d'autre à faire !! En tapant http://la-maman-de.marcel.com dans un navigateur vous y accédez directement.

Il est préférable de désactiver le virtualhost default créé par Apache lors de l'installation.
Pour se faire :

# a2dissite default

Le module vhost_alias doit être chargé pour que la prise en charge de ce type de virtualhost soit effective.

# a2enmod vhost_alias

Puis on relance Apache :

# /etc/init.d/apache2 reload

Virtualhost dynamique.

NameVirtualHost *:80
<VirtualHost *:80>
 
        LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i \" \"%{forensic-id}n\" %v" combinedvhost
        CustomLog "/var/log/apache2/access.log" combined
        CustomLog "| /usr/sbin/split-logfile" combinedvhost
 
        VirtualDocumentRoot /var/www/%0
        VirtualScriptAlias /var/www/%0/cgi-bin
 
</VirtualHost>

Explications :

LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i \" \"%{forensic-id}n\" %v" combinedvhost

Format de log pour les virtualhost dynamiques, l'option la plus importante ici est le %V écrit l'adresse d'accès au site en début de ligne et qui permet donc de découper les logs par site web.
Nous verrons ça un peu plus bas.
Le %V doit être placé au début.

CustomLog "/var/log/apache2/access.log" combined

Permet d'avoir un référencement de tous les accès au serveur web dans un seul fichier, pratique pour des statistiques globales par exemple. Attention ce fichier peut devenir assez gros.

CustomLog "| /usr/sbin/split-logfile" combinedvhost

Ici c'est une directive un peu spéciale, elle fait appelle à la commande split-logfile pour séparer les logs.

VirtualDocumentRoot /var/www/%0

C'est ici que commence le vrai pouvoir des virtualhosts dynamiques, cette variable indique le chemin vers les répertoires contenant les sites web.

Jusque-là rien de bien nouveau mais le c'est le %0 qui change toute la donne, en effet %0 sera égal l'adresse du site tapée dans la barre d'adresse de votre navigateur. Si le répertoire égal à l'adresse du site n'existe pas alors une erreur 404 apparaîtra.

VirtualScriptAlias /var/www/%0/cgi-bin

Si vous souhaitez utiliser des scripts .py .pl .cgi alors il vous faut cette ligne. Les scripts devront se trouver dans le répertoire /var/www/marcel.com/cgi-bin/ pour qu'ils puissent être exécutés.

Pour plus d'informations sur les directives utilisées allez jeter un oeil ici : [utilisation_des_virtualhosts_basiques]].

split-logfile

Fournit avec le paquet apache2-utils, split-logfile permet de séparer (split) les logs par nom de domaine.
split-logfile est un script écrit en Perl.

Quand vous accédez à un site, Apache générera un log. split-logfile va analyser la sortie de ce log pour ensuite créer un fichier du même nom que l'adresse du site web.

Comme indiqué plus haut, la directive suivante :

CustomLog "| /usr/sbin/split-logfile" combinedvhost

Permet de séparer les logs directement lors d'un accès aux sites.

/usr/sbin/split-logfile

Indique le chemin vers la commande split-logfile.

combinedvhost

C'est le nom du format de log que nous avons créé.

En fouinant sur la sérapation de logs, je suis tombé sur une modification du script split-logfile intéressante. Celle-ci permet de séparer les logs en supprimant le préfixe www. ainsi que de les envoyer directement dans un répertoire de destination (/var/www/logs/) par exemple.

Pour modifier le script split-logfile utilisez un éditeur de texte, le fichier se trouve dans le répertoire /usr/sbin/

#!/usr/bin/perl
 
use POSIX qw(strftime);
 
while (<STDIN>) {
    #
    # Get the first token from the log record; it's the
    # identity of the virtual host to which the record
    # applies.
    #
    ($vhost) = split /\s/;
 
    $vhost =~ s/www.//;
   ####/////// I added the above, this strips out the "www." from any urls we are logging
   ####/////// IE, www.awebsitewehost versus awebsitewehost
   ####/////// This is necessary to prevent two different sets of logfiles (one for the www.site, one for site)
   ####/////// from being created
   ####/////// { created by wump of cheesepie.org }
    #
    # Normalize the virtual host name to all lowercase.
    # If it's blank, the request was handled by the default
    # server, so supply a default name.  This shouldn't
    # happen, but caution rocks.
    #
    $vhost = lc ($vhost) or "access";
    #
 
    s/VLOG=(.*)[\/]*$//;
    $logs=$1;
    if($logs eq "") {$logs="/var/www/logs";}
      ####/////// Be sure to edit the $logs value above to reflect the place you want your logs created in
      ####/////// for my server, I use $logs=/var/log/apache2-vhost so that all virtualhost logs appear as
      ####/////// /var/log/apache2-vhost/$site.log
             ####/////// { created by wump of cheesepie.org }
 
 
      #$date=strftime("%Y-%m", localtime());
      ####/////// $filename used to have $date in it, but I removed it. I wanted my system's logrotate.d to
      ####/////// handle log rotations without regard to the month/year the log was created in.
        ####/////// { created by wump of cheesepie.org }
 
 
      $filename="${logs}/${vhost}.log";
 
    if (-l $filename) {
        die "File $filename is a symlink, writing too dangerous, dying!\n";
    }
    open LOGFILE, ">>$filename"
            or die ("Can't open $filename");
    #
    # Strip off the first token (which may be null in the
    # case of the default server), and write the edited
    # record to the current log file.
    #
    s/^\S*\s+//;
    print LOGFILE $_;
    close(LOGFILE);
}
 
exit(0);

La ligne à changer pour le chemin de destination des logs est la suivante :

if($logs eq "") {$logs="/var/www/logs";}

Remplacez /var/www/logs par le chemin de votre choix.
La source du script (plus disponible) : http://cheesepie.org/index.php?showtopic=1254

virtualhost_dynamique.txt · Dernière modification: 2011/01/05 16:05 (modification externe)