サーバー設定 · 2 min read · Oct 08, 2025
完璧な負荷分散と高可用性のウェブクラスター - 2台のサーバーでXenを実行するUbuntu 8.04 Hardy Heron - ページ8
14. rsyncを使用したウェブおよびメールファイルのミラーリング (web1, web2)
これは難しい部分です。クラスターに配置するウェブサイトの種類によって、ウェブファイルをミラーリングするために使用される技術が異なる場合があります。
web1.example.comをマスターとし、web2.example.comがweb1.example.comに同期します。
これにより、いくつかのケースで問題が発生する可能性があります。ユーザーがファイルをアップロードできるウェブサイトがある場合、web2.example.comにアップロードされることは望ましくありません。なぜなら、2台のサーバーが同期していないからです。
私の場合、ユーザーがデータをアップロードできるすべてのページをHTTPポート81にリダイレクトしています。これは、web1.example.comのみに転送されます。マスターサーバーが失敗した場合、ポート81のすべてのトラフィックはフォールバックサーバーであるweb2.example.comに転送され、ミラーリングは一時的に停止します。
リダイレクトはapacheのvhost.confで次のように行うことができます:
[...]
Redirect /admin http://www.example.com:81/webmail
[...]ユーザーによるファイルアップロードが多い場合は、負荷分散NFSの使用を検討することをお勧めします:
https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat
14.1 rsyncのインストール
apt-get install rsync
14.2 web2.example.comでのキーの作成
次に、web2.example.comでプライベート/パブリックキーのペアを作成します:
mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key
次のようなメッセージが表示されます:
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [ここでEnterを押す]
Enter same passphrase again: [ここでEnterを押す]
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パスフレーズを入力しないことが重要です。そうしないと、ミラーリングは人間の操作なしには機能しませんので、単にEnterを押してください!
次に、パブリックキーをweb1.example.comにコピーします:
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/vmail/
パブリックキーmirror-rsync-key.pubは、web1.example.comの/home/vmailに利用可能である必要があります。
14.3 web1.example.comの設定
web1.example.com
次に、vmailとしてSSHでログインし(rootではありません!)、次の操作を行います:
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
これにより、mirror-rsync-key.pubの内容が/home/vmail/.ssh/authorized_keysファイルに追加されました。/home/vmail/.ssh/authorized_keysは次のようになります:
(まだwebmasterとしてweb1.example.comで作業中)
vi ~/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@web2次に、web2.example.comからの接続のみを許可し、接続するユーザーはrsyncのみを使用できるようにするため、次の行を/home/vmail/.ssh/authorized_keysの先頭に追加します:
command="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-ptycommand="/home/vmail/rsync/checkrsync",from="192.168.0.105",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
web2次に、web1.example.comでrsync以外のすべてのコマンドを拒否するスクリプト/home/vmail/rsync/checkrsyncを作成します。
(まだ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"
;;
esacchmod 700 ~/rsync/checkrsync
14.4 自動rsyncのテスト
web2.example.com
まず、rsyncに同期したくないファイルを指定する必要があります(例:munitグラフ!)
vi /root/exclude_www.txt
次のようにします:
/example/web/monit/
/example/web/monitoring/
/example/ssl/
/yoursite/ssl/ 次にメール用:
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/次に、web2.example.comで、vmailのパスワードを求められることなくweb1.example.comをミラーリングできるかテストします。これを行います:
(これを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/
続いて:
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/
これで、パスワードを求められることなくミラーリングが行われることがわかります:
receiving file list ... done
sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.5614.5 cronジョブの作成
まず、web1.example.comが何らかの理由でダウンした場合、rsyncが停止し、rootが手動でプロセスを再起動する必要があることを確認するスクリプトを作成します。
これを行う理由は、web2.example.comがweb1.example.comのメールを引き継ぐためです。新しいメールはその期間中にweb2.example.comに受信されるため、web1.example.comが1時間後にオンラインに戻った場合、その期間中のすべての新しいメールはrsync –deleteコマンドのためにweb2.example.comで削除されます。これが発生した場合、両方のサーバーを再同期する方法を以下で見ていきます。
今はそのスクリプトを書きましょう。
web2.example.comで
vi /root/rsync_web1
#!/bin/bash
# 2台の負荷分散サーバー間でウェブデータとメールをrsyncするためのスクリプト
# Copyright (c) 2008 blogama.org
# このスクリプトはGNU GPLバージョン2.0以上の下でライセンスされています
# ---------------------------------------------------------------------
### このスクリプトには2つの目的があります ###
### 1) マスターサーバーへのポート25の接続を確認し、その後メールをrsyncします ###
### 2) マスターサーバーへのポート80の接続を確認し、その後wwwデータをrsyncします ###
### 修正が必要です ###
MASTERSERVERIP="192.168.0.104"
WEBPORT="80"
SMTPPORT="25"
SSHPORT="22"
EMAIL="[email protected]"
WWWRSYNCUSER="vmail"
WWWDIR="/var/www/"
MAILRSYNCUSER="vmail"
MAILDIR="/home/vmail/"
###### 以下の変更は行わないでください ######
### バイナリ ###
MAIL=$(which mail)
TELNET=$(which telnet)
RSYNC=$(which rsync)
SSH=$(which ssh)
### 問題が解決したときに元に戻すため ###
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####################
### すでにSMTPの問題が通知されている場合は終了 ###
cd /root
if [ -f smtp_down.txt ]; then
exit 1;
fi
### サーバー1がSMTPで応答しているか確認します。応答している場合はメールをrsyncします ###
### サーバー1がダウンしている場合、サーバー2をサーバー1で--deleteすることはできません ###
### サーバー1をサーバー2と再同期する必要があります(削除なし) /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 "サーバー1がダウンしています。メールの同期はもう機能していません" > /root/smtp_down.txt
$MAIL -s "サーバー1ダウンポート25" $EMAIL < /root/smtp_down.txt
fi
####################HTTP####################
### すでにHTTPの問題が通知されている場合は終了 ###
cd /root
if [ -f http_down.txt ]; then
exit 1;
fi
### サーバー1がHTTPで応答しているか確認します。応答している場合はwwwデータをrsyncします ###
(
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 "サーバー1がダウンしています。WWWの同期はもう機能していません" > /root/http_down.txt
$MAIL -s "サーバー1ダウンポート80" $EMAIL < /root/http_down.txt
fiこのファイルを実行可能にします:
chmod +x /root/rsync_web1
もちろん、これらのファイルに好きなものを入れることができます ;) スラッシュを入れないと、キーワードは再帰的に無視されます(例:*.gz)、スラッシュを入れると特定の場所のためのものです(例:/example/ssl/)。
次に、次のようにしてスクリプトをcrontabに追加します:
crontab -e
次の行を追加します:
[...]
*/5 * * * * /root/rsync_web1 >/dev/null 2>&1
[...]これにより、5分ごとに実行されます。もちろん、必要に応じて変更できます。
14.6 web1.example.comがダウンした場合
一般的に、web1.example.comがダウンしている場合、次のことを行う必要があります:
- –deleteコマンドなしでWEB1からWEB2へrsyncします:
web1.example.com
rsync -avz [email protected]:/var/www/ /var/www/
rsync -avz [email protected]:/home/vmail/ /home/vmail/
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。