WordPress で構築してたサイトを Heroku に移行させた
会社のサポートページが WordPress で構築されているのだが、これがよくわからないさくらの VPS にデプロイされていた。 OS が Ubuntu 12.04 でサポート切れ目前なのだが do-release-upgrade するよりは Heroku かなんかに引っ越してしまえばいいと思ったのでそうした。
- KUSANAGI for さくらのVPS
- WordPress.com
- その他ごまんとある WordPress ホスティングサービス
を使うという手もあったんだろうけど、それはそれでめんどうそうだし自分達の運用ノウハウがある Heroku がよかろうという感じで決めた。
移行で実際にやること。
- 画像を S3 に上げる
- Heroku に WordPress デプロイ
- DNS 切り替え
まあこれだけなんだが、 1. は地獄である。
これについては実際のデータを見てほしいのだが、 wp_postmeta というテーブルの meta_value というカラムには例として以下のようなカラムが入っている(見やすくするために改行してます)。
a:4:{
s:5:"width";
i:2630;
s:6:"height";
i:1762;
s:4:"file";
s:44:"2017/01/d7ec2d3fea4756bc1642e0f10c180cf5.png";
s:10:"image_meta";
a:12{
s:8:"aperture";
s:1:"0";s:6:"credit";
s:0:"";
s:6:"camera";
s:0:"";
s:7:"caption";
s:0:"";
s:17:"created_timestamp";
s:1:"0";
s:9:"copyright";
s:0:"";
s:12:"focal_length";
s:1:"0";
s:3:"iso";
s:1:"0";
s:13:"shutter_speed";
s:1:"0";
s:5:"title";
s:0:"";
s:11:"orientation";
s:1:"0";
s:8:"keywords";
a:0:{}
}
}
えっ?なんだこのシリアライズ形式は。 WordPress が 15 年近く開発を継続されている CMS だと感じる瞬間である。画像を S3 に逃がすには WP Offload S3 というプラグインを使うのがよいのだが、過去画像について配慮してくれる機能はない。
WP Offload S3 は画像をアップロードするたびに wp_postmeta に上記の謎のシリアライズ形式で S3 に保存したよみたいな情報を保存してくれる。なので過去画像については自分で S3 にアップロードした後 wp_postmeta にそのデータを自分で insert すればよい。
ここで注意しなければならないのが、検索して出てくる情報は全て信用ならないということである。たいてい嘘か勘違いか古い情報が書かれている。すぐにデータベースをロールバックできる環境を作ってヒューリスティックになんども適当にやるのがよい。
過去記事に関しては、単に画像の URL を書き換えればいいだけなのでまあ sql の replace 構文かなにかを使って update をすれば一瞬。
Heroku へのデプロイはどうかというと、 wordpress ぐらいであれば push すれば動く。もし document root をプロジェクトのトップディレクトリ以外に変えたい場合(PHP だとそういうことは多いだろうし、実際僕は今回変えた)でも Heroku 側でサポートしてくれて Procfile を設置して
web: vendor/bin/heroku-hhvm-apache2
とかなんとか書けばいい。ローカルと Heroku で設置するファイルをちょっと変えたいみたいな需要もあるかもしれない(俺にはあった)。その場合はこの Procifile で apache 起動する前にふつうに cp コマンドとかでコピーするように設定すればいいだろう。
ちなみに上記のとおり Heroku では hhvm が使える。使えるのだが 3.5.1 とかなり古いので、まあ素直に PHP7 使ったらいいです。
なんか変なことしたい人は Container Registry 使ったらいいんじゃないですかね。
WordPress を Heroku に置くメリット
うちの会社の都合として Heroku に慣れてるというのがあった。それ以外に最大のメリットとしては Review Apps が使えるというのがあると思う。
デザインの変更の Pull Request の度に検証環境が立ち上がるようになるので、レビューとかはしやすくなるだろうと思う(とはいえまだサポートページの WordPress は Review Apps 有効化してない)。
感想
本当に WordPress と PHP は地獄で辛かった。