|
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. |