2007年3月11日日曜日

Apacheのチューニング by mod_cache

勤めていた会社を辞めたのですが、バイトに誘われてしまい。
軽くOK出しちゃいましたw
そっしたら、当初は聞いていなかったApacheのチューニングをするハメに!!
んなのやったこと無いから!てか俺で良いんか!?やるよ?やっちゃいますよw
てな感じでやってみました。

最初はモジュール追加するぐらいだろうと思ってたんですが、
これが手強かった。。。

今回はアクセス数の突発的な増加が良くあるサイトが対象なので、同時アクセス
が高くても耐えられる形を望まれました。
で、基本はリクエストがあった場合にはPHPの処理が走るのですが、PHPでは無くて、キャッシュを返すようにして負荷を下げようという方針にしました。
(このPHPが曲者で凄い重いんですよ。。。色んなとこみてますんで)

で、やった事

1)モジュール追加
apacheのモジュール参照先にmod_cache.soとmod_disk_cache.soをコピーしました。今回は現状動いているサーバに対して対応しなければいけない&私がApacheをコンパイルした訳でも無く、コンパイル時の資料も無いので、一からやるのはリスクが高いと判断しまして、soの追加にしました。
あ、Apacheは2.0です。

2)Apacheの設定変更

以下の二行でモジュール読み込み
LoadModule cache_module       modules/mod_cache.so
LoadModule disk_cache_module       modules/mod_disk_cache.so

簡単だ~ね♪
で、キャッシュの設定は以下
<IfModule mod_cache.c>
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot /usr/local/apache/cache
CacheSize 50000
CacheDefaultExpire 3600
CacheDirLength 4
CacheDirLevels 4
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
</IfModule>
</IfModule>

この設定で得にポイントは無いかな~。これだと、全てのページを強制キャッシュ、で、デフォルトで1時間キャッシュする感じ。
あと、キャッシュするのって更新が頻繁なページも対象になると気を付けない
といけないんよね。更新したのにページが変わらないとか言われちゃうから。
いや、だからキャッシュですってば(笑
とか言わなきゃならん。ま~そこら変は上手くコントロールして下さい。

3)Apache再起動
設定を反映するタメに再起動して下さい。

これでおしまい。。。。
と思ったら大間違い(笑
この罠に私はかかりましたよw
この状態だと二つの問題が発生します。
・キャッシュされたデータっていつ消えるの?
・クエリー(URLに含まれる「?」以降の文字)があるとApacheのログでexpiresが無いって言われるんだけど、で、キャッシュされないじゃん!

ディスクキャッシュ(mod_disk_cache)の場合にはhtcachecrean(確かそんな名前)というツールがApacheについているので、それをデーモンかcronで起動するように設定します。ちなみに私が触った環境にはそんなツールがありませんでした。。。なので実際にcronに登録したのはこんな感じ

*/30 * * * * rm -rf /usr/local/apache/cache/*

すげー原始的(笑
一応これで解決してるみたいです。

そして、キャッシュされないって問題がすげー悩みました。
どうやらクエリーが含まれるページをキャッシュするにはHeader情報にExpiresとLastModifieが必要らしいです。で、PHPなので処理の最初にコードを追加。
header("Expires: ".gmdate("D, d M Y H:i:s",time() + 60*60)." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:S", time())." GMT");

これは本当に時間かかった。でも何とかなって良かったw
Apacheのベンチマークを使うと驚く程の成果出ましたよ♪
いや、久々に大満足でした~



0 件のコメント :

コメントを投稿