WordPress on Google App Engine by php72

前回、Google App EngineからDBへの接続部分を検証したので、今回は実際にGAE上でwordpressを動かしてみる。DBはGCE上のMySQLでもCloud SQLでもどちらでもよいので好みで。ただ、f1-microでMySQLを動かすのはあまり安定しなかったので、GCEでやる場合でもg1-smallくらいは使った方がよさそう。そうすると金額的にはf1-microのCloud SQLでいいかなって感じになるね。g1-smallのプリエンプトインスタンス2つでレプリさせる形でも動かないことはないと思うけど。

GAEでwordpressを動かす場合、バージョンアップやモジュールの更新をどうするか考える必要がある。CLIでやる方法も用意されているようだが、今までGUIで出来たのだから今後もそうしたい。幸い当サイトはマルチサイトで動作させているので、本番環境はGAEで動かして、uploadに使うGCE上でもステージ環境として別ドメインで動作させるつもり。DBはどちらも同じものを使う。Cloud SQLの場合、GCEサイトはcloud_sql_proxyを使ってDBにアクセスする。GCEサイトからwordpress更新は行う。

話を戻して、現在動作しているwordpressをGAE上にアップロードする。php5とphp7のものがあるようだが、GCEで動かすことも想定しているのでphp7を採用する。また、GAEの無料枠で運用するためにスタンダード環境のインスタンスを使う。php-docs-samplesの中にそれぞれの環境用のモジュールがあるので、その中のphp72用サンプルを使用する。まずは参考までにwordpress-projectを生成するが、それを既存のものに差し替えて必要な変更を適用する。作業はGCEに構築したubuntu上で行うものと仮定する。

cd /usr/local
 git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
 cd php-docs-samples/appengine/php72/wordpress
 curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 apt install -y php-xml php-zip
 composer install
 php vendor/bin/wp-gae create

createコマンドでプロジェクト名やリージョン、DBアクセス情報等を聞かれるので適宜答える。my-wordpress-projectというサンプルが出来るので、これを参考にして既存サイトを改造する。既存サイト側でキャッシュ系のモジュールを無効にしてからmysqldumpをして、GAEで使うDBにインポートしておく。さきほど生成したmy-wordpress-projectをリネームして消さないようにしておく。既存サイトのwordpressを同ディレクトリにコピーする。生成したwordpressの方からyamlファイルをコピーする。

mv my-wordpress-project _my-wordpress-project
cp -rp /usr/local/wordpress .
cp _my-wordpress-project/*.yaml my-wordpress-project

あとはwp-config.phpをGAEで動作するように修正する。マルチサイト運用の場合、DOMAIN_CURRENT_SITEという変数があるので、GAEドメインに合わせて変更する。あとはGAEかどうか判定してDB設定が切り替わるようにする。wp-config.phpの冒頭に判定用の処理を追加する。DB設定はもともとの場所を差し替える形でよい。ローカルのDB設定は、GCE上でcloud_sql_proxyを動かして使うイメージ。現時点ではまだ使わないので、とりあえず適当な設定のままでもよい。

vi wp-config.php
    :
if (isset($_SERVER['GAE_ENV'])) {
    $onGae = true;
} else {
    $onGae = false;
}
    :
if ($onGae) {
    define('DB_NAME', 'wpdata');
    define('DB_HOST', ':/cloudsql/gcp-9999:us-central1:db1');
    define('DB_USER', 'wp');
    define('DB_PASSWORD', 'password');
} else {
    define('DB_NAME', 'wpdata');
    define('DB_HOST', 'gce1');
    define('DB_USER', 'wp');
    define('DB_PASSWORD', 'password');
}

wp-config.phpにてGAEドメイン用の変更を加えたが、同様にDBでもGAEドメインに変更するレコードがある。wp_blogsに入っている対象サイトに該当するレコードのdomainと、wp_optionsの1〜2レコード目に入っているsiteurlとhomeに該当するoption_valueのURLだ。この辺り修正しておかないと、マルチサイトの場合、リダイレクトしまくることになってサイトを表示することが出来ない。まあ、GAE移行の問題ではなくてドメインが変わることの問題なんだけど。準備が出来たらgcloudコマンドでdeployする。

gcloud app deploy app.yaml cron.yaml

やたら時間かかるなあと思ったら、画像ファイル系も含まれていることに気が付いて削除。wp-content/uploadsのあたりね。もう一度打ってみたら今度はすぐにdeployが始まった。それが終わると指定されたURLで無事動作確認ができた。意外とサクサク動くんだねえ。実は自作したモジュールがGAE上ではエラーになってて、この機に修正。それ以外は特に問題らしい問題も起きず。ただ、若干GCEで動かす方が早いかなあ。特にキャッシュ系のプラグインが有効な2回目以降は圧倒的。

php5の頃はmemcacheを使う形でキャッシュ処理も出来ていたみたいなんだけど、php7版だとそれは使えないっぽいし、どうしたらいいんだろう。エッジキャッシュは使えるらしいけど、任意のタイミングでキャッシュクリア出来ないのがちょっと怖い。自分でキャッシュサーバ立てるのがいいのかなあ。性能で言えばGCEで動かす方が速いから、GAEを使うのは無料枠を少しでも使いたいがためw とはいえ、キャッシュ周りで有効な方法を見つけられなければ、GCEで動かすしかなさそう。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)