rsyncを使ってXSERVERへWebデータ移行
はじめに
レンタルサーバーへのWebデータ移行で、rsyncを使って便利だったので、メモ書き。
先日、お客様の複数Webサイトを、ラピッドサイトVPSからXSERVERへサーバー移行する機会がありました。
「シンプルな静的Webサイト」とうかがっていたのですが、移行前に事前調査してみると、ファイル数がとても多いWebサイトがいくつかありました。
最大のWebサイトで、ファイル数は65,000ぐらい、データ量は6GBぐらいありました。
当初は、Webデータを
- FTPで、移行元のラピッドサイトVPSからPCにダウンロード
- FTPで、PCからXSERVERにアップロード
と考えていたのですが、ファイル数が万単位だと、FTPでは転送に何時間もかかりそうです。
※WordPressサイトを1つ移行したところ、ファイル数が4,000ぐらいで、ダウンロードに15分、アップロードに20分かかりました。インターネット回線があまり速くないせいかもしれませんが。
そこで、クラウドサーバーやVPSサーバー間の移行と同様に、移行対象のサーバー間で、rsyncを使って直接データを転送しようと考えました。
scpや、tarでアーカイブしてから転送することも検討しましたが、以下のようなメリットがあるため、rsyncを採用しました。
- 差分同期できるので、転送を途中でやめても、最初からやり直しでなく途中から再開できる。
- 何日か前にWebデータを転送しておき、移行日に再度、差分同期を実行して最新のWebデータを反映することで、サーバー移行(DNSの切り替え)作業時間を短縮できる。
- シンボリックリンクもそのまま移行できる。
XSERVERでrsyncを使用する方法については、以下の記事も参考になりました。
(参考)
xserverをrsyncで同期する方法 – ブログ作成のツボ
https://blogpot.ok55.net/20181027072221.html
前提
ここでは、移行対象ドメインやサーバー情報は次のとおりとします。
移行対象ドメイン | example.jp |
移行元サービス | ラピッドサイトVPS |
移行元のDocumentRoot | /var/www/example.jp |
移行元OS | CentOS |
移行先サービス | XSERVER |
移行先XSERVERのサーバーID | examplex |
移行先XSERVERのIPアドレス | 203.0.113.10 (ドキュメント用のIPアドレスです) |
移行先XSERVERのDocumentRoot | /home/examplex/example.jp/public_html |
rsyncコマンドは、移行元のラピッドサイトVPSサーバーで実行し、移行先のXSERVERへPUTする形となります。
なお、今回は、ラピッドサイトVPSからXSERVERへの移行手順を記載しますが、
- 移行元はrsyncコマンドが実行可能
- 移行先はSSH接続が可能
であれば、どのサーバーサービスでも同じことができるはずです。
rsyncを使用したWebデータ移行手順
1. SSH鍵ペアの作成
2. XSERVERでSSH公開鍵を登録
3. SSH接続確認
4. rsyncでWebデータを転送
5. 確認
1. SSH鍵ペアの作成
移行元サーバーでSSH鍵を作成します。
※作成済みのSSH鍵を使用してもかまいません。SSH秘密鍵をサーバーに設置するときは、ユーザー自身しかアクセスできないよう、パーミッションを 600 とすることを忘れずに。
今回移行するWebデータはファイルオーナーやパーミッションがまちまちなので、アクセス権限不足で移行漏れするファイルがないよう、rootユーザーでrsyncコマンドを実行することにします。
rootユーザでssh-keygenコマンドを実行して、SSH鍵ペアを作成します。
鍵ファイル名は、rsyncを自動実行する可能性もあるので、パスフレーズは空とします。
※もちろん、パスフレーズを設定してもかまいません。
# ssh-keygen -N "" -t rsa -- Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/datasync Created directory '/root/.ssh'. Your identification has been saved in /root/.ssh/datasync. Your public key has been saved in /root/.ssh/datasync.pub. The key fingerprint is: 0f:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx root@<hostname> The key's randomart image is: +--[ RSA 2048]----+ ... ... +-----------------+ --
生成された鍵ファイルを確認します。
# ls -l /root/.ssh/ -- -rw------- 1 root root 1679 Jun 7 12:19 datasync -rw-r--r-- 1 root root 403 Jun 7 12:19 datasync.pub --
datasync が秘密鍵、datasync.pub が公開鍵となります。
2. XSERVERでSSH公開鍵を登録
XSERVERのサーバーパネルで、SSH設定を有効にし、SSH公開鍵を登録します。
XSERVERサーバーパネルのSSH公開鍵登録画面はこんな感じです。
公開鍵データの前に、「from=”<IPアドレス>” 」を追記することで、SSH接続時のアクセス元IPアドレスを制限することができます。
今回は、移行元であるラピッドサイトVPSのIPアドレスと、PCからSSH接続してコマンドを実行することを想定して、PC使用時のアクセス元IPアドレスを、カンマ区切りで指定します。
「PC使用時のアクセス元IPアドレス」がわからなければ、「現在使用しているグローバルIPアドレスを確認する」各種サイトにアクセスしてみるとよいでしょう。
(参考)
アクセス情報【使用中のIPアドレス確認】 – cman.jp
https://www.cman.jp/network/support/go_access.cgi
SSH公開鍵を登録します。
from="<移行元ラピッドサイトVPSのIPアドレス>,<PC使用時のアクセス元IPアドレス>" <公開鍵の内容>
3. SSH接続確認
SSH鍵を使用して、ラピッドサイトVPSからXSERVERにSSH接続できることを確認します。
XSERVERのSSHポートは、TCP/22 ではなく TCP/10022 ですので、-p オプションで 10022 を指定します。
# ssh -p 10022 -i <SSH秘密鍵のパス> <XSERVERのユーザー名=サーバーID>@<XSERVERのIPアドレス>
今回の前提条件では、次のとおり。
# ssh -p 10022 -i /root/.ssh/datasync examplex@203.0.113.10
SSH接続がうまくいかなければ、エラーメッセージを参考のうえ、原因を調査、対処しましょう。
考えられる原因は以下などです。
- 鍵ファイルのパスが正しくない。
- 鍵ファイルのパーミッションが 600 ではなく、他のユーザー、グループも参照可能となっている。
- 接続先情報、XSERVERのサーバーIDやIPアドレスが間違っている。
- 移行元サーバーのファイアウォールで、TCP/10022 宛ての通信が禁止されている。
4. rsyncでWebデータを転送
実際にWebデータを転送する前に、まず、–dry-run オプション をつけて、ファイル転送は実施せずに、rsyncコマンドの挙動を確認すると安心です。
また、時間がかかりそうなコマンド実行時は、timeコマンドをつけると、実行後に実行時間が表示されるので、同じような作業を実施する際の参考となります。
コマンドはこんな感じ。
# time rsync -rlptDv --bwlimit=3096 --dry-run \ -e "ssh -p 10022 -i <SSH秘密鍵のパス>" \ <移行元ラピッドサイトのDoucmentRoot>/ \ <移行先XSERVERのユーザー名=サーバーID>@<XSERVERのIPアドレス>:<XSERVERのDocumentRoot>
rsyncで移行元のSrcディレクトリを指定する際、末尾に /(スラッシュ)をつけることで、ディレクトリは含まず、ディレクトリ配下のみの転送となります。
–dry-run 以外のオプションについて補足します。
- -rlptDv
-r: 配下のディレクトリを再帰的にコピー
-l: シンボリックリンクをそのままコピー
-p: パーミッションをそのままコピー
-t: タイムスタンプをそのままコピー
-D: ブロックデバイス、特殊ファイルをそのままコピー
-v: コピー中のファイル名やサイズなどの詳細情報を表示
を意味します。
一般的には -av のみ指定することが多いですね。
-a は、-rlptgoD と同じです。
今回は、移行元サーバーと移行先サーバーのユ―ザー、グループ情報が異なるため、-g(グループ情報をそのままコピー)と-o(ファイル所有者情報をそのままコピー)を省略したかったので、-rlptDv としました。
この場合、今回は接続先として「examplex@203.0.113.10」を指定したので、移行先サーバーでのファイル所有者は、examplex となります。
- –bwlimit=3096
転送速度を 3096KB/sec=3MB/sec=24Mbps に制限。
ためしに短時間、制限をつけずにXSERVERに転送したところ、85Mbpsぐらいの転送速度が出たのですが、他のユーザーさんとの共用サーバーですし、ネットワーク帯域以外にも、サーバーのディスク書き込み負荷がかかるので、制限をかけてみました。
- -e “ssh -p 10022 -i /root/.ssh/datasync”
-eオプションで、SSH接続時のポート番号と、秘密鍵を指定するため、
XSERVERにSSH接続して、topコマンドを実行してCPU負荷を確認しつつデータ転送を行いましたが、CPU負荷には影響がないようでした。
cpuinfoコマンドやfreeコマンドで調べると、48CPU, メモリ256GBのハイスペックなサーバーだったので、数GBのファイル転送ぐらいは全く問題ないようです。
まとめると、今回の前提条件では、Webデータ移行のrsyncコマンド(dry-run)は、次のようになります。
# time rsync -rlptDv --bwlimit=3096 --dry-run \ -e "ssh -p 10022 -i /root/.ssh/datasync" \ /var/www/example.jp/ \ examplex@203.0.113.10:/home/examplex/example.jp/public_html
エラーがなく完了し、転送ファイルのリストと、転送バイト数、転送速度が出力されればOKです。
... sent 1685735 bytes received 204117 bytes 39786.36 bytes/sec total size is 6452842596 speedup is 3414.47 (DRY RUN) real 0m46.685s user 0m0.412s sys 0m0.819s
dry-runでの実行が問題なければ、–dry-runオプションを外して、ファイル転送を実行します。
# time rsync -rlptDv --bwlimit=3096 \ -e "ssh -p 10022 -i /root/.ssh/datasync" \ /var/www/example.jp/ \ examplex@203.0.113.10:/home/examplex/example.jp/public_html -- sent 6457529435 bytes received 1120877 bytes 2062478.15 bytes/sec total size is 6452842596 speedup is 1.00 real 52m10.927s user 3m13.660s sys 0m53.497s --
この例では、6457529435 bytes = 6.01GB のデータの転送に52分10秒かかりました。
転送速度は 2062478.15 bytes/sec = 15.74Mbps でした。
何らかの理由で、転送が途中で終了された場合は、再度同じコマンドを実行すれば、rsyncは差分同期ですので、未転送分と更新分のみ転送されます。
5. 確認
XSERVERにFTPやSSHでログインして、Webデータが正しく転送されたことを確認します。
厳密に確認するのであれば、移行元、移行先の両サーバーで、findコマンドを実行して、ファイル数やファイルリストに違いがないことを確認するとよいでしょう。
ファイル数の確認。
$ cd <DocumentRoot> $ find . | wc -l
ファイルリストの出力。
$ cd <DocumentRoot> $ find . > filelist.txt
XSERVERでは、ドメイン、サブドメインを作成したときに、初期ページ用データとして default_page.png と index.html ファイルが自動生成されるので、その分がファイル数やファイルリストの違いとなります。
不要であれば、これらのファイルを削除します。
XSERVER側でのWebサイトの表示を確認したのち、DNSレコード情報を変更して、XSERVERに切り替えれば、Webサイトのサーバー移行は完了となります。
なお、切り替え直前に、rsyncコマンドを再度実行すると、最新のWebデータが同期されます。
前回Webデータを転送してから移行元で更新されたファイルのみ、転送・反映されますし、–delete オプションをつけると、移行元で削除されたファイルが、移行先でも削除されます。
# time rsync -rlptDv --bwlimit=3096 --delete \ -e "ssh -p 10022 -i /root/.ssh/datasync" \ /var/www/example.jp/ \ examplex@203.0.113.10:/home/examplex/example.jp/public_html
※最初にrsyncを実行するときに –delete オプションをつけなかったのは、rsyncで移行先のディレクトリパス指定を間違ったときに、XSERVERの既存ファイルが誤って削除されないようにするため。
(余談)XSERVERのサブドメインの扱い
レンタルサーバーXSERVERは、コントロールパネルがわかりやすく、コストパフォーマンスがよく、ユーザー数が多いためネット上の情報が多く、とてもよいサービスだと思います。
ですが、サブドメインの扱いはイマイチだと思います。
ルートドメインが「主」で、サブドメインはあくまで、ルートドメインの付属、おまけ的な扱いのように感じます。
大きな問題としては次の2点。
1. サブドメインのDocumentRoot ディレトリが、ルートドメインのDocumentRootの下の階層
2. アクセスログがルートドメインもサブドメインも同じファイル
1. については、
サブドメインのDocumentRoot ディレトリが、ルートドメインのDocumentRootの下の階層になってしまうのが残念です。
例えば、今回の前提条件に従うと、、
https://example.jp/ は
DocumentRoot: /home/examplex/example.jp/public_html
https://subdomain.example.jp/ は
DocumentRoot: /home/examplex/example.jp/subdomain/public_html
のようになります。
この場合、https://example.jp/ のDocumentRootに .htaccess を設置すると、サブドメインサイトにも設定が効いてしまいます。
例えば常時SSL化のリダイレクトを記載すると、記述方法によっては、サブドメインサイトもHTTPSページにリダイレクトされてしまいます。
また、https://subdomain.example.jp/ の内容が、https://example.jp/subdomain/ でも見えてしまうという問題もあります。
ルートドメインやサブドメインの .htaccess の記述で回避する方法がありますが、この問題のためだけに工夫しなければならないのは、悩ましいところです。
2. については、ログの先頭にアクセス時のドメインもしくはサブドメイン名が記録されているので、どのサイトにアクセスがあったかの区別はつきます。
ですが、同じファイルなので、アクセスが多い場合や、サブドメインが多い場合は、動作確認や調査がしにくいです。
ルートドメインと全く別のWebサイトを運営するためにサブドメインを用意するのですから、ルートドメインとサブドメインは疎関係でよいはずです。
さくらのレンタルサーバーやmixhostなどの他社レンタルサーバーサービスのように、サブドメインのDocumentRootは自由に設定できればよいのですが。。
おわりに
Webサイトをレンタルサーバーへ移行する際も、クラウドサーバーやVPSサーバー間の移行と同様に、rsyncを使うことで迅速にデータ移行ができます。
また、Linuxサーバーのコマンドに慣れていれば、.htaccess の編集など、レンタルサーバーでもSSHでログインしてコマンドで操作するほうが、やりやすいことがわかりました。
XSERVERに限らず、現在、レンタルサーバー各社ではマルチドメインで、無料のSSLサーバー証明書を取得、使用できます。
2020年11月にCentOS 6のサポートが終了することもあり、2019年から2020年にかけては、サーバーを移行しなければならないWebサイトも多いと思います。
サーバー費用が安価で、サーバー構築と保守をサービス業者に任せられるので、移行先としては、レンタルサーバーはよい選択肢となります。