Web Cluster · 6 min read · Oct 08, 2025

Der perfekte Lastenausgeglichene & Hochverfügbarkeits-Webcluster mit 2 Servern, die Xen auf Ubuntu 8.04 Hardy Heron ausführen - Seite 8

14. Spiegeln von Web- und Mail-Dateien mit rsync (web1, web2)

Das ist der knifflige Teil. Je nach Art der Website(s), die Sie im Cluster betreiben möchten, kann die Technik zum Spiegeln von Web-Dateien unterschiedlich sein.

Wir betrachten web1.example.com als den Master, web2.example.com wird mit web1.example.com synchronisiert.

Dies kann in einigen Fällen Probleme verursachen. Wenn Sie eine Website haben, auf der Benutzer Dateien hochladen können, möchten Sie nicht, dass diese auf web2.example.com hochgeladen werden, da die beiden Server nicht synchron sind.

In meinem Fall leite ich alle Seiten, auf denen Benutzer Daten hochladen können, an den HTTP-Port 81 weiter, der nur an einen Server, web1.example.com, weitergeleitet wird. Wenn der Master-Server ausfällt, wird der gesamte Verkehr auf Port 81 an den Fallback-Server, web2.example.com, weitergeleitet und das Spiegeln wird vorübergehend gestoppt.

Die Weiterleitung kann in der Apache vhost.conf erfolgen:

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

Wenn Sie viele Datei-Uploads von Benutzern haben, sollten Sie in Betracht ziehen, ein Lastenausgleichs-NFS zu verwenden:

https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat

14.1 Installieren von rsync

apt-get install rsync

14.2 Erstellen der Schlüssel auf web2.example.com

Jetzt erstellen wir das private/public Schlüssel-Paar auf web2.example.com:

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

Sie werden etwas wie folgt sehen:

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [drücken Sie hier die Eingabetaste]
Enter same passphrase again: [drücken Sie hier die Eingabetaste]
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

Es ist wichtig, dass Sie kein Passwort eingeben, da das Spiegeln sonst ohne menschliches Eingreifen nicht funktioniert. Drücken Sie einfach die Eingabetaste!

Als nächstes kopieren wir unseren öffentlichen Schlüssel nach web1.example.com:

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

Der öffentliche Schlüssel mirror-rsync-key.pub sollte jetzt in /home/vmail auf web1.example.com verfügbar sein.

14.3 Konfigurieren von web1.example.com

web1.example.com

Jetzt melden Sie sich über SSH als vmail (nicht root!) an und tun Sie Folgendes:

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

Damit haben wir den Inhalt von mirror-rsync-key.pub an die Datei /home/vmail/.ssh/authorized_keys angehängt. /home/vmail/.ssh/authorized_keys sollte ähnlich wie folgt aussehen:

(Noch als webmaster! auf web1.example.com)

vi ~/.ssh/authorized_keys

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

Jetzt möchten wir Verbindungen nur von web2.example.com zulassen, und der sich verbindende Benutzer sollte nur rsync verwenden dürfen, also fügen wir hinzu

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

genau am Anfang von /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

Jetzt erstellen wir das Skript /home/vmail/rsync/checkrsync, das alle Befehle außer rsync auf web1.example.com ablehnt.

(Wir tun dies immer noch als vmail!)

mkdir ~/rsync
vi ~/rsync/checkrsync

#!/bin/sh




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

chmod 700 ~/rsync/checkrsync

14.4 Testen von automatisiertem rsync

web2.example.com

Zuerst müssen wir rsync mitteilen, welche Dateien wir nicht synchronisieren möchten (wie munit graph!)

vi /root/exclude_www.txt

und es so aussehen lassen:

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

und jetzt für 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/

Jetzt müssen wir auf web2.example.com testen, ob wir web1.example.com spiegeln können, ohne nach dem Passwort von vmail gefragt zu werden. Wir tun dies:

