Spiegele Deine Web Site mit rsync

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

Diese Anleitung zeigt, wie Du Deine Web Site von Deinem Haupt-Web-Server auf einen Backup Server spiegeln kannst, der übernimmt, wenn der Hauptserver ausfällt. Dafür verwenden wir das rsync Tool. Wir lassen es durch einen Cron Job laufen, der jede beliebige Minute überprüft, ob es auf dem Spiegel etwas zu aktualisieren gibt. Auf diese Weise sollte Dein Backup Server up-to-date sein, wenn er übernehmen muss.

rsync aktualisiert nur die Dateien, die sich geändert haben. Du brauchst also nicht jedes Mal, wenn Du rsync laufen lässt, 5 GB Daten transferieren. Es werden nun neue/veränderte Dateien gespiegelt. Es können auch Dateien vom Spiegel gelöscht werden, die auf dem Haupt-Server gelöscht wurden. Weiterhin können Berechtigungen und Eingentümerschaften von gespiegelten Dateien und Verzeichnissen bewahrt werden; um die Eigentümerschaften zu bewahren, müssen wir rsync als Root laufen lassen, was wir hier auch tun. Wenn sich Berechtigungen und/oder Eigentümerschaften auf dem Haupt-Server ändern, wird rsync sie auch auf dem Backup Server ändern.

In dieser Anleitung werden wir rsync durch SSH leiten, was sicherer ist; es bedeutet außerdem, dass Du für rsync keinen weiteren Port in Deiner Firewall öffnen musst – es reicht, wenn Port 22 (SSH) geöffnet ist. Das Problem ist, dass SSH ein Passwort für das Login benötigt, was nicht gut ist, wenn Du rsync als einen Cron Job laufen lassen möchtest. Ein Passwort bedeutet menschliche Interaktion, die wir hier allerdings nicht wollen.

Erfreulicherweise gibt es eine Lösung: Die Verwendung von public keys. Wir erstellen ein Paar keys (auf unserem Backup Server mirror.example.com), von denen einer in einer Datei auf dem entfernten System gespeichert ist (server1.example.com). Danach werden wir nicht mehr nach einem Passwort aufgefordert wenn wir rsync laufen lassen. Dies schließt Cron Jobs mit ein und das ist genau das, was wir wollen.

Wie Du vielleicht schon erraten hast, ist der Plan, dass wir die Spiegelung von server1.example.com direkt von mirror.example.com aus initiieren; server1.example.com muss nichts unternehmen um gespiegelt zu werden.

Ich werde hier das folgende Setup verwenden:

  • Haupt-Server: server1.example.com (server1) – IP Adresse: 192.168.0.100
  • Spiegel/Backup Server: mirror.example.com (mirror) – IP Adresse: 192.168.0.175
  • Die Web Site, die gespiegelt werden soll, ist in /var/www on server1.example.com.

rsync spiegelt nur Dateien und Verzeichnisse; wenn Du Deine MySQL Datenbank spiegeln möchtest, sieh Dir bitte folgende Anleitungen an:

An dieser Stelle möchte ich darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Varianten dieses Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktionieren wird!

1 Installiere rsync

Zuerst müssen wir rsync sowohl auf server1.example.com als auch auf mirror.example.com installieren. Für Debian Systeme sieht dies wie folgt aus:

server1/mirror:

(Wir führen dies aus Rootanwender aus!)

apt-get install rsync

Auf anderen Linux Distributionen würdest Du yum (Fedora/CentOS) oder yast (SuSE) verwenden um rsync zu installieren.

2 Erstelle Einen Unprivilegierten Benutzer Auf server1.example.com

Nun erstellen wir einen unprivilegierten Benutzer namens someuser auf server1.example.com, der von rsync auf mirror.example.com genutzt wird um das Verzeichnis /var/www (natürlich muss someuser Leseberechtigungen in /var/www auf server1.example.com haben) zu speichern.

server1:

(Wir führen dies aus Rootanwender aus!)

useradd -d /home/someuser -m -s /bin/bash someuser

Dies erstellt den Benutzer someuser mit dem Home Verzeichnis /home/someuser und der Login Shell /bin/bash (es ist wichtig, dass someuser eine gültige Login Shell hat – etwas wie /bin/false funktioniert nicht!). Gib nun someuser ein Passwort:

passwd someuser

3 rsync Testen

Als Nächstes testen wir rsync auf mirror.example.com. Als Rootanwender führen wir Folgendes aus:

mirror:

rsync -avz -e ssh someuser@server1.example.com:/var/www/ /var/www/

Du solltest etwas ähnliches wie das sehen. Antworte mit yes:

The authenticity of host 'server1.example.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?

<– yes

Gib dann someusers Passwort ein und Du siehst, dass server1.example.coms /var/www Verzeichnis zu /var/www auf mirror.example.com gespiegelt wird.

