WordPress をとにかく速くする (WordPress Advent Calendar 2011 20日目)

12月25日まで毎日ブログをつないでいく WordPress Advent Calendar 2011、20日目担当 @wokamoto です。
@mypacecreator さんに引き継いでいただきました!ドキドキ。
そんな、@mypacecreator さんのエントリはこちら。
3大「WordPressに慣れていない人がやってしまいがちだけど、こっちのほうがいいのになぁ」って思うこと

去年は PHP Advent Calendar に参加して「匿名関数と無名関数 (PHP Advent Calendar 2010 16日目)」って記事を書いたんですが、今年は WordPress Advent Calendar に参加します!

そんなわけで、(一部の)みんな大好き WordPress のハイパフォーマンスチューニングの話題。
このサイト dogmap.jp で行っている施策について書きますね。

バックエンドの高速化

nginxこのサイトは Amazon EC2 東京リージョンのマイクロインスタンス1台で稼動しています。
使用できるメモリ量が613MBとやや少なめなため、Web サーバは軽量高速で定評のある Nginx を採用しています。

Nginx は Apache のようにリクエストの処理をスレッドで行わず、非同期のアーキテクチャーを用いるイベントループモデルを採用しています。
そのため、多数のリクエストがきた場合に実行スタックをコピーする必要があるスレッドモデルのサーバと違い、1プロセスでリクエストを処理できるため、メモリ消費量が極端に少なくてすむという利点があります。
なんで Nginx って、そんなに速いの?ってのは、以下の記事を読むとわかり易いです。
さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き) | さくらたんどっとびーず

このサイトでは WordPress が動的に生成するコンテンツについては Nginx のリバースプロキシキャッシュを利用して配信しています。
そこで問題になってくるのが、新規投稿時にキャッシュファイルを生成しなおすことなんですが、それには Nginx Proxy Cache Purge プラグインを使っています。
他にも、さらに高機能な NGINX Manager って、プラグインもありますね。
こっちは、キャッシュパージしたログを管理画面から見ることができます。
Nginx に ngx_cache_purge モジュールを組み込んでおいて、これらのプラグインを使えば安心ですね。

PHPPHP は eAccelerator を使って、中間コードをキャッシュすることにより、高速化させています。
PHP アクセラレータとしては、他にも APC も有名ですが、僕は好みでこっちを使ってます。
eAccelerator 可愛いよ、eAccelerator。

perconaMySQL サーバとしては Percona を使ってます。
Percona は MySQL の派生プロダクトで、公式ビルドには含まれていない人気のあるパッチを追加したものです。
高負荷時の InnoDB のパフォーマンスを向上してくれるパッチなんかが含まれています。
WordPress が使用しているテーブルのデータベースエンジンは InnoDB に変更済み。
関連記事表示に Yet Another Related Posts Plugin (YARPP) を使用してる場合は、wp_posts だけは MyISAM を使いましょう。
# YARPP を導入すると post_title と post_content に FULLTEXT インデックスが張られちゃうので、InnoDB にできないため。
あと mysqltuner.pl を使って、パラメータチューニングしたりしてますね。

さらにオブジェクトキャッシュ(Object Cache)のバックエンドとして、Memcached Object Cache も採用しています。
オブジェクトキャッシュとは、生成に負荷のかかる複雑なデータベースクエリなどをキャッシュするための仕組みですが、通常1セッション中でしか有効になりません。
ただし Memcached Object Cache などのドロップインを使用することで、このオブジェクトキャッシュされたデータを memcached 上に保存しておき、永続的に使うことができます。
これにより、大幅に MySQL サーバへのクエリ発行数を低減する事ができ、パフォーマンスを向上させることが可能なのです。素晴らしい!
オブジェクトキャッシュされたデータを削除したりするには、WP Cache Inspect ってプラグインが便利です。
現在、キャッシュされてるデータの統計を表示したりもできます。

「ドロップイン」って何?って思った方は、こちらを参照してください。ドロップインは特殊なプラグインのことですが、色々デキまっせ。
WordPress 3.0 プラグイン管理画面の「追加機能」

併せて、翻訳ファイル ja.mo の読み込みをオブジェクトキャッシュにキャッシュするプラグイン MO Cache も利用しています。
MO Cache については WordPress Advent Calendar 2011 の10日目で @m4i さんが、詳しく解説してくれてますね。
WordPress をたった3分で3倍高速化する方法 [MO Cache] – カワイイはつくれる
同じコンセプトのプラグインで、@jim0912 さんがリリースしている 001 Prime Strategy Translate Accelerator ってのも有るんですが、こっちはキャッシュデータをファイルか APC の共有メモリに保存するタイプです。
僕とこでは APC 使ってないので、Memcached Object Cache にキャッシュデータを置いておける MO Cache を使わせてもらいました。

フロントエンドの高速化

フロントエンドの高速化は、自作のプラグイン Head Cleaner を利用しています。
このプラグインでは、以下のことができます。

  • <head> 内の要素の並べ替え
  • JavaScript, CSS のミニファイと結合
  • HTML ソース全体から、コメント・改行・連続した空白を消去(パラノイアモード)
  • OGP タグの挿入

当サイトのソースを見てもらえばわかるのですが、とんでもないことになっていると思います。

あわせて

  • テキストファイルの gzip 圧縮転送
  • 静的ファイル(css, js, 画像)に有効期限を設定 (Expired ヘッダを付加)

等も行っています。

CloudFlareまた、静的ファイルについてはドメインを static.dogmap.jp に設定し、さらにそれを無料の CDN CloudFlare から配送するように設定してあります。
CloudFlare を導入するためにはドメインの DNS サーバー情報を書き換える必要があるため、「サイトを運営するドメインの管理者であること」が必須条件になりますが、WordPress を独自ドメインで運用してる人なら問題無いですよね?
導入については、以下の記事が参考になるでしょう。
今すぐ使える!CDN ~はじめてのCloudFlare(クラウドフレア)導入~ – SINAPlog

アクセス数そんな多くないブログなのに、色々頑張ってるわけですね。

明日は @naonyan_taicho さんです、よろしく!

WordPress をとにかく速くする (WordPress Advent Calendar 2011 20日目)」への2件のフィードバック

  1. ピンバック: WordPress Advent Calendar 2011 まとめ | わーどぷれすっ!

  2. ピンバック: 2011年12月25日ブックマーク集 | bl6.jp

コメントを残す

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