(Wir tun dies als 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/

gefolgt von:

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/

Sie sollten jetzt sehen, dass das Spiegeln ohne Aufforderung nach einem Passwort erfolgt:

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

14.5 Erstellen eines Cron-Jobs

Zuerst erstellen wir ein Skript, das sicherstellt, dass, falls aus irgendeinem Grund web1.example.com ausfällt, rsync gestoppt wird und root den Prozess manuell neu starten muss.

Der Grund, warum wir dies tun müssen, ist, dass web2.example.com die Kontrolle über web1.example.com für Mail übernehmen wird, wenn es ausfällt. Neue Mails werden dann während dieses Zeitraums auf web2.example.com empfangen, also nehmen wir an, web1.example.com kommt eine Stunde später wieder online, alle neuen Mails während dieses Zeitraums würden auf web2.example.com gelöscht werden wegen des rsync –delete-Befehls. Wir werden weiter unten sehen, wie wir beide Server synchronisieren, falls dies passiert.

Für jetzt lassen Sie uns dieses Skript schreiben.

Auf web2.example.com

vi /root/rsync_web1

#!/bin/bash
# Skript zum rsync von Webdaten und Mail zwischen 2 lastenausgeglichenen Servern
# Copyright (c) 2008 blogama.org
# Dieses Skript ist unter GNU GPL Version 2.0 oder höher lizenziert
# ---------------------------------------------------------------------
### Dieses Skript hat 2 Zwecke ###
### 1) Überprüfen der Verbindung auf Port 25 zum Master-Server und dann rsync Mail ###
### 2) Überprüfen der Verbindung auf Port 80 zum Master-Server und dann rsync www-Daten ###
### Zu ändern ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"

###### Keine Änderungen unten vornehmen ######
### Binaries ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### Zur Wiederherstellung auf Original, wenn das Problem behoben ist ###
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####################
### Wenn bereits über SMTP-Problem informiert, beenden ###
cd /root
if [ -f smtp_down.txt ]; then
  exit 1;
fi
### Überprüfen, ob Server 1 auf SMTP antwortet. Wenn ja, rsync Mail ###
### Wenn Server 1 ausgefallen ist, kann Server 2 nicht mit --delete von Server 1 rsyncen ###
### Muss Server1 mit 2 (kein Löschen) synchronisieren und /root/sync fix ausführen ###
(
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 "Server 1 down. Mail sync funktioniert nicht mehr" > /root/smtp_down.txt
  $MAIL -s "Server 1 down port 25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### Wenn bereits über HTTP-Problem informiert, beenden ###
cd /root
if [ -f http_down.txt ]; then
  exit 1;
fi
### Überprüfen, ob Server 1 auf HTTP antwortet. Wenn ja, rsync www-Daten ###
(
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 "Server 1 down. WWW sync funktioniert nicht mehr" > /root/http_down.txt
  $MAIL -s "Server 1 down port 80" $EMAIL < /root/http_down.txt
fi

Und machen Sie diese Datei ausführbar:

chmod +x /root/rsync_web1

Natürlich können Sie alles, was Sie wollen, in diese Dateien einfügen ;) Wenn Sie keinen Schrägstrich setzen, ignoriert es das Schlüsselwort rekursiv (z. B. *.gz), wenn Sie einen Schrägstrich setzen, ist es für einen bestimmten Ort (z. B. /example/ssl/).

Jetzt fügen wir das Skript zu unserem Crontab hinzu, indem wir Folgendes tun:

crontab -e

und diese Zeile hinzufügen:

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

Dies wird es alle 5 Minuten ausführen, natürlich können Sie das nach Ihren Bedürfnissen ändern.

14.6 Was, wenn web1.example.com ausgefallen ist

Im Allgemeinen, wenn web1.example.com ausgefallen ist, müssen Sie dann:

  1. rsync WEB1 ZU WEB2 ohne –delete-Befehl:

web1.example.com

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

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.