COLUMN
ホームページのサーバー移行手順|切り替え前に15ページをバイト数まで突き合わせた
このサイト(container.choregate.com)を、10月25日の深夜に別のサーバーへ移しました。
DNSを切り替えてから定期実行を新しいサーバーへ移し終えるまで、かかったのは6分です。
記事・問い合わせフォーム・設定のデータは1件も欠けず、URLも1本も変わっていません。
短く済んだのは、切り替えの前日までに「新しいサーバーで同じ画面が出るか」を確かめ終えていたからです。
このコラムでは、ホームページのサーバー移行を私たちがどんな手順で進めたか、どこで止まりかけたかを書きます。
レンタルサーバーやVPSの引っ越しを控えている運営者の方に、確認の順番として使ってもらえたらと思います。
サーバー移行の手順は「写す・確かめる・切り替える」の3段階にした
移す前のサーバーは、他社のサイトも同居するVPSでした。
入るにはVPNが必要で、作業できる時間と人が限られていました。
移行先はクラウドのサーバーで、このサイト専用のユーザーと専用のデータベースを用意しました。
手順は大きく3つに分けました。
1つめは、今のサーバーを読むだけにして、ファイルとデータベースを新しいサーバーへ写すこと。
2つめは、DNSを変えないまま、新しいサーバーの画面を今のサーバーと突き合わせること。
3つめが、DNSを切り替えて、定期実行とメールの行き先を新しいサーバーへ移すことです。
3つを同じ日にやらないのがいちばん大事だと私は思います。
写した日と切り替える日を分けておけば、確かめる段階で何か見つかっても、今のサイトは何事もなく動き続けます。
実際、写したのが10月24日の夕方、切り替えたのが25日の深夜です。
移行前に、今のサーバーと移行先の違いを表にした
最初にやったのは、作業ではなく下調べです。
今のサーバーと移行先を、PHPの版・データベースの版・Webサーバーの動かし方・定期実行・メール・時刻設定など12の項目で並べました。
並べてみると、違いは思っていたより多くありました。
- PHPは8.3から8.5へ、データベース(MySQL)は8.0から8.4へ上がる
- PHPの動かし方が、Apacheに組み込む形から、サイトごとに別のプロセスで動かす形に変わる
- 移行先には、定期実行(cron)の仕組み自体が入っていない
- 移行先は、外へメールを送る25番の通信が既定で塞がれている
- データベースの時刻が、今は日本時間、移行先は世界標準時
どれも、写しただけでは気づきにくいものです。
画面は表示されるのに、夜間のバックアップが動かない、問い合わせの通知メールが届かない、という壊れ方をします。
表にしたことで、確かめる項目がそのまま決まりました。
PHPの版が上がる件は、サイトの全PHPファイルを新しい版で構文チェックして、エラーが0件であることを先に確かめました。
非推奨の警告が1件だけ出ましたが、テスト用の部品で、サイトの表示では読まれないものでした。
見落とすと止まるもの:設定ファイル・時刻・メール
表の中で、そのまま写すと確実に止まるものが3つありました。
1つめは、Apacheの設定ファイル(.htaccess)です。
先頭の5行に、アップロードできるファイルの大きさなどをPHPに伝える書き方が入っていました。
この書き方は、PHPを別のプロセスで動かす移行先では解釈できず、サイト全体が「500 Internal Server Error」になります。
5行を「Apacheに組み込む形のときだけ読む」という条件で囲み、同じ値は移行先のPHPの設定で与えました。
こうしておくと、同じファイルが今のサーバーでも移行先でも動きます。
2つめは時刻です。
コンテナには、データベースの「今の時刻」を使って公開期間を判定する箇所が23か所あります。
データベースが世界標準時のままだと、予約公開した記事が9時間ずれて出てしまいます。
移行先のデータベースを日本時間に合わせてから写しました。
3つめがメールです。
問い合わせの通知・自動返信・監視の通知は、どれもサーバーからメールを送っています。
送信の制限を解除する申請をして、送信元のドメインの設定(SPFとDKIM)に新しいサーバーを足しました。
切り替えた後にテストで1通送り、受信箱に届くこと、迷惑メールに振り分けられないことを確かめています。
DNSを変える前に、15ページをバイト数まで突き合わせた
写す作業では、今のサーバーを読み取りだけにしました。
ファイルはまとめて新しいサーバーへ流し込み、途中で私たちのPCにも今のサーバーにも写しを残していません。
夜間バックアップの古い世代(約1.3GB)は写さず、実際に運んだのは約250MBです。
写した後の確認は、目で見るより数で比べるほうを選びました。
- ファイル:8,082ファイルが今のサーバーと一致
- データベース:全テーブルの件数が一致(違いは、写している最中に増えた監視の計測6件だけ)
- 画面:トップ・コラム一覧・機能ページなど15ページと、記事・事例・画像・CSSを、HTTPの応答コードとバイト数で比較して全部一致
- トップページのHTML:今のサーバーとの差分が0行
DNSを変えずに新しいサーバーの画面を見るには、手元のPCだけ行き先を新しいサーバーに向ける方法を使いました。
世の中の人は今までどおり今のサーバーを見ていて、私たちだけが新しいサーバーを見ている状態です。
この状態で、管理画面とお試し環境(/demo/)が開くことも確かめました。
バイト数まで一致していると、「見た目は同じだけど、裏で何かが抜けている」という心配がほぼ消えます。
以前のCMS移行で、見た目が同じなのに裏側だけ壊れていた経験があるので、ここは時間をかけました。
切り替えは深夜2時の6分間。DNS・証明書・定期実行の順
DNSの書き換えは、ドメインの管理画面でAレコードを1本変えるだけです。
このサイトのDNSの有効期間(TTL)は900秒、つまり15分です。
1時54分に、ドメインの権威サーバーとGoogle・Cloudflareの公開DNSのどちらからも新しいサーバーの住所が返るのを確かめました。
次がSSL証明書です。
DNSが新しいサーバーを指したのを確かめてすぐ取得し、1回で通りました。
http のアクセスは https へ転送されること、トップ・コラム一覧・robots.txt が正しく返ることを見て、証明書は終わりです。
最後が定期実行です。
ここを忘れると、同じ処理が2台のサーバーで二重に走ります。
夜間バックアップやメール通知が二重になるのを避けるため、新しいサーバーの定期実行は、切り替えるまで全部止めておきました。
2時00分から2時06分の間に、前のサーバーの3行を止めて(元に戻せるよう控えを残して)、新しいサーバーの側を動かしています。
2時05分には、新しいサーバーで監視の集計が成功したのを確かめました。
このとき、止めた3行のうち1行は、前のサーバーにも存在しないファイルを10分ごとに呼んでいたことに気づきました。
ずっと空振りしていた設定です。
引っ越しは、こういう古い設定を見つける機会にもなります。
切り替えた後にやったこと
2時の夜間バックアップは、ちょうど切り替えの隙間に当たって走りませんでした。
コンテナの定期実行は、時間を過ぎた処理を後からまとめて実行しない作りです。
そのため、手でバックアップを1回実行して、124MBのバックアップができたことを確かめました。
次に、前のサーバーと新しいサーバーのデータの差を比べました。
記事・フォームの申込・設定といった中身は全部一致していました。
違っていたのは、アクセス記録(前のサーバーが3件多い)と、監視の計測、不審アクセスの記録(新しいサーバーが1件多い)だけです。
ここでデータベースを取り直すと、新しいサーバーで記録された分が消えてしまいます。
アクセス記録3件の欠けは小さいと判断し、取り直さないことにしました。
切り替えた直後から、設定ファイル(.env)を盗み見ようとする機械的なアクセスが新しいサーバーに来ています。
どれも403で止まっていることを確かめました。
住所が変わったことは、攻撃する側にもすぐ知られると思っておいたほうがいいです。
前のサーバーのファイルとデータベースは、2週間ほど消さずに残します。
何かあればDNSを元の住所に戻すだけで、15分以内に元のサイトに戻せます。
コンテナで運用しているサイトの運営者がすること・しなくていいこと
今回の移行で、記事を書く・画像を入れる・お知らせを予約するといった管理画面の操作は、何も変わっていません。
URLも同じなので、検索結果やSNSに貼られたリンクもそのまま使えます。
コンテナは、ファイルとデータベースを写せば同じ画面が出る作りなので、運営者の方に記事を入れ直してもらう作業はありません。
サーバーを移すときに、運営者の方に確かめてほしいのは次の3つです。
- 問い合わせフォームから1通送って、通知メールが届くか
- いつもの場所から管理画面にログインできるか(接続元のIPで制限している場合)
- 予約公開した記事が、予定の時刻に出るか
バックアップの取得と戻し方はDB・バックアップ/メンテナンス、PHPやデータベースの版はサーバー情報の画面で、移行の前後に管理画面から確かめられます。
夜間バックアップや監視のような決まった処理はcronマネージャーで一覧でき、切り替えの後に「最後にいつ成功したか」を見るのに使いました。
今のCMSからの乗り換えを考えている方は、WordPressからの移行・脱WordPressのページもあわせて見てください。