WordPressのサーバ移転(FQDN変更なし)を行った
きっかけは、さくらインターネットのサービスの内向きな姿勢だった。
このWordpressサイトは、数年にわたってさくらインターネットに借りたVPSを使って運営していた。しかしベトナムに引っ越して約二年、いいかげんOSヴァージョンも古くなったVPSを移転させようと思ったところで問題が起こった。
最近、さくらインターネットでは日本国外在住者でも各種サービスの契約ができるように約款を変更していたのだが、ユーザ情報の登録は日本国内の住所と電話番号でしかできないし、VPSサーバを新規デプロイするには電話認証が必要となっている。
どういうことかと問い合わせたら、まさかの「仕様です」的な回答。これはもう、解約するしかないだろう。日本企業はとにかく日本国内のことしか考えていないから、海外に住むならさっさと捨てたほうがいいのだ。
移転先は、もう1台のVPSを借りている digitaloceanも考えたのだが、vultr.comという業者が同価格帯のVPSをリリースしており、東京リージョンもあることを発見。1業者2台よりも2業者2台のほうが安全だろうとそちらに新しいサーバを作ることにした。
(※:この記事執筆後、1年を待たずしてVultrからまた引っ越すことになりました。Vultrは最悪のVPSプロバイダです。使ってはいけません)
さて、ようやく本題。今回、Wordoressを、別サーバかつFQDN変更なし(ドメイン、サブドメインを維持)のままで移転させるにあたって、行った作業の順序は以下である。
- 新サーバの契約と、apache, mysqlなどの基本設定を実施
- 新サーバにて、最低限 WordPressが動くことを確認(移転前に削除)
- 旧サーバからのファイルサルベージ
- 新サーバにサルベージファイルを入れ apacheの DocumentRootの設定をする
- 旧サーバからのDBサルベージ
- 新サーバへDBインポート
- 動作確認及び微調整
1と2については、特に説明する必要もないだろう。契約するサーバ業者によっても、OSによっても作業内容は異なるのだし。そもそも本記事は技術解説ではなく、読み物のつもりだから割愛させて頂く。
さて、3以降である。今回、FQDNを活かしたまま別サーバへの移転がしやすいように、宅内のDNSサーバを利用し、そのゾーンファイルを修正するだけで、同じURLへのアクセスが、新サーバ/旧サーバのどちらに向くかを簡単に切り替えられるようにした。物理的な移転作業が完全に終わってから、本番のDNSをかきかえてやればいいのである。自宅にDNSがないとか自分の管理するドメインでないとかであれば /etc/hosts を利用すればいいだけだ。
実際の3.の作業としては rsync を利用した。旧サーバのファイルをまるまる新サーバにコピーして、ファイルの所有者情報だけを書き換えてやればいい。この作業で問題が起こることはないだろう。
4.の作業も特に説明はいらないだろう。
今回、色々手間がかかったのは5以降である。データベースのインポート/エクスポートに関しては phpmyadminを使用したのだが、旧サーバのデータベースが約750MBと肥大化しすぎていて、phpが扱えるメモリサイズなどを変更しても全く手が立たなかった。
画像はサンプル……実際はサイズ欄が256MBを超えているテーブルさえあった。
私はデータベースに関してはド素人なのだが、いろいろ調べて/考えてみると、どうも wordpressのログイン履歴管理やアクセスカウンターのデータがほとんどを占めているようだった。まぁバックアップもあるし、と思い切って phpmyadmin上から、プラグイン名を含むテーブルをどんどん削除し、データベースの最適化をかけると20MBほどまでに絞り込めた。これでエラーも出なくなり、エクスポートは完了である。
なお、 debian では、apacheから叩く場合の php の php.ini は、 /etc/php/{version}/apache2/php.iniである。間違えないように。
次は6.の、新サーバへのDB復元である。ここで一度ハマったのは、phpmyadminに rootでログインできない事だった。これは wordpress同様に mysql のパスワードを従来の型に変更してやればOKだった。rootでログインしたら、動作確認用に入れた新しい wordpressサイトのデータベースを削除し、エクスポートした旧サーバと同じ名前の空データベースを phpmyadmin上から作って、その中に旧サーバのデータベースダンプファイルを復元させてやればいい。
mysql_native_passwordになっていないと、wordpressや phpmyadminからログインできない。
しかし一番の問題は、その後の動作確認・調整だった。本番のDNSも修正し、完全にサーバ移転が終わったかと思いきや、Wordpressのトップページ以外の各記事がすべて404になってしまい見えなくなるという現象が発声した。調べてみると、mod_rewiteが動いていない、.htaccessが動いていない、Wordpressの「パーマリンク設定」がおかしい、のいずれかが原因である。
パーマリンク設定がおかしくなっているなら、それを修正したうえで、あるいは修正しなくても、一度ダッシュボード→設定→パーマリンク→「パーマリンクの更新」をしてやれば、キャッシュ的なものがクリアされる、というあやしげな情報(いわゆる「おまじない」系のネタ)をあちこちでみたのだが、私のケースでは、「.htaccessが動いていない」が原因だった。今回のサーバ移転で Apacheのバージョンが 2.2系から 2.4系に変わったのだが、2.4では、.htaccessを動かすための設定が変わっていたのであった。
Apache2.2
AllowOverride ALL Order allow,deny Allow from all
↓
Apache2.4
AllowOverride ALL Require all granted
wordpressのサーバ移転のあとで
「パーマリンク設定」を
「基本 http://example.com/?p=123」にするとページが見れるが
その他の形式にすると404が発生する
という場合、まず間違いなく .htaccess もしくは mod_rewriteの問題である。へんなおまじないに騙されずに、しっかりと問題に向き合わないといけない。
さて、これらの問題をクリアし、サイトのssl化も行って、今回の移転作業はおしまいである。wordpressの移転作業は初めてのことで、移転が簡単にできるプラグインがどうだ、バックアップのリストアがどうだ、といろいろ調べてみたものの、結局はコマンドラインをバチバチ叩いたりするのが一番シンプルで楽だった(まぁ、phpmyadminは使ったけどさ)。せっかく移転させたので、今後はもうすこし記事を書くようにしようかな、などと思っている。