Apacheからのrsync+sshと「SmartSync Pack」を利用したコンテンツ配信の設定方法について
前回の記事から2年も経過してしまいました。お久しぶりですonagataniことナガタニです。
今回は3rdfocusの人気製品である「SmartSync Pack」のサーバ配信機能の利用方法とApacheから実行するrsync+sshについて説明したいと思います。

対象の読者
- 簡単なssh作業が行える方
- サーバにroot権限がある方
今回のポイント
- CMSサーバとWEBサーバを分離し、WEBサーバへコンテンツ配信を行う
- コンテンツ配信にはMovable Type SmartSync Packを利用する
- Webサーバの起動ユーザであるapacheユーザからrsync+sshを実行する
- 所要時間は1h程度
注意
- CMSサーバは外部から閲覧されることの無いよう、気をつけてください(IP制限など)
- WEBサーバはCMSサーバからのSSH接続を許可している必要があります
- サーバはCentOS8などのLinuxを対象としています
- 当該記事の内容で問題があっても保証できませんのでご注意ください
Movable Type SmartSync Packとは
Movable Type SmartSync Pack(以下MTSSP)は3rdfocusで扱っている人気プラグインとMTのライセンスを同梱したパックになっています。
- コンテンツのサーバー配信機能
- ワークフロー機能
- MTAppjQueryでの管理画面カスタマイズ
- CSVでの記事データimport export
- ファイルアップロードの機能拡張
- CDNのキャッシュクリア機能
これらの機能を利用する事で大きめのサイトでも構築できる構成となっています。
今回は問い合わせの多いサーバー配信機能の設定方法についてまとめてみようと思います。
なお、MTSSPはレンタルサーバ(例:さくらのレンタルサーバなど)でも動作する事をQAチームで検証しておりますが、レンタルサーバでは制約も多いためVPSやクラウドなどの利用をオススメしております。とはいえご自身でサーバのセキュリティアップデートや設定が行えない方も多いかと思います。そういった場合は3rdfocusのマネージド・サービスもご検討ください。
コンテンツ配信(同期)とは
MTは静的にコンテンツを公開しているので、出力されたhtmlなどのファイルを設置すればMTが設置されていないサーバでもコンテンツを公開する事が可能です。
以下2つの構成がとられる事が多いかと思います。
- CMSサーバからWEBサーバへコンテンツを配信し、WEBサーバでコンテンツを公開する
- CMSサーバからS3などのクラウドストレージにコンテンツを配信し、CDNからコンテンツを公開する
MTSSPではコンテンツ配信時にCDNキャッシュクリアの機能は実装しておりますが、S3などのクラウドストレージへのコンテンツ配信は現状β版になっています(近日リリース予定です)ので、今回はCMS/WEBサーバの2台構成の場合を想定して説明していきます。
WEBサーバへのコンテンツ配信方法
そもそもですが、サーバ間でファイルを送信する方法としていくつかの方法があります。
- lsyncを利用した常時同期
- FTPを利用した任意タイミングでの配信
- rsync(d)を利用した任意タイミングでの配信
- SFTPを利用した任意タイミングでの配信
MTSSPで対応しているのはFTP(S)とrsync(d)での配信になりますが、今回は追加ソフトウェアの設定が必要ないrsyncでの配信について説明します。
CMSサーバからWEBサーバへのrsyncの設定
レンタルサーバではsuEXECによってApacheなどはユーザ権限で動作していますが、VPSやクラウドではsuEXECはあまり利用されないかと思います(他人とサーバを共用しないため)。
そのためMTやApacheは通常apacheユーザとして起動することになりますので、apacheユーザがssh経由でrsyncを実行できる必要があります。
ポイント
- MTはapacheユーザで起動するため、apacheユーザがssh経由でrsyncを行うことができるように設定する
sshユーザの作成
CMSサーバからWEBサーバへsshするためのユーザを作成しパスワードを設定します。
※ rsyncが使えないサーバがあるので念の為インストールします
※ 既にコンテンツ配信用のsshユーザが存在する場合は必要ありません。ユーザ名は仮でcontentsとしています。
# useradd contents
# passwd contents
# yum install rsync
この作業はCMSサーバ、WEBサーバ両方で実施してください。
公開鍵認証の設定
CMSサーバからWEBサーバへのsshでパスワード認証を行うと、MTSSPでは動作しませんので公開鍵認証+パスフレーズ無しでのログインを可能にします。
以下の作業はCMSサーバで実施してください。
# su contents
一旦contentsユーザへスイッチします。
$ cd ~
contentsユーザのhomeに移動します
$ ssh-keygen -t rsa -b 4096 -C "contents"
この後のプロンプトには全て何も入力しないでEnterで実行してください。パスフレーズなしの鍵が作成されます。
.sshディレクトリ以下に以下のファイルが生成されていると思います。
- id_rsa => 秘密鍵
- id_rsa.pub => 公開鍵
id_rsa.pubは公開鍵となるのでssh先のWEBサーバに設置する必要があります。
WEBサーバ側のcontentsユーザで以下のように設置してください
# su contents
一旦contentsユーザへスイッチします。
$ cd ~
webサーバでcontentsユーザのhomeに移動します
$ mkdir .ssh
公開鍵を設置するためのディレクトリを作成します
$ vim .ssh/authorized_keys
authorized_keysのファイル内にCMSサーバで作成したid_rsa.pubの中身を貼り付けるか、ファイルを転送します。(中身は改行無しになっています)
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
権限を調整します。これでcontentsユーザの秘密鍵でCMSサーバからWEBサーバにsshが可能になりました。
CMSサーバからWEBサーバへSSHしてみる
実際にCMSサーバからWEBサーバへsshしてみます。(WEBサーバのIPアドレスは仮です)
# ssh -i /home/contents/.ssh/id_rsa contents@192.168.1.2
どうでしょうか。パスフレーズ無しでWEBサーバへログインできたかと思います。
apacheからsshを可能にする
contentsユーザでのsshは確認できましたが、この状態だとapacheからcontentsユーザでのsshができないので、apacheがsshできるように調整します。rootで設定します
# mkdir /usr/share/httpd/.ssh
# cp /home/contents/.ssh/id_rsa /usr/share/httpd/.ssh/contents.pem
# chmod 700 /usr/share/httpd/.ssh/
# chmod 600 /usr/share/httpd/.ssh/contents.pem
# chown -R apache.apache /usr/share/httpd/.ssh
apcheがアクセスできる場所に秘密鍵を設置し、known_hostsが追加できるように調整しています。試しにapacheからcontentsユーザでssh可能かテストします。
# sudo -u apache -H ssh -i /usr/share/httpd/.ssh/contents.pem contents@192.168.1.2
初回ssh時は、known_hostsへのfingerprint登録を聞かれますのでyesと答えて登録します。無事にwebサーバへsshできましたでしょうか。
念の為セキュリティ対策として以下のような感じで.ssh内へのアクセスは制限した方がよいでしょう。
RewriteCond %{REQUEST_URI} !^/\.well-known/
RewriteRule /\..+$ - [R=404,L]
現在のapacheは/usr/share/httpd内は参照していないようですが、念の為の設定になります。とはいえ、この設定があると基本的にドットから始まるURI(ファイル)は見れなくなるのでセキュリティ上安心かと思います。
WEBサーバのコンテンツ公開領域をcontentsユーザが書き込めるようにする
以下のコマンドをwebサーバで実施します。
# chown contents.contents /var/www/html
WEBサーバの公開領域(ドキュメントルート)のパスを/var/ww/htmlとしていますので適宜修正ください。
以上の作業で準備が整いました。それではMTSSPの設定に入ります。(長かった)
サーバー配信設定を行う
細かい設定方法はマニュアルがあるので参照頂くとして、今回は簡単にrsyncで配信設定を行います

