ってか、画像でかすぎが一番の原因だっての。
(ノ・・)ン。。。。。。(((●コロコロッ
某ファッション系サイトの運営で相談されたことがある。
dozoさん、サイトが重いんですけど。。。
それもしょっちゅう重いわけではないという。
調査してみたがどうにも原因がわからない。
負荷は全くと言っていいほど無い。
もっとアクセス増やすことを考えた方が良いのはと思うぐらいで、
loadは0.5を超えるのは早朝のcronジョブぐらいだ。
ただ、それで重いというのが逆にわからないのだ。
mod_deflateでの圧縮転送は一応やっているのだが、
テキストにしか有効にはならないので、
効果は無いに等しい。
クエスチョンマークが頭をよぎったまま、
とりあえずapache2を再起動してみたら、
どうも、apache2のプロセスが落ちるのに時間がかかる。
( ̄-  ̄ ) オヤ?ドシテ?
そう言えば、以前似たようなことがあった。
某ママ向け掲示板サイトでアクセスが異常に重たくなったことがある。
このときも同様に再起動した時プロセスを落とすのに異常に時間がかかった。
同僚に相談したところ、
コネクションがはられっぱなしなのでは?とのこと。
試しにnetstatを打ってみるとESTABLISHEDが山盛り出てきた。
調べていくと某広告ASPのシステムがコネクションを離してくれないのが原因だった。
今回も同様なのではと疑い、
netstatを打ってみると某ママ向けサイトほどではなかったが、
ESTABLISHEDが多めにでていた。
HotSanicのnetstatグラフを眺めていると、
異常な値で推移している。
どうやらビンゴらしい。
さて、原因は絞り込めたとして、
どう対処するか。。。。
そんな時に役立つ
Y-110 wikiと言うことで、
尊敬するY-110センセーのwikiをチェックする。
キャッシュの利用という項目にこういった記述がある。
ブラウザキャッシュ
ユーザが短時間に複数回アクセスするようなページの場合,
アクセスの度にプログラムを実行して結果を返すのは効率が良くありません。
このような場合, HTTP/1.1 304 Not Modified を返すことで,
ブラウザが保存しているローカルキャッシュを読み込ませます。
Webサーバからは実際に出力を送信しないため,
クライアントへの転送量も僅かです。
PHP で Not Modified を返すまでの流れとしては,
以下のようになります。
プログラムの出力において Last-Modified ヘッダを付けてクライアントへ返す
次回アクセス時, クライアントが If-Modified-Since ヘッダをつけて Webサーバへリクエストを送信する
プログラムは, クライアントから送信された If-Modified-Since と出力ページの更新時刻とを比較する
If-Modified-Since = 出力ページの更新時刻 なら 304 Not Modified を返してコンテンツを出力しない
If-Modified-Since < 出力ページの更新時刻 なら 200 OK を返してコンテンツを出力する
アプリケーションキャッシュとブラウザキャッシュを併用することで, アプリケーションレベルでの負荷はかなり軽減されます。
さて、これを実践すればいいのだが、
どうにも問題がある。
これはアプリケーションの話で、
今回問題になっているのは「画像」だ。
すべての静的画像を一回プログラム噛ましてから、
ヘッダーをコントロールするのはちょっと現実的ではない。
(´・ω・`) はて。。。
調べてみると、
面白いものに当たった。
それは
本来プログラム側でIf-Modified-Since, Last-Modifiedなどのヘッダーをコントロールしなければならないのだが、
これをApacheのモジュール側でやってくれるらしい。
ということで、
mod_expiresを使って、
アクセス軽減を実践してみよう。
[More:]
ファッション系のサイトなので、
更新頻度は数ヶ月に一回だ。
(ほとんど更新しないと言っても過言ではない。)
なので画像を中心に他のものもキャッシュを使わせるようにして、
アクセス軽減を図ろう。
●環境
debian/GNU Linux 3.1(sarge)
Apache/2.0.54 (debian package)
PHPやMySQLは今回全く関係ないので割愛。
●
mod_expiresモジュールインストール
# /usr/sbin/a2enmod expires
●設定
アクセスされたことを基準に、
15分間キャッシュを有効にするという設定で。
ExpiresActive On
ExpiresByType image/gif "access plus 15 minutes"
ExpiresByType image/jpeg "access plus 15 minutes"
ExpiresByType image/png "access plus 15 minutes"
ExpiresByType application/x-shockwave-flash "access plus 15 minutes"
ExpiresByType text/html "access plus 15 minutes"
ExpiresByType text/css "access plus 15 minutes"
これで終わり。
とても簡単だな。(・∀・)
試しに何度かページアクセスをしてから、
netstatを打ってみるとコネクションはほとんど無くなっていた。
どうやら、効果はありそうだ。
しばらく走らせて様子を見よう。
Apache2からのモジュールのようで、
Apache1には対応していない。
モジュールの多さ、柔軟さから考えるとApache1はもう使わない方が良いだろう。