WordPress を使い始めてから、Apache が固まる事象が多くでてるのです。このblogだけ停止する程度ならいいんですけど、他にも使っているユーザーもいるので、とても困るのです。
エラーとしては MaxClients までいってるぜ親分、的なエラーなのでMaxClients をあげるものの、際限なくリソースを使っていくんです。したがって、MaxClientsをあげればあげるほど、サーバ自体のリソースが無くなって、一度は OSまで落とされました。MaxClients=150 程度で落ちるなんてどないやねん。
ちなみに、我が家は Debian etch+PHP5 を選択しているため、困ったことに、Apache2 の mpm-prefork (Multi Process) しか使えないので、MaxClients をあげるとあげた分だけ 10M弱 Memory が取られていってるわけです。せめて、Multi Thread なら、とか考えたこともありましたが、これも我が道と考え、対応策を考えました。
[原因]
- WordPress にしてから落ちるようになった
- WordPress と MySQLの組み合わせをチューニングしていないからではないか
ということで、全部、WordPress の所為にしました。
[考慮点]
WordPress はすべてのページが phpで構成される動的コンテンツのみです。以前使用していた Serene Bach は、動的コンテンツは検索ページとか一部のみで、基本は静的コンテンツに変換されています。
「これだ」と思いましたね。
いろいろ探しましたけど、そんなことはできないんですけどね。
ということで、WordPress の最適化・高速化を実施することで、リソースが無駄に使われなくなって良いのではないかと、いくつか対策を練りました。
[高速化]
- MySQL クエリキャッシュ
一つ目の高速化の原則は、MySQL のキャッシュを利用しましょう。です。WordPress では、いちいち MySQL に問い合わせをかけるため、topページであろうが毎度毎度 SELECT SQLが実行されてるようです。
ということは、これらがキャッシュされれば MySQL の overhead は相当軽減されます。 - WordPress コンテンツキャッシュ
次は WordPress が出力するコンテンツのキャッシュです。静的コンテンツの解決策に近いものですが、更新状況を見ながら、キャッシュタイミングを見てくれるようにするのがポイントです。これも、PHP で実行される部分を極力減らして、リソース消費を押さえ、かつクライアントでの表示自体も高速化されるわけです。
ただ、コンテンツや widget によっては、キャッシュが効き過ぎて、動的に更新されない場合もあるので、使い分けは検討が必要です
他にも PHPのアクセラレート、Apache の最適化などありますが、Debian etch では面倒なので、この 2つだけで様子を見ることにしました。
[実施手順]
- MySQL クエリキャッシュ
- クエリ結果のキャッシュ を参考に実施しました。簡単です。
クエリキャッシュを有効にするには、mysql.ini ファイル中の「query_cache_type」をONに、「query_cache_size」を0より大きな適切な値に設定刷ればよいです。
Debian etch では、”/etc/mysql/my.cnf” 中の [mysqld] 項目に以下のように記述を追加・修正します。
[mysqld] query_cache_limit=1M query_cache_min_res_unit=4k query_cache_size=24M query_cache_type=1
- WordPress コンテンツキャッシュ
- WordPress 2.5未満のころは「WordPress高速化をやってみました」のように、”wp-config.php” 内に “define(‘ENABLE_CACHE’,true);” を定義すれば良かったのですが、WordPress 2.5 より、この機能が削除され、別の機能を取り込む必要があります。
詳細は WordPress の 「WordPress › Support » Is define(enable_cache, true) not working in 2.5?」トピックに書いてあるとおりで、”File-Based Extension to the WordPress Object Cache“を download して、”/wp-content/” 配下に zip内の “object-cache.php” を配置するだけです。
使用するためには、2.5以前と同様に、”wp-config.php” に “define(‘ENABLE_CACHE’,true);” を定義し、”/wp-content/cache” を作成しておく必要があるようです。
WordPress Cache
はじめまして!グーグルさんの紹介でやってきました(笑)
記事を参考させていただきに、オブジェクトキャッシュを導入しました(^ω^)かなりの効果があって、大満足です(笑)
自分も記事を書いたのですが、もしかするとピンバックが何回も飛んでるかもしれません(汗)飛んでたらすみません。。
今後も拝見させていただきますね!
はじめまして!
コメントありがとうございます
我が家でも、ひじょうに効果の高いものだったので「これは!」と思い、あわててblog書きましたw
WP2.7 もおもしろそうですね^^