題名の通りなのですが、先日PowerCMSでCopy2Publicというプラグインを使用してCMSサーバと公開用WEBサーバ(別サーバ)間でファイル転送を行う設定をしようとしたときのことです。
そもそもCopy2Publicの転送の流れは以下のようになります。
- 第1段階の同期(ステージング環境へ同期)でステージング環境にファイルを展開する
- 第2段階の同期(公開環境への同期)で公開環境にファイルを展開する
- 公開環境への同期時にファイル転送をするように設定すると、別サーバ(今回の場合公開用のWEBサーバ)のアップロードディレクトリに同期対象のファイルを圧縮したファイルを転送する
- (事前に別サーバの公開ディレクトリにdo-synchronizeというperlのシェルを設置し、それをcronで実行するようにする)
- cronでdo-synchronizeが定時実行されて、アップロードディレクトリに転送された圧縮ファイルが公開用ディレクトリに展開される
そこで私が今回ハマった内容なのですが、以下のような設定をしておりました。
ウェブサイトのプラグイン設定:
- ステージ環境のパス CMSサーバのドキュメントルート/staging
- 公開環境のパス CMSサーバのドキュメントルート
【FTP/SFTP転送設定】
- 転送 チェック
- 転送先サーバーの公開環境のパス 公開WEBサーバのドキュメントルート
- サーバー名 公開WEBサーバのサーバ名
- ユーザー名 接続可能なユーザ名
- パスワード 接続可能なユーザのパスワード
- アップロードディレクトリのパス 公開WEBサーバのドキュメントルート配下の別ディレクトリ(updir)
mt-config.cgi(CMSサーバ)
Copy2PublicTransferProtocol SFTP
AllowCopy2PublicStagingRoot CMSサーバのドキュメントルート/staging
AllowCopy2PublicPublishRoot CMSサーバのドキュメントルート
do-synchronize(公開用WEBサーバ)
my $upld_dir = 公開WEBサーバのドキュメントルート配下の別ディレクトリ(updir)
my $backup_dir = 公開WEBサーバのドキュメントルート配下の別ディレクトリ(backup)
my $sync_log = 公開WEBサーバのドキュメントルート配下の別ディレクトリ(log)
この設定でステージング環境への同期→公開環境への同期を順次行ったところ、CMSサーバの公開環境にあった静的ページや、他のディレクトリが全て消えてしまいました・・・。
なぜかというと、「CMSサーバのドキュメントルート」以下のファイルが削除されたのは「ステージ環境のパス」が「公開環境のパス」の配下にある設定を行っているためで、このような設定を行われることは想定外だそうです。(メーカーに確認)
「公開環境に同期」では「ステージ環境のパス」から「公開環境のパス」へ同期を行います。
例えばドキュメントルートが「/var/www/html 」の場合、「公開環境に同期」では下記の同期を行います。
/var/www/html/staging
↓
/var/www/html
Copy2Public の同期では削除も行え、同期元にないファイルは削除をします。
/var/www/html/staging/index.html (存在しない
↓
/var/www/html/index.html (削除する
同期先が同期元の下層にあるため、staging が空の場合は下記のように同期先からも削除が行われます。
/var/www/html/staging/img/ (存在しない
↓
/var/www/html/img/ (削除する
/var/www/html/staging/staging (存在しない
↓
/var/www/html/staging (削除する
このような動きをするそうです。
これを回避するために、以下のように対応しました。
Copy2Public の仕様上、「公開環境のパス」のディレクトリは必要ですが、Copy2Public としてはドキュメントルート以下である必要はなく、ウェブサーバーから書き込みが可能であれば問題ないそうで、サーバーの仕様上、ディレクトリをドキュメントルート以下にしか用意できない場合は下記の様に設定すればよいとの事でした。
例)
ドキュメントルートが「/var/www/html」の場合
ウェブサイトパスが「/var/www/html」の場合
・ステージ環境のパス
/var/www/html (※ ウェブサイトパスと同じ値を指定する)
・公開環境のパス
/var/www/html/.public
・コピー対象外のパス
/var/www/html/.public
※「.public」は名前の先頭にドットをつけたディレクトリです。
今回は、要件としてドキュメントルート配下以外へのディレクトリ作成ができなかったため、不可視ディレクトリを仮の公開環境として、それをコピー対象外とすることでコピーは行われずに、ステージ環境 = 公開環境という状態にすることができました。
もしご使用になる際は、お気をつけ下さいませ・・・。