Serveurs Web · 6 min read · Oct 08, 2025

Le cluster web parfaitement équilibré et à haute disponibilité avec 2 serveurs exécutant Xen sur Ubuntu 8.04 Hardy Heron - Page 8

14. Miroir des fichiers web et mail avec rsync (web1, web2)

C’est la partie délicate. Selon le type de site(s) web que vous allez mettre sur le cluster, la technique utilisée pour miroiter les fichiers web peut être différente.

Nous considérerons web1.example.com comme le maître, web2.example.com se synchronisera avec web1.example.com.

Cela peut créer des problèmes dans certains cas. Si vous avez un site web où les utilisateurs peuvent télécharger des fichiers, vous ne voulez pas qu’ils soient téléchargés sur web2.example.com car les deux serveurs ne seront pas synchronisés.

Dans mon cas, je redirige toutes les pages où les utilisateurs peuvent télécharger des données vers le port HTTP 81 qui est uniquement transféré à un serveur, web1.example.com. Si le serveur maître échoue, alors tout le trafic du port 81 est transféré au serveur de secours, web2.example.com et le mirroring est temporairement arrêté.

La redirection peut être effectuée dans apache vhost.conf :

[...]
Redirect /admin http://www.example.com:81/webmail
[...]

Si vous avez beaucoup de téléchargements de fichiers effectués par des utilisateurs, vous pourriez envisager d’utiliser un NFS équilibré :

https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat

14.1 Installer rsync

apt-get install rsync

14.2 Créer les clés sur web2.example.com

Maintenant, nous créons la paire de clés privée/publique sur web2.example.com :

mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key

Vous verrez quelque chose comme ceci :

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /root/rsync/mirror-rsync-key.
Your public key has been saved in /root/rsync/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@web2

Il est important que vous n’entriez pas de phrase de passe sinon le mirroring ne fonctionnera pas sans interaction humaine, donc appuyez simplement sur entrer !

Ensuite, nous copions notre clé publique sur web1.example.com :

scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/vmail/

La clé publique mirror-rsync-key.pub devrait maintenant être disponible dans /home/vmail sur web1.example.com.

14.3 Configurer web1.example.com

web1.example.com

Maintenant, connectez-vous via SSH en tant que vmail (pas root !) et faites ceci :

login vmail

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keys

En faisant cela, nous avons ajouté le contenu de mirror-rsync-key.pub au fichier /home/vmail/.ssh/authorized_keys. /home/vmail/.ssh/authorized_keys devrait ressembler à ceci :

(Toujours en tant que webmaster ! sur web1.example.com)

vi ~/.ssh/authorized_keys

ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@web2

Maintenant, nous voulons autoriser les connexions uniquement depuis web2.example.com, et l’utilisateur se connectant ne devrait être autorisé à utiliser que rsync, donc nous ajoutons

command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty

juste au début de /home/vmail/.ssh/authorized_keys :

command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
web2

Maintenant, nous créons le script /home/vmail/rsync/checkrsync qui rejette toutes les commandes sauf rsync sur web1.example.com.

(Nous faisons toujours cela en tant que vmail !)

mkdir ~/rsync
vi ~/rsync/checkrsync

#!/bin/sh



