BLOGTIMES
2010/06/06

mod_expires、mod_deflateによるサイトパフォーマンスの改善

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

このサイトにPage SpeedYSlowをかけてみたら、パフォーマンスの改善方法としてページをgzip転送したほうが良いよとか、画像がキャッシュされるようにLast-ModifiedやETagを出力した方がいいよというアドバイスが出るのでちょっと改善してみました。

mod_deflateでページをgzip圧縮する

htmlやxml、javascript、cssなどのテキストデータは圧縮するとかなり容量を小さくすることができるので、mod_deflateを使ってgzip圧縮して転送してやります。これに対して、jpgやgif、pngなどの画像やバイナリのデータは圧縮してもほとんど小さくならないので、これらはそのまま転送するようにします。昔、mod_gzipを設定したときにはもっと面倒なイメージがあったのですが、意外と簡単でした。ドキュメントを一通り読んで、サンプルをコピペしたところ特に問題なく動きました。

これをやるデメリットは圧縮に伴うCPU負荷の上昇ですが、このサーバはかなりオーバースペックなので、平時でCPU使用率が1~3%しかないので、今回は特に問題になることはなさそうです。

httpd.conf

# Insert filter SetOutputFilter DEFLATE # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48 # the above regex won't work. You can use the following # workaround to get the desired effect: BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # Don't compress images SetEnvIfNoCase Request_URI \ \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary

mod_expiresでブラウザのキャッシュを制御する

次はmod_expiresを使ってExpiresヘッダを出力させてみます。このヘッダがなぜ負荷の抑制になるのかというと、Expiresに指定された日時までローカルにキャッシュされた画像を使い続けてくれてくれるので、サイズが大きい画像を何度もサーバからダウンロードしなくなるためです。今回はキャッシュの時間を86400秒(=1日)に設定していますが、調子をみて少しずつ長くしていきたいと思います。このあたりはDNSと一緒と考えればいいのかなとも思いますが、DNSと違ってコンテンツは更新のタイミングを掴みづらいのでそのあたりは難しそうです。

ちなみにこの期間はRFC2616のSection 14.21によると、「レスポンスが "期限切れではない" という事を表すためには、オリジンサーバはレスポンスが送られる時点からおよそ 1 年後の時刻の日付を持つ Expires を送る。 HTTP/1.1 サーバは、Expires の日付に 1 年後以上未来の日付を送るべきではない(SHOULD NOT)」と定義されています。ということで、この値は無限に大きくできる訳ではなく、通常は長くても1年程度にとどめた方いいようです。

参考までに、RFCで使われている助動詞は普通の会話よりも厳密に意味が定義されているので注意が必要です。詳細はRFC 2119 - Key words for use in RFCs to Indicate Requirement Levelsや日本語の解説についてはRFCの文中で出会う「MUST NOT」と「SHOULD NOT」の違いは?などに一度は目を通して置くと良いと思います。

httpd.conf

ExpiresActive On ExpiresByType image/jpeg A86400 ExpiresByType image/gif A86400 ExpiresByType image/png A86400 ExpiresByType text/css A86400 ExpiresByType text/javascript A86400 <Files ~ "\.(jpe?g|gif|png|css|js)> Header set Cache-Control max-age=86400 </Files>

この2つの対策でどれくらい帯域の消費量が変化するかを観察していきたいと思います。


    こんな記事もあります 「gzip-only-text BrowserMatch no-gzip
    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3589
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン