マニュアル目次 > サーバーの準備(導入担当者向け)

別サーバーへの配信

公開サイトをCMSとは別のサーバーへ置く場合の設定です。

使えるかどうかの確認

rsync は SSH 経由で外部コマンドを実行します。そのためPHPの proc_open 関数が必要です。レンタルサーバーでは無効化されていることがよくあります。

使えない環境では、設定画面の「公開方式」で rsync が選べないようになっており、その理由も表示されます。その場合は「ローカル」方式を使ってください(同じサーバー内の別ディレクトリへ公開し、そこを別ドメインのドキュメントルートにする、という構成が取れます)。

前提

項目内容
認証方式SSHの公開鍵認証。パスフレーズ付きの鍵も使えます(設定画面でパスフレーズを入力してください)。
鍵の権限秘密鍵は実行ユーザーだけが読める権限(600)にしてください。
パスの制限秘密鍵・known_hosts のパスに空白と引用符を含めないでください。rsync がこの値を空白で区切って解釈するためです。ドットは使えます/home/deploy/.ssh/id_ed25519 のような指定で問題ありません)。
鍵の置き場所CMSのディレクトリの外に置いてください。中に置くと、静的ファイル同期の設定によっては公開サイトへコピーされる恐れがあります。

ホスト鍵の登録(初回だけ・管理画面で完結します)

ホスト鍵の検証は無効化していません。 通信相手が本当に意図したサーバーかを確認せずに転送すると、なりすましたサーバーへサイト一式を送ってしまう恐れがあるためです。そのため、初回だけ転送先のホスト鍵を登録する必要があります。登録前に公開すると「Host key verification failed」で止まります。

サーバーにログインする必要はありません。設定画面から登録できます。

  1. ホスト・ポート・ユーザーを入力する

    設定 > rsync設定 で、転送先ホストとSSHポートを入力します(保存はまだしなくて構いません)。

  2. 転送先のホスト鍵を取得 を押す

    転送先サーバーに問い合わせて、ホスト鍵のフィンガープリントを画面に表示します。

  3. フィンガープリントを確認する

    ssh-ed25519 SHA256:xxxxx… のような値が出ます。サーバー会社が公開しているフィンガープリントと一致するか確認してください。一致しない場合は登録しないでください(通信相手が別のサーバーである可能性があります)。

  4. この鍵を登録する を押す

    登録すると、そのまま公開できるようになります。

登録先は static/ssh/known_hosts(CMSの中・公開ディレクトリの外)で、設定の「known_hostsファイルのパス」に自動で入ります。実行ユーザーのホームに置かないのは、Web経由とCronで実行ユーザーが違うことが多く、片方でしか効かないためです。
サーバーにログインできる方は、従来どおりコマンドでも登録できます(ポート番号の指定を忘れないでください)。
ssh-keyscan -p 10022 sv1234.example.jp >> /path/to/known_hosts

設定項目

項目内容
rsync実行ファイルのパス初期値: rsyncrsync のまま、または絶対パス。それ以外は保存できません。
rsync 転送先ホスト英数字・ドット・ハイフンのみ。
SSHユーザー英数字・ドット・ハイフンのみ。
SSHポート初期値: 221〜65535。
rsync 転送先パス転送先サーバー上の絶対パス。.. は使えません。
SSH秘密鍵パス絶対パス。空白・引用符は使えません(ドットは使えます)。~ は展開されないので、/home/ユーザー名/... と書いてください。
SSH秘密鍵のパスフレーズ鍵にパスフレーズがある場合だけ入力します。入力欄は常に空で表示され、空のまま保存しても消えません。消すときは下に出る「保存されているパスフレーズを削除する」を使ってください。
known_hostsファイルのパス「転送先のホスト鍵を取得」で登録すると自動で入ります。空の場合は実行ユーザーの ~/.ssh/known_hosts を使いますが、Web経由とCronで実行ユーザーが違うと片方でしか効きません。
入力値は保存時に検証されます。形式が不正な値は保存できません。また、実際に転送する直前にもう一度検証し、rsync が起動できるかも確認します。

パスフレーズ付きの鍵について

レンタルサーバーでは、コントロールパネルで鍵を作るときにパスフレーズが必須になっていることがあります。そのような鍵でも使えます。設定画面の「SSH秘密鍵のパスフレーズ」に入力してください。

入力しないまま転送すると Permission denied (publickey) としか出ず原因が分かりにくいため、保存した時点でエラーにして知らせます(鍵ファイルの中身を見てパスフレーズの有無を判定しています)。

パスフレーズはデータベースに暗号化して保存します。 ただしこれは万全の保護ではありません。CMSのファイルとデータベースの両方を読める人には復号できます (もっとも、その人はサーバー上の秘密鍵ファイルそのものも読めます)。防げるのは「データベースのダンプだけが流出した」場合です。
いちばん確実なのは、鍵の側でできることを絞ることです。 転送先サーバーの ~/.ssh/authorized_keys で、その鍵に次のような制限を付けておいてください。 こうしておけば、鍵とパスフレーズが両方漏れても公開先ディレクトリへの書き込み以外は何もできません(ログインもポート転送も不可)。
restrict,command="rrsync -wo /home/example/public_html" ssh-ed25519 AAAAC3Nza... deploy@cms
ssh-agent が使える環境なら、パスフレーズを保存せずエージェントに任せることもできます(秘密鍵のパスを空にしてください)。 ただしサーバーを再起動するたびに人がパスフレーズを入力し直す必要があるため、無人運用には向きません。

削除除外パターンとの関係

別サーバーへ配信する構成では、公開先にそのサーバー固有のファイル(証明書の確認用フォルダ、独自の .htaccess など)があることがよくあります。それらを守るには、公開設定 の「削除除外パターン」を使ってください。転送そのものは止めず、削除だけを止めます

うまくいかないとき

症状確認すること
rsyncが選べないproc_open が無効化されています。ローカル方式を使ってください。
「rsync を実行できませんでした」実行ファイルのパスが違うか、そのユーザーで実行できません。which rsync の結果を絶対パスで入れてみてください。
接続で止まる・失敗するknown_hosts への登録が済んでいない可能性が高いです。実行ユーザーで ssh -p ポート ユーザー@ホスト を手動実行して確認してください。
鍵が読めない秘密鍵のパスと権限を確認してください。Web経由とcronで実行ユーザーが違うと、片方だけ失敗します。
タイムアウトする転送量が多すぎる可能性があります。初回は時間がかかります。2回目以降は変更分だけになります。