rsync は SSH 経由で外部コマンドを実行します。そのためPHPの proc_open 関数が必要です。レンタルサーバーでは無効化されていることがよくあります。
使えない環境では、設定画面の「公開方式」で rsync が選べないようになっており、その理由も表示されます。その場合は「ローカル」方式を使ってください(同じサーバー内の別ディレクトリへ公開し、そこを別ドメインのドキュメントルートにする、という構成が取れます)。
| 項目 | 内容 |
|---|---|
| 認証方式 | SSHの公開鍵認証。パスフレーズ付きの鍵も使えます(設定画面でパスフレーズを入力してください)。 |
| 鍵の権限 | 秘密鍵は実行ユーザーだけが読める権限(600)にしてください。 |
| パスの制限 | 秘密鍵・known_hosts のパスに空白と引用符を含めないでください。rsync がこの値を空白で区切って解釈するためです。ドットは使えます(/home/deploy/.ssh/id_ed25519 のような指定で問題ありません)。 |
| 鍵の置き場所 | CMSのディレクトリの外に置いてください。中に置くと、静的ファイル同期の設定によっては公開サイトへコピーされる恐れがあります。 |
サーバーにログインする必要はありません。設定画面から登録できます。
設定 > rsync設定 で、転送先ホストとSSHポートを入力します(保存はまだしなくて構いません)。
転送先サーバーに問い合わせて、ホスト鍵のフィンガープリントを画面に表示します。
ssh-ed25519 SHA256:xxxxx… のような値が出ます。サーバー会社が公開しているフィンガープリントと一致するか確認してください。一致しない場合は登録しないでください(通信相手が別のサーバーである可能性があります)。
登録すると、そのまま公開できるようになります。
static/ssh/known_hosts(CMSの中・公開ディレクトリの外)で、設定の「known_hostsファイルのパス」に自動で入ります。実行ユーザーのホームに置かないのは、Web経由とCronで実行ユーザーが違うことが多く、片方でしか効かないためです。
ssh-keyscan -p 10022 sv1234.example.jp >> /path/to/known_hosts
| 項目 | 内容 |
|---|---|
| rsync実行ファイルのパス初期値: rsync | rsync のまま、または絶対パス。それ以外は保存できません。 |
| rsync 転送先ホスト | 英数字・ドット・ハイフンのみ。 |
| SSHユーザー | 英数字・ドット・ハイフンのみ。 |
| SSHポート初期値: 22 | 1〜65535。 |
| rsync 転送先パス | 転送先サーバー上の絶対パス。.. は使えません。 |
| SSH秘密鍵パス | 絶対パス。空白・引用符は使えません(ドットは使えます)。~ は展開されないので、/home/ユーザー名/... と書いてください。 |
| SSH秘密鍵のパスフレーズ | 鍵にパスフレーズがある場合だけ入力します。入力欄は常に空で表示され、空のまま保存しても消えません。消すときは下に出る「保存されているパスフレーズを削除する」を使ってください。 |
| known_hostsファイルのパス | 「転送先のホスト鍵を取得」で登録すると自動で入ります。空の場合は実行ユーザーの ~/.ssh/known_hosts を使いますが、Web経由とCronで実行ユーザーが違うと片方でしか効きません。 |
rsync が起動できるかも確認します。
レンタルサーバーでは、コントロールパネルで鍵を作るときにパスフレーズが必須になっていることがあります。そのような鍵でも使えます。設定画面の「SSH秘密鍵のパスフレーズ」に入力してください。
入力しないまま転送すると Permission denied (publickey) としか出ず原因が分かりにくいため、保存した時点でエラーにして知らせます(鍵ファイルの中身を見てパスフレーズの有無を判定しています)。
~/.ssh/authorized_keys で、その鍵に次のような制限を付けておいてください。
こうしておけば、鍵とパスフレーズが両方漏れても公開先ディレクトリへの書き込み以外は何もできません(ログインもポート転送も不可)。
restrict,command="rrsync -wo /home/example/public_html" ssh-ed25519 AAAAC3Nza... deploy@cms
別サーバーへ配信する構成では、公開先にそのサーバー固有のファイル(証明書の確認用フォルダ、独自の .htaccess など)があることがよくあります。それらを守るには、公開設定 の「削除除外パターン」を使ってください。転送そのものは止めず、削除だけを止めます。
| 症状 | 確認すること |
|---|---|
| rsyncが選べない | proc_open が無効化されています。ローカル方式を使ってください。 |
| 「rsync を実行できませんでした」 | 実行ファイルのパスが違うか、そのユーザーで実行できません。which rsync の結果を絶対パスで入れてみてください。 |
| 接続で止まる・失敗する | known_hosts への登録が済んでいない可能性が高いです。実行ユーザーで ssh -p ポート ユーザー@ホスト を手動実行して確認してください。 |
| 鍵が読めない | 秘密鍵のパスと権限を確認してください。Web経由とcronで実行ユーザーが違うと、片方だけ失敗します。 |
| タイムアウトする | 転送量が多すぎる可能性があります。初回は時間がかかります。2回目以降は変更分だけになります。 |