logo banniere

S'il n'y a pas de solution c'est qu'il n'y a pas de problème!


Serveurs virtuels apache



Introduction

Lors de la mise en place de ce serveur, je me suis trouvé face au problème d'héberger plusieurs serveurs web avec Apache (plusieurs noms de domaine pointant vers mon IP).
Et comme, à cette époque cette machine (les puristes diront "l'interface connectée à internet") avait une adresse IP variable (et que ça coûte aujourd'hui une fortune d'avoir une adresse fixe, sauf par Nerim qui n'est pas disponible où j'habite, damned!, correction! c'est du passé, Linux-sottises est depuis passé chez Nerim!!), et bien il a bien fallu "faire quelque chose". C'est l'objet de cette page.
On trouve assez vite la solution des serveurs virtuels, mais après plusieurs tentatives, il m'a semblé qu'il était impossible de faire des serveurs virtuels sans faire figurer l'adresse IP de la machine dans le fichier de conf d'apache httpd.conf avec une version d'apache inférieure ou égale à 1.3.12. Grâce à Regis Lemaire qui m'a aimablement fourni l'information, cela devient possible avec les versions d'apache supérieure ou égale à 1.3.13. Les deux solutions sont exposées ici...mais un conseil: utilisez une version d'apache 1.3.13 ou plus, c'est quand même plus simple!!!

Configuration des serveurs virtuels apache 1.3.13 ou plus

Un fichier exemple vaut mieux que de longs discours. Ci dessous, vous trouverez la partie "serveurs virtuels" du fichier httpd.conf. Il y a pour commencer l'accès à un serveur local par son ip local, puis 3 serveurs virtuels. J'ai séparé les logs des sites, le fichier d'erreur est partagé par tous les serveurs et est déclaré dans le "serveur principal".

NameVirtualHost 192.168.1.1

<VirtualHost 192.168.1.1>
    DocumentRoot /web
    ServerName yoda
    CustomLog /var/log/httpd/yoda-access_log common
</VirtualHost>


NameVirtualHost *

<VirtualHost *>
    DocumentRoot /web
    ServerName linux-sottises.homeip.net
</VirtualHost>

<VirtualHost *>
    DocumentRoot /home/matthieu/WWW
    ServerName matgob.homeip.net
    CustomLog /var/log/httpd/matgob-access_log common
</VirtualHost>

<VirtualHost *>
    DocumentRoot /web/cheztoutou
    ServerName cheztoutou.homeip.net
    CustomLog /var/log/httpd/cheztoutou-access_log common
</VirtualHost>

Configuration des serveurs virtuels apache 1.3.x

Le problème est que vous devez faire figurer le numéro d'ip (dynamique) à l'interieur du fichier httpd.conf et qu'il est nécessaire d'avoir le numéro ip des serveurs virtuels dans /etc/hosts. Je commence par décrire une procédure pas très "élégante" mais efficace, puis j'indiquerai à la fin l'idée fournie par Regis Lemaire qui utilise sed pour faire les manipulations de texte, ce qui est beaucoup plus élégant (un poil plus long).

Vous êtes supposé avoir déjà un serveur apache qui fonctionne correctement, en local, ou déjà sur un nom de domaine.
La "méthode" (c'est un bien grand mot...) employée consiste à reconfigurer les fichiers /etc/hosts et /etc/httpd/httpd.conf quand l'IP change lors d'une reconnexion (si le fichier de configuration d'apache n'est pas dans /etc/httpd, vous devriez savoir où il est, non?)
On commence par fabriquer deux fichiers httpd.conf.trame1 et httpd.conf.trame2 dans le répertoire où est httpd.conf.
httpd.conf.trame1 contient tout le fichier httpd.conf sauf la partie qui concerne les serveurs virtuels et httpd.conf.trame2 contient la partie décrivant les serveurs virtuels.
A titre d'exemple, voici mon fichier httpd.conf.trame2:

<VirtualHost 192.168.1.1>
    DocumentRoot /web
    ServerName yoda
    CustomLog /var/log/httpd/yoda-access_log common
</VirtualHost>

<VirtualHost linux-sottises.homeip.net>
    DocumentRoot /web
    ServerName linux-sottises.homeip.net
</VirtualHost>

<VirtualHost matgob.homeip.net>
    DocumentRoot /home/matthieu/WWW
    ServerName matgob.homeip.net
    CustomLog /var/log/httpd/matgob-access_log common
</VirtualHost>

<VirtualHost cheztoutou.homeip.net>
    DocumentRoot /web/cheztoutou
    ServerName cheztoutou.homeip.net
    CustomLog /var/log/httpd/cheztoutou-access_log common
</VirtualHost>

Quelques commentaires sur cet exemple. Le premier serveur virtuel est le serveur "local" (192.168.1.1 est l'adresse de la machine sur le réseau local). Cela permet d'accéder aux pages du serveur principal sans "sortir" du réseau local.
Les autres serveurs virtuels sont "nommés" et leur adresse sera recherchée dans /etc/hosts. L'ordre DocumentRoot indique l'emplacement des fichiers du serveur, CustomLog me permet d'avoir des logs différentiés suivant les serveurs accédés. (Je n'ai qu'un seul fichier de log d'erreurs qui est déclaré dans le fichier httpd.conf et donc aussi dans httpd.conf.trame1.

Ensuite, créez un fichier /etc/hosts.trame qui est la copie de /etc/hosts sans la partie qui concerne les noms de vos serveurs apache (en fait tout ce qui est fixe dans votre /etc/hosts. Le mien contient:

127.0.0.1  localhost
192.168.1.2  leia
192.168.1.3  skywalker
192.168.1.4  gobelin
192.168.1.5  garfield
10.0.0.138      alcatel
193.252.19.3   dns1
193.252.19.3  dns2
193.252.96.3    netissimo
192.168.1.1      yoda.linux-sottises.homeip.net   yoda
10.0.0.1         yoda.linux-sottises.homeip.net

Maintenant, tout est prêt pour exécuter un script relance_apache qui va fabriquer les "bons httpd.conf et /etc/hosts et qui relancera apache. Quelques explications sur ce script:


#! /bin/sh

LOG=/var/log/adsl
HOSTS=/etc/hosts
HOSTS_TRAME=/etc/hosts.trame
HOSTS_TEMP=/etc/hosts.temp
APACHE=/etc/httpd/httpd.conf
APACHE1=/etc/httpd/httpd.conf.trame1
APACHE2=/etc/httpd/httpd.conf.trame2
APACHE_TEMP=/etc/httpd/httpd.conf.temp

echo starting relance_apache >> $LOG

IP=`cat /usr/local/adsl/pptp.ip`

cp $HOSTS_TRAME $HOSTS_TEMP
echo $IP linux-sottises.homeip.net >> $HOSTS_TEMP
echo $IP cheztoutou.homeip.net >> $HOSTS_TEMP
echo $IP matgob.homeip.net >> $HOSTS_TEMP
cp $HOSTS_TEMP $HOSTS
rm $HOSTS_TEMP

cp $APACHE1 $APACHE_TEMP
echo NameVirtualHost $IP >> $APACHE_TEMP
cat $APACHE2 >> $APACHE_TEMP
cp $APACHE_TEMP $APACHE
rm $APACHE_TEMP

/usr/sbin/rcapache restart >> $LOG

Tout d'abord, je loggue le redémarrage d'apache au même endroit que les messages de connexion adsl, changez la variable LOG si vous le souhaitez.
Les variables APACHE* et HOSTS* donnent l'emplacement des fichiers. Modifiez les pour votre configuration.
le fichier /usr/local/adsl/pptp.ip contient chez moi l'IP public de la machine (à jour au moment où je lance ce script). C'est le script uddns qui remplit ce fichier (voir page adsl). Si vous n'utilisez pas uddns, remplacez la ligne:

IP=`cat /usr/local/adsl/pptp.ip`

par

IP=`/sbin/ifconfig ppp0 | fgrep "inet ad" | cut -f2 -d":" | cut -f1 -d" "`

en vérifiant l'emplacement de ifconfig (vous pouvez aussi "unifier" les scripts avec ceux proposés sur la page adsl, mais je préfère proposer des scripts à peu près autonomes pour ne pas forcer mes aimables visiteurs à se taper tous mes scripts pour en faire fonctionner un seul...c'est un choix)

Le script fabrique ensuite le fichier hosts en lui rajoutant les lignes qui correspondent à vos noms de domaine (mettez les votres!!), puis le fichier httpd.conf en insérant l'ordre NameVirtualHost "numéro d'ip" à la suite du httpd.conf.trame1, puis le fichier httpd.conf.trame2 encore à la suite.
Vient ensuite l'ordre de redémarrage d'apache (là sous suse, adaptez le à votre distribution)

Vous n'avez plus qu'à stocker ce script à un endroit qui vous convient, et lancez le script à la fin de votre procédure de reconnexion en cas de changement d'IP. Chez moi, c'est uddns qui lance relance_apache quand l'IP a changé.

Mise à jour de httpd.conf avec sed

Regis Lemaire a proposé la solution alternative suivante pour mettre à jour le fichier httpd.conf.
Fabriquez un fichier modèle httpd.modele dans lequel il y a IPDYNAMIC à la place de l'ip dans la ligne NameVirtualHost.
Dans un script, la mise à jour du fichier httpd.conf se fait par l'ordre:

sed "s/IPDYNAMIC/$IP/" $HTTPD_MODELE > HTTPD_CONF

où $IP est le numéro IP, $HTTPD_MODELE le chemin du fichier httpd.modele et HTTPD_CONF le chemin de httpd.conf. L'ordre sed va remplacer IPDYNAMIC par la valeur de l'IP et copier le fichier obtenu dans le fichier de configuration d'apache.
Vous pouvez vous en inspirer pour mettre à jour /etc/hosts.


Dernière modification le jeudi 17 avril 2003 à 00:40:46 Paris
Webmaster: TNK
Valid HTML 4.01! Valid CSS! quanta anybrowser suse powered by

linux apache mod_gzip php mysql openssl modssl