SolarisでrsyncをPHPから実行する

「社内サーバ」で制作したコンテンツを「本番サーバ」にrsyncでアップする。

これは本来、毎回ターミナルを立ち上げて作業しないといけないので管理者しか作業できない。Webの画面からrsyncを起動できたら、管理者でなくとも操作できる。やり方によっては携帯電話(iモード)からも操作可能になる。

 

■基本戦略を考える

タイプA

  コンテンツの移動:  社内サーバ → 本番サーバ

  PHP+RSYNCの実行:  社内サーバ

  メリット:  ファイアウォール等を考慮しないで済む場合が多いので楽。

 

タイプB

  コンテンツの移動:  社内サーバ → 本番サーバ

  PHP+RSYNCの実行:  本番サーバ

  メリット:  本番サーバは外からアクセスできるので、携帯電話等からも実行できる。

  デメリット: 誰でも実行できてしまうので、.htaccessによるアクセス制限が必要。

 

今回は、タイプAの「社内サーバで、PHP+RSYNCを実行する」を採用した。

 

■社内サーバの下準備

社内サーバのApacheの実行ユーザがwebservdの場合、以下の下準備を行う。

社内サーバのApache実行ユーザwebservdに必要なもの

  ホームディレクトリ: /export/home/webservd (711か755)

  .sshの公開鍵: /export/home/webservd/.ssh/id_rsa.pub

  シェル環境:  /bin/sh  (sshやrsyncを実行するために必要)

 

PHPからRSYNCを実行する。つまりwebservdというユーザがRSYNCを実行できないといけない。よって、/etc/passwdのwebservdを以下のように変更した。

webservd:x:80:80:WebServer Reserved UID:/export/home/webservd:/bin/sh

 

webservdユーザが、パスワード無しで本番サーバへsshログインするための下準備をしておく。

# su - webservd

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/export/home/webservd/.ssh/id_rsa): (リターン)
Created directory '/export/home/webservd/.ssh'.
Enter passphrase (empty for no passphrase): (リターン)
Enter same passphrase again: (リターン)
Your identification has been saved in /export/home/webservd/.ssh/id_rsa.
Your public key has been saved in /export/home/webservd/.ssh/id_rsa.pub.
The key fingerprint is:
21:38:a5:a9:40:a8:83:dc:04:7d:87:4a:93:fa:50:b2 webservd@honban

$ ls .ssh
id_rsa   (秘密鍵)
id_rsa.pub  (公開鍵)

$ cat .ssh/id_rsa.pub  (公開鍵の中身を見る)
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA4JOxUnq7fQPnV+j99uwYY/mrw
GuHMc8GzSe5LdSbO2k6JVM+4Xskf7NAm0/rhpNHwKjHLbgfDASCHr6zQXnA
f3DWnRX557svLoYrPLxg0uGEQ3TykckJE8LDLzVuGbONQXhUz3e68/9pzr1x3
SerP2Jb5p5kDTgUnsDsC/mESVM= webservd@shanai

 

 

■本番サーバ下準備

社内サーバのwebservdユーザーがパスワード入力無しで本番サーバにログインできるようにする。

本番サーバ

  ホームディレクトリ: /export/home/www (711か755)

  Webディレクトリ: /export/home/www/public_html/ (777)

  .sshのディレクトリ: /export/home/www/.ssh/

 

「社内サーバのwebservdユーザーの公開鍵」を「本番サーバのauthorized_keys」に追加しておく。

$ su - www
$ cat webservdのid_rsa.pub >> /export/home/.ssh/authorized_keys

 

参考ページ

Solarisにsshの自動ログインでパスワードを入力しないを参照

 

■社内サーバからsshログインを確認する

社内サーバから本番サーバへ、パスワード無しでログインできることを確認しておく。

# su - webservd(webservdユーザにパスワードを設定していないのでルートからsuする)
$ ssh -l www 本番サーバ

 

 

■社内サーバにphpファイルを作成する

rsyncを動かすためのphpファイルを作る。

社内サーバ

  ホームディレクトリ: /export/home/intra (711か755)

  Webディレクトリ: /export/home/intra/public_html/ (webservdが読めるように755)

 

/export/home/intra/public_html/rsync.php

<html>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>テストサーバから本番サーバへの全コンテンツコピー</title>
<head>
</head>
<body>

<h3>テストサーバ から 本番サーバ へ全コンテンツコピーが始まりました。</h3>
<p>コピーファイルを表示しています</p>
<p>最大100行まで表示します。</p>

<?php
// ↓このコマンドをwebservdユーザが実行する。
$output = `/usr/local/bin/rsync -av --rsync-path=/usr/local/bin/rsync
/export/home/intra/public_html/
-e ssh www@www.honban.co.jp:public_html/ | head -100`;
echo "<pre>$output</pre>";
?>

<a xhref="rsync_ps.php">進行状況を確認する</a>

</body>
</html>

$output = `コマンド` ; は一行で入力する。 

 

ブラウザからアクセスして、実行結果を確認する。

http://社内サーバ/rsync.php

 

■rsyncの進行状況を確認するphp

/export/home/intra/public_html/rsync_ps.php

<html>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>テストサーバから本番サーバへの全コンテンツコピー | 進行状況を確認</title>
<head>
</head>
<body>

<h3>テストサーバ から 本番サーバ へ全コンテンツコピーの進行状況を確認</h3>
<p>進行状況を表示しています...</p>

<?php
$output = `ps -ef | grep rsync-pat[h]`;
echo "<pre>$output</pre>";
?>

<p>ジョブの情報が表示されなくなったらコピーは完了です。</p>

<a xhref="rsync_ps.php">進行状況をリロードする</a>

</body>
</html>
 

 

■上手くいかないときのチェック

◎手動で試す。社内サーバで以下を実行する。

# su - webservd (webservdユーザにパスワードを設定していないのでルートからsuする)
$ /usr/local/bin/rsync -av --rsync-path=/usr/local/bin/rsync
/export/home/intra/public_html/
-e ssh www@www.honban.co.jp:public_html/

rsyncコマンドはフルパス指定する。

--rsync-pathに、本番サーバ上のrsyncをフルパス指定する。/opt/sfw/bin/rsyncの場合もある。

www.honban.co.jpの代わりにIPアドレスで指定してみる。

 

◎本番サーバのpublic_htmlディレクトリが777になっていること。webservdユーザが書き込むため。

 

◎社内サーバのApacheを停止、起動する。Apacheの実行ユーザwebservdに関する情報を変更した場合に行う。再起動ではなく、停止させてから、起動する。

# svcadm disable apache2
# svcadm enable apache2