Tento tutoriál ukazuje, jak můžete zrcadlit svůj web z hlavního webového serveru na záložní server, který může převzít kontrolu, pokud hlavní server selže. Používáme k tomu nástroj rsync a necháváme jej spouštět cronovou úlohou, která každých x minut kontroluje, zda je na zrcadle něco k aktualizaci. Váš záložní server by tedy měl být obvykle aktuální, pokud má převzít kontrolu.
rsync aktualizuje pouze soubory, které se změnily, takže při každém spuštění rsync nemusíte přenášet 5 GB dat. Zrcadlí pouze nové/změněné soubory a může také odstranit soubory ze zrcadla, které byly smazány na hlavním serveru. Kromě toho může zachovat oprávnění a vlastnictví zrcadlených souborů a adresářů; abychom zachovali vlastnictví, musíme spustit rsync jako root, což je to, co zde děláme. Pokud se změní oprávnění a/nebo vlastnictví na hlavním serveru, rsync je změní také na záložním serveru.
V tomto tutoriálu budeme tunelovat rsync přes SSH, které je bezpečnější; to také znamená, že pro rsync nemusíte otevírat další port ve vašem firewallu - stačí, když je otevřený port 22 (SSH). Problém je v tom, že SSH vyžaduje heslo pro přihlášení, což není dobré, pokud chcete spouštět rsync jako úlohu cron. Potřeba hesla vyžaduje lidskou interakci, což není to, co chceme.
Ale naštěstí existuje řešení:použití veřejných klíčů . Vytvoříme pár klíčů (na našem záložním serveru mirror.example.com ), z nichž jeden je uložen v souboru na vzdáleném systému (server1.example.com ). Poté již nebudeme při spuštění rsync vyzváni k zadání hesla. To také zahrnuje úlohy cron, což je přesně to, co chceme.
Jak jste již možná uhodli z toho, co jsem dosud napsal, koncept je takový, že iniciujeme zrcadlení server1.example.com přímo z mirror.example.com; server1.example.com pro zrcadlení nemusí nic dělat.
Zde použiji následující nastavení:
- Hlavní server:server1.example.com (server1) – IP adresa:192.168.0.100
- Zrcadlový/záložní server:mirror.example.com (mirror) – IP adresa:192.168.0.175
- Webová stránka, která má být zrcadlena, je v /var/www na server1.example.com.
rsync je pouze pro zrcadlení souborů a adresářů; pokud chcete zrcadlit svou databázi MySQL, použijte místo toho zrcadlení/replikaci MySQL.
Nejprve chci říci, že to není jediný způsob, jak nastavit takový systém. Existuje mnoho způsobů, jak tohoto cíle dosáhnout, ale já volím tento způsob.
1 Nainstalovat rsync
Nejprve musíme nainstalovat rsync na server1.example.com i mirror.example.com. Pro systémy Debian a Ubuntu to vypadá takto:
server1/mirror:
(To děláme jako root!)
apt-get install rsync
Na jiných distribucích Linuxu byste k instalaci rsync použili yum (Fedora/CentOS) nebo yast (SuSE).
2 Vytvoření neprivilegovaného uživatele na server1.example.com
Nyní vytvoříme neprivilegovaného uživatele s názvem someuser na server1.example.com, kterého použije rsync na mirror.example.com k zrcadlení adresáře /var/www (některý uživatel musí mít samozřejmě oprávnění ke čtení na /var/www na serveru1 .example.com).
server1:
(To děláme jako root!)
useradd -d /home/someuser -m -s /bin/bash someuser
Tím se vytvoří uživatel someuser s domovským adresářem /home/someuser a přihlašovacím shellem /bin/bash (je důležité, aby měl someuser platný přihlašovací shell - něco jako /bin/false nefunguje!). Nyní dejte některému uživateli heslo:
passwd someuser
3 Test rsync
Dále otestujeme rsync na mirror.example.com. Jako root uděláme toto:
zrcadlo:
rsync -avz -e ssh [email protected]:/var/www/ /var/www/
Měli byste vidět něco takového. Odpovězte ano:
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
Poté zadejte heslo některého uživatele a měli byste vidět, že adresář /var/www serveru1.example.com je zrcadlen do /var/www na mirror.example.com.
Můžete to zkontrolovat takto na obou serverech:
server1/mirror:
ls -la /var/www
Měli byste vidět, že všechny soubory a adresáře byly zrcadleny na mirror.example.com a soubory a adresáře by měly mít stejná oprávnění/vlastnictví jako na server1.example.com.
4 Vytvořte klíče na mirror.example.com
Nyní vytvoříme pár soukromý/veřejný klíč na mirror.example.com:
zrcadlo:
(To děláme jako root!)
mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key
Uvidíte něco takového:
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 [email protected]
Je důležité, abyste nezadávali přístupovou frázi, jinak nebude zrcadlení fungovat bez lidské interakce, takže jednoduše stiskněte enter !
Dále zkopírujeme náš veřejný klíč na server1.example.com:
zrcadlo:
(Přesto to děláme jako root.)
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/someuser/
Veřejný klíč mirror-rsync-key.pub by nyní měl být dostupný v /home/someuser na server1.example.com.
5 Konfigurace server1.example.com
Nyní se přihlaste přes SSH na server1.example.com jako uživatel (nikoli root!) a proveďte toto:
server1:
(Udělejte to prosím jako uživatel!)
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
Tímto jsme přidali obsah mirror-rsync-key.pub do souboru /home/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys by měl vypadat podobně jako toto:
server1:
(Stále jako nějaký uživatel!)
vi /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom [email protected]
mirror
Nyní chceme povolit připojení pouze z mirror.example.com a připojující se uživatel by měl mít povoleno používat pouze rsync, takže přidáváme
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty
hned na začátku /home/someuser/.ssh/authorized_keys:
server1:
(Stále jako nějaký uživatel!)
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 [email protected]
mirror
Je důležité, abyste místo IP adresy za from=použili FQDN jako mirror.example.com, jinak automatické zrcadlení nebude fungovat!
Nyní vytvoříme skript /home/someuser/rsync/checkrsync, který odmítá všechny příkazy kromě rsync.
server1:
(Stále to děláme jako někteří uživatelé!)
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 Test rsync na mirror.example.com
Nyní musíme otestovat na mirror.example.com, zda můžeme zrcadlit server1.example.com, aniž bychom byli vyzváni k zadání hesla některého uživatele. Děláme toto:
zrcadlo:
(To děláme jako root!)
rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/
(Volba --delete znamená, že soubory, které byly smazány na server1.example.com, by měly být smazány také na mirror.example.com. Volba --exclude znamená, že tyto soubory/adresáře nemají být zrcadleny; např. --exclude =**/error znamená „nezrcadlit /var/www/error". Můžete použít více možností --exclude. Tyto možnosti jsem uvedl jako příklady; příkaz si můžete upravit podle svých potřeb. Podívejte se na
man rsync
pro více informací.)
Nyní byste měli vidět, že zrcadlení probíhá:
receiving file list ... done
sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.56
bez výzvy k zadání hesla! Tohle jsme chtěli.
7 Vytvoření úlohy Cron
Chceme zrcadlení automatizovat, proto pro něj vytváříme cron job na mirror.example.com. Spusťte crontab -e jako root:
zrcadlo:
(To děláme jako root!)
crontab -e
a vytvořte úlohu cronu takto:
*/5 * * * * /usr/bin/rsync -azq --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]com:/var/www/ /var/www/
Toto by spouštělo rsync každých 5 minut; upravte jej podle svých potřeb (viz
man 5 crontab
). Zde používám úplnou cestu k rsync (/usr/bin/rsync), abych se ujistil, že cron ví, kde najít rsync. Vaše umístění rsync se může lišit. Spustit
zrcadlo:
(To děláme jako root!)
which rsync
abyste zjistili, kde je ten váš.
8 odkazů
- rsync: https://rsync.samba.org/