サーバー設定 · 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-pty
command="/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"
                ;;
esac

chmod 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.56

14.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がダウンしている場合、次のことを行う必要があります:

  1. –deleteコマンドなしでWEB1からWEB2へrsyncします:

web1.example.com

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

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。