Webの高速化とデータ転送量の削減のために、mod_deflateとmod_filterを組み合わせたgzip圧縮の設定方法を調べたので知識の整理のためにまとめておく。この設定例は、CentOS6上でyumでセットアップしたApacheでしたものです。
前提条件として設定ファイル(/etc/httpd/conf/httpd.conf)で下記のモジュールを読み込むように設定する必要がある。
LoadModule fileter_module modules/mod_filter.so
LoadModule deflate_module modules/mod_deflate.so
mod_deflateの設定ファイル(/etc/httpd/conf.d/deflate.conf)を作成する。
<IfModule deflate_module>
# 圧縮率の設定
DeflateCompressionLevel 1
<Location />
# NetScape 4.xのバグ対策(今更使ってる人はいないと思うけど)
BrowserMatch ^Mozilla/4 gzip-only-text/html# NetScape 4.06-4.08のバグ対策(今更使ってる人はいないと思うけど)
BrowserMatch ^Mozilla/4\.0[678] no-gzip# IEのユーザーエージェントは、Mozilla/4だがgzip圧縮を受け付けるので除外する。ただしIE6はバグがあるので除外の対象外
BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html# 圧縮するファイルのMimeTypeを、mod_filterを使って指定する。
FilterDeclare Compression CONTENT_SET
FilterProvider Compression DEFLATE resp=Content-Type $text/html
FilterProvider Compression DEFLATE resp=Content-Type $text/plain
FilterProvider Compression DEFLATE resp=Content-Type $text/css
FilterProvider Compression DEFLATE resp=Content-Type $text/javascript
FilterProvider Compression DEFLATE resp=Content-Type $text/xml
FilterProvider Compression DEFLATE resp=Content-Type $application/xhtml
FilterProvider Compression DEFLATE resp=Content-Type $application/xml
FilterProvider Compression DEFLATE resp=Content-Type $application/xhtml+xml
FilterProvider Compression DEFLATE resp=Content-Type $application/rss+xml
FilterProvider Compression DEFLATE resp=Content-Type $application/atom+xml
FilterProvider Compression DEFLATE resp=Content-Type $application/javascript
FilterProvider Compression DEFLATE resp=Content-Type $image/svg-xml
FilterChain Compression# プロキシサーバーが間違ったコンテンツを配布しないようにするための設定
Header append Vary Accept-Encoding env=!dont-vary</Location>
</IfModule>
DeflateCompressionLevelは、1 (低圧縮) から 9 (高圧縮)の間で設定をできるが高い値に設定をしてもCPUパワーを食う割にファイルサイズがものすごく小さくなるわけではないので個人的には1で十分だと思う。
プロキシサーバーが間違ったコンテンツを配布しないようにする設定には下記の二つの例がWebを検索すると出てくるのでどちらがいいのかをしらべてみた。
Header append Vary Accept-Encoding env=!dont-vary
Header append Vary User-Agent env=!dont-vary
Header append Vary User-Agent env=!dont-varyの設定をするとプロキシサーバーは、ブラウザのユーザーエージェントごとに個別にキャッシュを蓄えてしまう。ユーザーエージェントとブラウザーの組み合わせはそれこそ大量にあるのでプロキシのキャッシュの効率が落ちてしまうようです。
Header append Vary Accept-Encoding env=!dont-varyの設定は、ブラウザがAccept-Encodingをレスポンスヘッダーで送るか送らないかの2パターンでプロキシサーバーがキャッシュをするかしないかの判断をするため、より効率がいいのでこちらの設定するべきかと思います。