追記:2015/05/01
WordPress HTTPSと、Nephila clavata (絡新婦)を使って、複数ドメイン+S3メディアで運用すると、正常にS3にアップロード出来ないことがありました。原因はまだ深堀りできてないです。そこで、別のプラグインでS3にアップロードするようにしてみました。
使うプラグイン
Nephila clavata (絡新婦)の代わりに、Amazon S3 and CloudFrontを使用します。設定方法なんかは、あまり変わりません。
Amazon S3 and CloudFrontの注意点
Nephila clavata (絡新婦)と同様に、メディアを自身のサーバとS3にアップロードしてくれるという点では同じですが、Amazon S3 and CloudFrontは既存のファイルに関してはなにもしてくれません。Pro版でそういった機能が使えるよーみたいのは書いてありましたが。なので、すでに動いてしまっているサービスの場合、手動でS3へのアップロードと、DBのデータ修正をする必要があります。
S3へのアップロードは、単純にwp-content/uploads
ディレクトリをアップロードするだけです。
DBのデータ修正というのは、このメディアファイルはS3にあるよーというのをAmazon S3 and CloudFrontプラグインに教える必要があるためです。形式は以下のとおり。
- テーブル : wp_postmeta
post_id | meta_key | meta_value |
---|---|---|
wp_posts.ID | amazonS3_info | serializeデータ |
コードで書くならこんな感じです。
$data = (
'bucket' => 'bucket-name', // S3バケット名
'key' => 'wp-content/uploads/ファイル名',
'region' => 'ap-northeast-1', // 東京
);
sprintf(
'insert matome_postmeta (post_id, meta_key, meta_value) values (%d, "%s", "%s"); ',
$post_id,
'amazonS3_info',
serialize($data));
これで、今のところ上手くスケールアウトしつつメディアはS3で単一という構成ができています。
追記終わり。
WordPress便利ですよね。カスタマイズしていくと、色々大変ですが。そんな便利なWordPressですが、うっかりすると大変重く、死ぬことがあります。キャッシュさせるとか方法は昔から色いろあるんですが、インフラレベルで、対応できたほうが良かろうもんということで、WordPressをスケールアウトさせてみました。
目指した最小構成
AWSのELB + EC2 + RDS + S3です。管理画面だけ別ドメインとしてサーバを切り出しています。これには理由があります。すでに稼働しているWordPressをスケールアウトさせるには、すでにアップロードされている画像の処理に困ってしまうためです。
まっさらな状態でスタートする場合は、管理画面を特に分けずともいけるかもしれません。ただ、分けておくと便利なこともあるので、この構成をお勧めします。
RDSに関しては、単純にインスタンス作ってデータベースの接続情報を入力するだけなので簡単ですね。ElasticCacheのmemcachedを使って、フロントのキャッシングをさせたりするのも良いですね。
使うプラグイン
この2つのプラグインを使用します。
Nephila clavata (絡新婦)
もうネーミングが良いですね。このプラグインは、画像などのメディアファイルをAWS S3にアップロードしてくれるやつです。S3にアップロードするプラグインは、他にもありますが、ひと味違います。
- 既存の画像もS3にアップしてくれる
- S3と今までどおりサーバ上、両方に保存する
- プラグインを無効にした場合、サーバ上の方に切り替わる
これによって、途中からS3に切り替えた場合でも対応できます。ただし、既存の画像をS3にアップするのは、ユーザがページを閲覧した時the_content
wp_get_attachment_url
のフィルターフックを使って行っているので、予めS3にファイルをアップロードさせておいたほうが、負荷は少なくなるでしょう。
設定の仕方も、AWSのAccess Keyやバケット名を入力するだけなので簡単です。
WordPress HTTPS
WordPressは、wp_options
テーブルに保存されているoption_name=siteurl
なURLが絶対的な権力を握っているため(嘘)、Apacheなどで別ドメインを割り当てて管理画面にアクセスすると、本来のURLにリダイレクトして戻されてしまします。本当に面倒ですね。
そこで、WordPress HTTPSプラグインを使って、管理画面に別ドメインを割り当てることにします。
設定方法も簡単で、プラグインを有効にした後、HTTPSの設定から別ドメインを入力するだけです。