Skip to main content.

サーバの負荷対策にApacheのexpiresモジュールでキャッシュ制御を

 
20110325-cache.png

画像や映像のコンテンツをメインとするサイトでの負荷対策に有効なモジュールであるexpiresモジュールの設定メモ。

画像や動画メインのサイトというと、画像掲示板とか、YouTubeとかですね。
あと、SNS系サイトも登録会員のアバター画像や写真掲載などがありますので、サイトの規模が大きいと画像専用のサーバを用意したりします。

当方のサーバではそんなコンテンツは無いのでそこまで必要ではないですが、いじる機会があったのでその時の備忘録をば。

キャッシュについて

もともとブラウザにはキャッシュという機能がついていて、以前アクセスしたことのあるページの画像やhtmlファイル、動画などをローカルのPCに保存しています。

そしてまた同じページを閲覧しようとした時にローカルに保存したファイルを利用してページの表示速度を上げるという役割を持っています。
このようにインターネット経由でファイルを読み込むよりもローカルPC内のファイルを読み込んだ方が表示速度の向上になります。

このキャッシュ機能はページの表示速度は勿論のこと、サーバへのファイルアクセスが減る分サーバへの負担軽減にも貢献しています。


という風に有益な機能ではありますが、問題もあります。


例えば、

top.jpgという恐竜の絵が描かれたファイルをキャッシュとして保存したとします。
その翌日に、サイト管理人によって、top.jpgが野菜の絵に変更されたとします。

さて、この場合にページを表示したら恐竜の絵が出るか、野菜の絵が出るか?
ということになります。

こんな感じでファイルが更新される可能性を考慮してキャッシュにはファイルを保存しておく期間というのが設定できます。
この保存期間が過ぎると、ローカルのキャッシュではなくサーバのファイルに1度アクセスをして変更があったかどうかを確認するわけです。
そして、変更されていればその新しいファイルをキャッシュします。

詳しいことはETagとかexpiresヘッダなどでググるとよろしいかと。

mode_expiresモジュールについて

このようにファイルが更新される可能性があるためにキャッシュの保存期間はわりと短めに設定されていたりしますが、YouTubeの動画ファイルや画像アップローダの画像のように、1回サーバに置かれてから変更される可能性が低いファイルに関しては

「キャッシュの保存期間を長めにしちゃえばいいんじゃね?」(;´д`)


という発想に至ってしまうわけで

「そこに気付くとは・・・やはり天才か。」(-ω- )


という返しが待っているわけです。

そういうキャッシュ制御に用いるのがmod_expiresモジュールです。

とりあえずApacheのバージョン2.2では使えますが、
それ以外のバージョンについては調べてないので分からないです。

現在使用しているApacheのバージョンを知りたければ

#httpd -v
で確認できます。

前提条件として、expiresモジュールを読み込んでいる必要があります。
下の一文がhttpd.confにあればOK。

LoadModule expires_module modules/mod_expires.so
使い方は「httpd.conf」か「.htaccess」に下記のように記述。
ここでは画像と動画ファイルのキャッシュ保存期間を2週間に設定しています。

#キャッシュ制御
<Directory "(フォルダパス)">
  <ifModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpeg "access plus 14 days"
    ExpiresByType image/gif "access plus 14 days"
    ExpiresByType image/png "access plus 14 days"
    ExpiresByType video/x-flv "access plus 14 days"
  </ifModule>
</Directory>

画像ファイルが沢山あるサイトならこうしたキャッシュ制御の設定の有無は大きいと思います。

mod_expiresのより詳細な説明を見るなら下記URLからどうぞ。

mod_expires - Apache HTTP サーバ
http://httpd.apache.org/docs/2.2/ja/mod/mod_expires.html

このエントリーをはてなブックマークに追加
 

comments powered by Disqus