Du kannst dies auf beiden Servern wie folgt überprüfen:

server1/mirror:

ls -la /var/www

Du müsstest feststellen, dass alle Dateien und Verzeichnisse auf mirror.example.com gespiegelt wurden. Die Dateien und Verzeichnisse sollten die gleichen Berechtigungen/Eigentümerschaften wie auf server1.example.com aufweisen.

4 Erstelle Die Keys Auf mirror.example.com

Nun erstellen wir das private/public Key Paar auf mirror.example.com:

mirror:

(Wir führen dies aus Rootanwender aus!)

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

Du wirst etwas ähnliches sehen wie:

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/cron/mirror-rsync-key.
Your public key has been saved in /root/cron/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@mirror

Es ist wichtig, dass Du kein Passwort eingibst, sonst wird die Spiegelung nicht ohne menschliche Interaktion funktionieren, also drücke einfach enter!

Als Nächstes kopieren wir unseren public key nach server1.example.com:

mirror:

(Wir führen dies immer noch als Rootanwender aus.)

scp /root/rsync/mirror-rsync-key.pub someuser@server1.example.com:/home/someuser/

Der public key mirror-rsync-key.pub sollte nun in /home/someuser auf server1.example.com verfügbar sein.

5 Konfiguriere server1.example.com

Melde Dich nun über SSH auf server1.example.com as someuser (nicht als Root!) an und führe Folgendes aus:

server1:

(Bitte führe dies als someuser aus!)

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 die Inhalte von mirror-rsync-key.pub der Datei /home/someuser/.ssh/authorized_keys angehängt. /home/someuser/.ssh/authorized_keys sollte so ähnlich wie dies aussehen:

server1:

(Immer noch als someuser!)

vi /home/someuser/.ssh/authorized_keys

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

Nun wollen wir nur Verbindungen von mirror.example.com zulassen und dem Benutzer der Verbindung sollte nur erlaubt sein, rsync zu verwenden, also fügen wir

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty

ganz am Anfang von /home/someuser/.ssh/authorized_keys hinzu:

server1:

(Immer noch als someuser!)

vi /home/someuser/.ssh/authorized_keys

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror

Es ist wichtig, dass Du einen FQDN wie mirror.example.com anstelle einer IP Adresse nach from= verwendest, sonst wird das automatische Spiegeln nicht funktionieren!

Nun erstellen wir das Skript /home/someuser/rsync/checkrsync das alle Befehle außer rsync ablehnt.

server1:

(Wir führen dies immer noch als someuser aus!)

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

6 Teste rsync Auf mirror.example.com

Nun müssen wir auf mirror.example.com testen, ob wir server1.example.com ohne nach dem Passwort von someuser aufgefordert zu werden, spiegeln können. Wir führen Folgendes aus:

mirror:

(Wir führen dies aus Rootanwender aus!)

rsync -avz –delete –exclude=**/stats –exclude=**/error –exclude=**/files/pictures -e „ssh -i /root/rsync/mirror-rsync-key“ someuser@server1.example.com:/var/www/ /var/www/

(Die –delete Option bedeutet, dass Dateien, die auf server1.example.com gelöscht worden sind, auch auf mirror.example.com gelöscht werden sollen. Die –exclude Option bedeutet, dass diese Dateien/Verzeichnisse nicht gespiegelt werden sollen; z.B. –exclude=**/error bedeutet „spiegele /var/www/error nicht“. Du kannst mehrere –exclude Optionen verwenden. Ich habe diese Optionen beispielhaft aufgelistet; Du kannst den Befehl je nach Wunsch anpassen. Sieh Dir Folgendes an

man rsync

für mehr Informationen.)

Nun müsstest Du sehen, dass die Spiegelung stattfindet:

receiving file list ... done

sent 71 bytes  received 643 bytes  476.00 bytes/sec
total size is 64657  speedup is 90.56

ohne nach einem Passwort gefragt zu werden! Das ist das, was wir wollten.

7 Erstelle Einen Cron Job

Wir möchten die Spiegelung automatisieren. Daher erstellen wir einen Cron Job auf mirror.example.com. Lass crontab -e als root laufen:

mirror:

(Wir führen dies als Rootanwender aus!)

crontab -e

und erstellen einen Cron Job wie folgt:

*/5 * * * * /usr/bin/rsync -azq --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" someuser@server1.example.com:/var/www/ /var/www/

Somit würde rsync alle 5 Minuten laufen; passe es je nach Wunsch an (siehe

man 5 crontab

). Ich verwende den vollständigen Pfad zu rsync hier (/usr/bin/rsync), einfach um sicher zu gehen, dass Cron weiß, wo es rsync finden kann. Dein rsync Ort kann abweichen. Lass Folgendes laufen

mirror:

(Wir führen dies als Rootanwender aus!)

which rsync

um herauszufinden wo Deiner ist.

8 Links

Das könnte dich auch interessieren …