WEBサーバのドキュメントルートをrsyncで同期

Apacheでリバースプロキシとロードバランサーの構築をしているところですが、設定を行う前に2台のWEBサーバの同期(ドキュメントルート)を取る設定をします。 ちなみに現在のこのサイトのインフラ環境は以下のようになっています。20140718_rsync   WEBサーバが2台とDBで、上の図ではDB1台ですがMasterとSlaveでレプリケーションしております。WEBサーバ2台からDBの参照先は同じなのですが、WordPressの書き込みはWEB1に対して行っていますので、アップロードした画像などがWEB2に反映されません。 なので今回はrsyncを使ってWEB1からWEB2へ一方向の同期(この場合はコピーですが)設定を行います。 rsync以外にも同期の仕方はあるようですが、rsyncを使ったことがなかったので今回はrsyncを学びたいと思います。

■サーバ

 サーバ  IPアドレス
同期元  WEB1  192.168.1.10
同期先 WEB2  192.168.1.20

■条件 ・セキュアな環境で行う

・cron化も考慮してrsync用アカウントを作成し、パスワードなしで実行できるようにする
・同期元のオーナー・パーミッションを維持する
・同期元と同期先で同じファイル構造にする (同期元でファイル削除があれば同期先でも削除される)

■送信先サーバ(WEB2)での設定
・ファイアウォールでWEB1からのSSH接続許可
・rsyncユーザ作成
・SSHの設定追加
・rsyncのインストール
・sudoの設定

■送信元サーバ(WEB1)での設定
・rsyncユーザ作成
・SSHの設定(SSHでログインできるユーザにしない)
・パスフレーズなしのSSH鍵を作成し送信先へ配置
・rsyncインストール ・sudoの設定

 


手順1:WEB1からWEB2へSSH接続できる環境を構築

■接続先:WEB2
1.ファイアウォールを設定していればSSH接続の許可を追加します。(手順は割愛します) 2.rsync用アカウントの作成

# useradd -G wheel rsync
# passwd rsync

3.後ほどWEB1で作成したrsyncユーザのSSH公開鍵のみ配置するため、ここではSSH鍵を作成せずにSSH配置ディレクトリだけ作成する(SSHログインは鍵認証のみ許可)

# su - rsync
$ mkdir .ssh
$ chmod 700 .ssh

4.hosts.allowにWEB1のSSH接続を追加する(hosts.denyも適切に設定します)

# vi /etc/hosts.allow

sshd:192.168.1.10

5.SSH接続にPAM認証を使っている場合はアクセス制御設定にrsyncユーザを追加

# vi /etc/security/access.conf

 -:ALL EXCEPT root <その他のユーザ> rsync:ALL

 

■接続元:WEB1
1.rsync専用アカウント作成 ※WEB1サーバのログインは別のユーザで行う。
※2015/02/25訂正 : ここで"-s /sbin/nologin"を指定してしまうとrsync用のユーザになれないので注意

# useradd -s /sbin/nologin rsync
# passwd rsync

2.rsyncユーザのSSH鍵作成(パスフレーズなし)

# su - rsync
$ ssh-keygen -t rsa
 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/rsync/.ssh/id_rsa):
 Created directory '/home/rsync/.ssh'.
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
$ cd .ssh
$ chmod 600 id_rsa.pub

3.rsyncユーザの公開鍵をWEB2のrsyncユーザのホームに配置する。(一時的にWEB2の鍵認証からパスワード認証にするか、SSH鍵を持っている別ユーザでコピーする)

$  scp id_rsa.pub rsync@192.168.1.20:.ssh/authorized_keys

4.SSH鍵(パスフレーズなし)でWEB2にログインできることを確認する。

$ ssh rsync@192.168.1.20

 

手順2:rsyncのインストール(両サーバ)

# yum -y install rsync

 

手順3:sudoの設定追加

■接続先:WEB2

# visudo

#リモートやcronなどtty(端末)以外からsudo実行を許可する場合に必要
Defaults:rsync  !requiretty

#実行できるコマンドはrsyncのみ(パスワードなし)
rsync   ALL=(root)    NOPASSWD:/usr/bin/rsync

■接続元:WEB1

# visudo

rsync   ALL=(root)    NOPASSWD:/usr/bin/rsync

 

手順4:同期

WEB1で実行します。
※注意
コピー元のディレクトリも含めてコピーしたい場合:「/」を含めない
コピー元のディレクトリ配下のツリーをコピーしたい場合:「/」を含める
コピー先は考慮する必要はない

・テスト

$ sudo rsync -av --dry-run -e 'ssh -i /home/rsync/.ssh/id_rsa' --rsync-path='sudo rsync' /var/www/html/ rsync@192.168.1.20:/var/www/html/

・コピー

$ sudo rsync -av -e 'ssh -i /home/rsync/.ssh/id_rsa' --rsync-path='sudo rsync' /var/www/html/ rsync@192.168.1.20:/var/www/html/

・同期(同期元でデータが削除された場合、同期先でもデータ削除されます)

$ sudo rsync -av --delete -e 'ssh -i /home/rsync/.ssh/id_rsa' --rsync-path='sudo rsync' /var/www/html/ rsync@192.168.1.20:/var/www/html/

 

【確認例】

・容量の確認

$ du -s /var/www/html

・ディレクトリ配下のファイル総数の確認

$ find /var/www/html -type f | wc -l

・ディレクトリ配下のディレクトリ総数の確認

$ find /var/www/html -type d | wc -l

・ディレクトリ階層表示

$ tree -as /var/www/html/

 

■cronでrsync自動化の注意
WEB1のrsyncユーザでcronを設定する場合はWEB2と同様に以下の設定が必要になります。

# vi /etc/security/access.conf

 -:ALL EXCEPT root <その他のユーザ> rsync:ALL
# visudo

#リモートやcronなどtty(端末)以外からsudo実行を許可する場合に必要(追加)
Defaults:shell  !requiretty

#実行できるコマンドはrsyncのみ(パスワードなし)
rsync   ALL=(root)    NOPASSWD:/usr/bin/rsync

参考:
http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html http://www.itmedia.co.jp/enterprise/articles/0707/19/news059.html http://d.hatena.ne.jp/JULY/20111127 http://open-groove.net/linux/sudo-requiretty/ http://www.atmarkit.co.jp/ait/articles/0311/05/news001.html