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@web2Es 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@web2Jetzt 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-ptygenau 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@
web2Jetzt 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"
;;
esacchmod 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.5614.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
fiUnd 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:
- 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/
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.