« パスワードなしで他のサーバにSSH接続する方法 | Main | サーバ間の設定ファイル差異を比較するスクリプト »

October 24, 2010

WEB上からrsyncを実行する方法

各サーバ群にソースコードを配信するためにrsyncを使っているところも多いと思います。この操作をWEB上から行えるようになれば、例えばデザイナーがちょっとした画像データを配信するといった場面などで便利そうです。そこで今回はrsyncをWEB上から実行する方法について記してみたいと思います。


【ハマりどころ確認】
WEB上からrsyncを実行するのって、簡単に見えて実はちょっと難しいのです。ハマりどころは2つあります。それは

  (1) rsyncを実行するユーザがパスワードなしで配信先サーバにSSH接続できるようにしておかなければならない。

  (2) 配信先サーバでは、rsyncを実行するユーザと同じ名前のユーザで、該当ファイルやディレクトリの書き込み/編集権限を持っていなければならない。

というものです。

(1)については、こちらでも記したような方法で、パスワードなしで他のサーバにSSH接続できるようにしておかなければなりません。ただ厄介なのは、CentOSでyumを使ってapacheをインストールした場合、初期状態のままだとapacheユーザがnologinユーザ(すなわちログインできないユーザ)として登録されているので、これをログインできるユーザに直すところからはじめなければなりません。(注:もしくはapache起動ユーザを変えるという手もあります)

(2)については、配信先サーバ側でもapacheユーザとして該当ファイルやディレクトリに書き込みしに行きますので、パーミッション設定を行わなければなりません。方法としては、ファイルやディレクトリの所有者をapacheユーザにするか、もしくはファイルやディレクトリの所属グループをapacheにした上で、グループの書き込み権限を「w」にする方法があります。今回は後者の方法を採用しました。

ということを踏まえて、以降具体的な設定方法を記していきます。手順は面倒ですが、ほぼコピー&ペーストでいけるので作業自体はそんなに大変ではないかもしれません。


【配信元サーバ側の作業】
OSのapacheユーザがnologinになっているので、通常はapacheユーザでログインできませんが、今回は特別にapacheユーザでもログインできるようにします。(/etc/passwdのapacheユーザの最後の/sbin/nologinを/bin/bashにします)

# sed -i "s/apache:x:48:48:Apache:\/var\/www:\/sbin\/nologin/apache:x:48:48:
Apache:\/var\/www:\/bin\/bash/" /etc/passwd

apacheユーザの秘密鍵と公開鍵を置く場所を作ります。

# mkdir /var/www/.ssh
# chmod 700 /var/www/.ssh
# chown apache.apache /var/www/.ssh

apacheユーザの秘密鍵と公開鍵を作ります。

# su - apache

$ ssh-keygen -t rsa (とりあえず全部Enterで)

すると、秘密鍵(id_rsa)と公開鍵(id.rsa.pub)が生成されるので、公開鍵(id_rsa.pub)の中身をメモ帳などにコピーしておきます。(あとでペーストします。)

$ cat ~apache/.ssh/id_rsa.pub


【各配信先サーバ側の作業】
先程コピーした公開鍵をペーストしつつ、下記のスクリプトを実行します。特に一番最後の行がとても重要です。wwwディレクトリ配下をapacheユーザでも更新できるようにグループ変更を行っています。

# sed -i "s/apache:x:48:48:Apache:\/var
\/www:\/sbin\/nologin/apache:x:48:48:Apache:\/var\/www:\/bin\/bash/" /etc/passwd

# mkdir /var/www/.ssh
# chmod 700 /var/www/.ssh
# chown apache.apache /var/www/.ssh

# echo "ssh-rsa ABCDB3NzaC1yc2EAAAABIwAAAQEAuN0ZaKuttD5/XZna/B2vMKBe1VhuWu/mBqGoYncjkVM
qaWMBRyK1qI6sE4+2k2HGdJa3/RFQu5TMo1f3nxHpvM90wUMoyuTpu2b88WeWZ+ZZxjtS8E
ML5OGsnPBXJ0FMGhuIwQekIBWXiQ7VdfBEIMITngNqzhu+X3dZJgutaJudWyM0j4FZA0b9+
tVsTJw2Kz28r4HwR6Gkcl4vXAo4e4HS8Y7WlabTVXJIkKwN1VqfC/jMohXqUS3SkzMxpS0C
gII0Nmj0PNl+F7zPhJEpsVZbBP9vIYeOKzsKVnD3HWHeeW/QAwVguW8DG1xv4edTR5bwTHS
He3u4UVazwxaSFG== apache@web1
" >> /var/www/authorized_keys

# chown apache.apache /var/www/.ssh/authorized_keys
# chmod 600 /var/www/.ssh/authorized_keys

# chgrp -R apache /var/www/html ←超重要!

【rsync用スクリプトの準備】
細かくは説明しませんが、例えば以下のようなrsync用スクリプトを用意しておきます。

#!/bin/sh
servers[0]=10.0.0.1
servers[1]=10.0.0.2
servers[2]=10.0.0.3
for server in ${servers[@]};
  rsync -avz /var/www/html ${server}:/var/www/
done

【phpプログラムの準備】
そして最後に以下のようなphpプログラムを用意すれば、やっとWEB上からrsyncを実行できるようになります。

<?php
if (@$_GET["c"], ENT_QUOTES == "r") {
    system("/home/miracle/bin/myrsync.sh");
}
?>
<a href="rsync.php?c=r">[rsync]</a>

|

« パスワードなしで他のサーバにSSH接続する方法 | Main | サーバ間の設定ファイル差異を比較するスクリプト »

サーバ・OS」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/32004/49837376

Listed below are links to weblogs that reference WEB上からrsyncを実行する方法 :

« パスワードなしで他のサーバにSSH接続する方法 | Main | サーバ間の設定ファイル差異を比較するスクリプト »