サーバ配信メニューから「サーバ配信」を選択し、新しいサーバ配信設定を作成します。

サーバー配信設定の設定名を入力し、通知先メールアドレスも入力します。

- 配信方法はrsyncを設定します
- 配信先名はあくまで識別子ですので、実際のサーバドメイン名やIPアドレスにする必要はありません。(webサーバ1などで問題ありません)
- ①rsync先のディレクトリ。ここで配信先サーバを設定します。通常はsshユーザ名@IPアドレス:/path/toなどになります。今回はcontentsユーザを作成しているので以下のようになります。
contents@192.168.1.2:/var/ww/html/
- ②rsyncの追加設定。ここで先程作成したrsyncの秘密鍵を指定しますので以下のようになります。
--deleteは転送元に存在しないファイルを転送先で消す機能になります。--excludeは配信除外設定になります。今回はmt-configやmt-previewを指定しています。※mt-configを指定しているのは万が一にも間違って送信される事を防ぐためです-rlOtcv -e 'ssh -i /usr/share/httpd/.ssh/contents.pem' --delete --exclude='mt-config.cgi' --exclude='mt-preview-*' --exclude='.git'
配信を実行する
実際の配信についてはマニュアルを確認頂いたほうが良いのですが、「サーバ配信」や「サーバ配信(個別)」から実行してみてください。数分後にrun-periodic-tasks経由で実行されます。
まとめ
MTSSP(apache)からssh経由のrsyncを実行する方法についてまとめてみましたが如何でしたでしょうか。
apacheユーザでのknown_hostsへのfingerprintの追加で躓く方が多いかと思いますので参考にして頂ければ幸いです。
CMSサーバ・WEBサーバの構築方法についても今後まとめようと思いますが CMSサーバの構築についてはCOLSISの記事が参考になるかと思います。
さくらのVPSに手軽にセキュアで高速なMovable Type用サーバをAnsibleで自動で構築する方法