case "$SSH_ORIGINAL_COMMAND" in
        *\&*)
                echo "Rejected"
                ;;
        *\(*)
                echo "Rejected"
                ;;
        *\{*)
                echo "Rejected"
                ;;
        *\;*)
                echo "Rejected"
                ;;
        *\<*)
                echo "Rejected"
                ;;
        *\`*)
                echo "Rejected"
                ;;
        rsync\ --server*)
                $SSH_ORIGINAL_COMMAND
                ;;
        *)
                echo "Rejected"
                ;;
esac

chmod 700 ~/rsync/checkrsync

14.4 Tester rsync automatisé

web2.example.com

Tout d’abord, nous devons dire à rsync quels fichiers nous ne voulons pas synchroniser (comme munit graph !)

vi /root/exclude_www.txt

et le faire ressembler à ceci :

 /example/web/monit/
 /example/web/monitoring/
 /example/ssl/
 /yoursite/ssl/ 

et maintenant pour le mail :

vi /root/exclude_mail.txt

/rsync/
/.ssh/
#if you use my monitoring script, see next page
server1_was_down/
.bash_history/
.bash_logout/
.bashrc/
.mysql_history/
.profile/
.viminfo/

Maintenant, nous devons tester sur web2.example.com si nous pouvons miroiter web1.example.com sans être invité pour le mot de passe de vmail. Nous faisons cela :

(Nous faisons cela en tant que root !)

web2.example.com

rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_www.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/var/www/ /var/www/

suivi de :

rsync -avz –delete –ignore-errors –exclude-from ‘/root/exclude_mail.txt’ -e “ssh -i /root/rsync/mirror-rsync-key” [email protected]:/home/vmail/ /home/vmail/

Vous devriez maintenant voir que le mirroring a lieu sans être invité pour un mot de passe :

receiving file list ... done
sent 71 bytes  received 643 bytes  476.00 bytes/sec
total size is 64657  speedup is 90.56

14.5 Créer un job cron

Tout d’abord, nous allons créer un script qui s’assurera que si pour une raison quelconque web1.example.com est tombé, rsync sera arrêté et que root devra redémarrer manuellement le processus.

La raison pour laquelle nous devons faire cela est que web2.example.com prendra le relais de web1.example.com pour le mail s’il est tombé. Un nouveau mail sera alors reçu sur web2.example.com pendant cette période, donc disons que web1.example.com revient en ligne une heure après, tout nouveau mail pendant cette période serait supprimé sur web2.example.com à cause de la commande rsync –delete. Nous verrons ci-dessous comment synchroniser à nouveau les deux serveurs si cela se produit.

Pour l’instant, écrivons ce script.

Sur web2.example.com

vi /root/rsync_web1

#!/bin/bash
# Script pour rsync des données web et mail entre 2 serveurs équilibrés
# Copyright (c) 2008 blogama.org
# Ce script est sous licence GNU GPL version 2.0 ou supérieure
# ---------------------------------------------------------------------
### Ce script a 2 objectifs ###
### 1) Vérifier la connexion sur le port 25 au serveur maître puis rsync mail ###
### 2) Vérifier la connexion sur le port 80 au serveur maître puis rsync les données www ###
### À modifier ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"

###### Ne pas faire de modifications ci-dessous ######
### Binaries ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### Pour restaurer à l'original lorsque le problème est résolu ###
if [ $1 ]; then
  if [ $1=="fix" ]; then
    if [ -f smtp_down.txt ]; then
      rm /root/smtp_down.txt
    fi
    if [ -f www_down.txt ]; then
      rm /root/www_down.txt
    fi
  fi
fi
####################SMTP####################
### Si déjà notifié pour problème SMTP, sortir ###
cd /root
if [ -f smtp_down.txt ]; then
  exit 1;
fi
### Vérifier si le serveur 1 répond sur SMTP. Si oui, rsync mail ###
### Si le serveur 1 était tombé, ne peut pas rsync --delete serveur 2 avec 1 ###
### Doit resynchroniser serveur1 avec 2 (sans suppression) et exécuter /root/sync fix ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $SMTPPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  $RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_mail.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $MAILRSYNCUSER@$MASTERSERVERIP:$MAILDIR $MAILDIR
else
  echo "Serveur 1 hors ligne. La synchronisation des mails ne fonctionne plus" > /root/smtp_down.txt
  $MAIL -s "Serveur 1 hors ligne port 25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### Si déjà notifié pour problème HTTP, sortir ###
cd /root
if [ -f http_down.txt ]; then
  exit 1;
fi
### Vérifier si le serveur 1 répond sur HTTP. Si oui, rsync les données www ###
(
echo "quit"
) | $TELNET $MASTERSERVERIP $WEBPORT | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  $RSYNC -avz --delete --ignore-errors --exclude-from '/root/exclude_www.txt' -e "ssh -p $SSHPORT -i /root/rsync/mirror-rsync-key" $WWWRSYNCUSER@$MASTERSERVERIP:$WWWDIR $WWWDIR
else
  echo "Serveur 1 hors ligne. La synchronisation WWW ne fonctionne plus" > /root/http_down.txt
  $MAIL -s "Serveur 1 hors ligne port 80" $EMAIL < /root/http_down.txt
fi

Et rendez ce fichier exécutable :

chmod +x /root/rsync_web1

Bien sûr, vous pouvez mettre ce que vous voulez dans ces fichiers ;) Si vous ne mettez pas de barre oblique, cela ignorera le mot-clé de manière récursive (ex : *.gz), si vous mettez une barre oblique, c’est pour un emplacement précis (ex : /example/ssl/).

Maintenant, nous ajoutons le script à notre crontab en faisant ce qui suit :

crontab -e

et ajoutez cette ligne :

[...]
*/5 * * * * /root/rsync_web1  >/dev/null 2>&1
[...]

Cela l’exécutera toutes les 5 minutes, bien sûr, vous pouvez changer cela selon vos besoins.

14.6 Que faire si web1.example.com était hors ligne

En général, si web1.example.com est hors ligne, vous devez alors :

  1. rsync WEB1 À WEB2 sans la commande –delete :

web1.example.com

rsync -avz [email protected]:/var/www/ /var/www/
rsync -avz [email protected]:/home/vmail/ /home/vmail/

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.