コンテンツ同期プログラム | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

意味合いとしては様々なものを持ちますが、私の方で構築したシステムの要件は下記の通りです。


- あるディレクトリ以下のファイルを指定のサーバーの指定のディレクトリ以下に丸ごとコピー(同期)したい

- テスト(検証)サーバーにアップロードしたコンテンツを管理者がWeb画面上のボタンをクリックする事で、本番Web

  サーバーに対して同期を開始させたい

- 複数台のWebサーバーがありそれらに、同時に同期を行いたい

- 本番のWebサーバーに対してFTP接続を行わせたくない

 (誤操作などによりファイルが消失したり、セキュリティ上の観点からFTPデーモンを起動したくなかったり

 


コンテンツ管理 などに良くあるものです。

これを私の方では以下の技術を組み合わせて構築してみました。


- PHP

- rsync

- sudo


詳しく解説していくと、rsyncにより特定のディレクトリ以下を丸ごとコピーする事が可能になります。

Webのインターフェースを持つため、rsyncで同期する際には同期先のサーバーとホストベース認証を結んでおくとパスワード求められることなく同期する事が可能です。


※ ホストベース認証の設定はこちら を参照。

  PermitRootLogin を「no」に設定しておくとroot権限で接続できませんので注意が必要です。


sudoによりroot権限でrsyncを実行するようにします。root権限で実行させる理由は、rsyncはroot権限で実行した場合のみファイルの権限を保持して同期(-pオプションが有効になる)する事が可能になるからです。

このシステムでは、Apacheは専用のユーザー(apacheやnobody)を想定しています。

apacheやnobodyはシェルを持たない(ユーザーの変更ができない)ユーザーのため、このままではrsyncを実行できません。

また、セキュリティの観点からこれらのユーザーを所有者に指定したくないと言う考えもあるでしょう。

ですので、権限を保持しつつ同期するためには、root権限でrsyncを実行する必要が出てきます。

そのためにsudoコマンドを利用しています。


sudoの設定は、こちら が参考になるかと思います。
sudoはApacheの実行ユーザーに対してrsyncのみ実行を許可するようにするなどある程度の制限をかけておくほうが無難です。


PHPの技術は実際は、Webのインターフェースを構築できる言語と、サーバー上のコマンドが実行できれば何でも良いです。

PHPの場合は、下記の様に実行します。


system ("/usr/bin/sudo /usr/bin/rsync -av --delete /wwwroot/hogehoge/ hogeserver:/wwwroot/hogehoge/");


この他にも色々、こういった要件のシステムは構築する事は可能です。

そもそもコンテンツの各ファイルの所有者とApacheの実行ユーザーが同じで、サーバー上で利用可能なユーザー(デフォルトのシェルやホームディレクトリが設定されている)であれば、sudoは使用する必要がありません。(セキュリティを問題視しなければ)


他にも、(PHPのFTP関数 を使用したりして)Webのインターフェースを持つFTPクライアントを作ってしまったり(工数はかかりますが)、テスト(検証)サーバーにアップしたファイルは翌日に反映されると言うような運用フローが取れるのであれば、Webのインターフェースは必要ないのでrsyncをcronに登録しておき、特定の時間に同期させると言うものでも良いでしょう。

rsyncの代わりにscpやsftpを使う事もできるでしょう。


多少システムの構成は煩雑になりますが、テスト(検証)サーバー上からFTP、scp、rsyncなどによりファイルの

転送を行いrsh によって本番サーバー上のプログラムを実行し、ファイルをあるべきところに移動させたり所有者・権限を変更すると言う事もできるかと思います。


そもそも、Webサーバーが1台であったり、FTPの接続を許可するというポリシーであればこんな複雑な事をする必要性はありません。

実現する技術と言うのは、多々ありますのでそれぞれの要件、開発の工数にあったものを選択していくと言う事が重要です。