mod_expiresを使ったキャッシュコントロールでアクセス軽減

Apache, Webサーバ, mod_expires

10:49:54, by admin Email , 100 words, 17707 views   Japanese (JP)

del.icio.us
ってか、画像でかすぎが一番の原因だっての。

(ノ・・)ン。。。。。。(((●コロコロッ

某ファッション系サイトの運営で相談されたことがある。


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 を返してコンテンツを出力する

アプリケーションキャッシュとブラウザキャッシュを併用することで, アプリケーションレベルでの負荷はかなり軽減されます。


さて、これを実践すればいいのだが、
どうにも問題がある。
これはアプリケーションの話で、
今回問題になっているのは「画像」だ。
すべての静的画像を一回プログラム噛ましてから、
ヘッダーをコントロールするのはちょっと現実的ではない。
(´・ω・`) はて。。。



調べてみると、
面白いものに当たった。
それは
mod_expires


本来プログラム側で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はもう使わない方が良いだろう。

Trackback address for this post:

http://hain.jp/htsrv/trackback.php/99

Comments, Trackbacks:

No Comments/Trackbacks for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!