Apache HTTPD Server のチューニング記事を読んでいて、ふと mod_deflate がよく分かっていないことに気がついたので試してみた。
まず、環境は FreeBSD 7.0 Release 上の Apache 2.2.8。ports から普通に入れると mod_deflate が有効になっている。
テスト環境は、Firefox 3.0 rc1 に User Agent Switcher と Live HTTPD Header をインストールして確認した。
設定の方は、Apache 本家のドキュメントを見ると詳しく書いてある。本家のドキュメントでは、すべてのコンテンツに対して圧縮する方法と特定のコンテンツに対して圧縮する方法の二つの方法が解説されている。
また、圧縮するとき過去のブラウザにおいて圧縮の取扱いに問題があるブラウザもあるので、ユーザエージェントごとに判断しないといけない。典型的な設定は、次のようになる。
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|exe|zip)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
SetOutputFilter ですべてのコンテンツに対して圧縮する設定になる。その下の BrowserMatch は過去のブラウザで圧縮の取扱いに問題があるブラウザを考慮している。no-gzip や gzip-only-text/html という環境変数は mod_deflate.c の中で定義されている。no-gzip は圧縮をしない、gzip-only-text/html はコンテンツタイプが HTML のときだけ圧縮するという意味になる。
次の SetEnvIfNoCase はすでに圧縮がかかっているコンテンツに圧縮する意味はないので、すでに圧縮されているコンテンツは除外するという意味にになる。
次に、特定のコンテンツのみに圧縮をかける場合は、上の SetOutputFilter 設定を次のようにおきかえる。
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
AddOutputFilterByType ディレクティブで、圧縮するコンテンツを設定することができる。
インターネットですこし他の人の mod_deflate の設定を調べてみると、中には次のような設定があった。
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|exe|zip)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
この設定では、AddOutputFilterByType が無意味になってすべてのコンテンツに対して圧縮をかけているのでよく意味を理解していない設定だと思う。
実際に Firefox で、ユーザエージェントを切り替えながら確認をしたが、Firefox は必ずキャッシュがきいてしまって、304 が常に返ってきてしまう。そのため、mod_deflate をテストするときは、キャッシュを無効にしておいた方が便利。Firefox のキャッシュを無効にするには、about:config して次の設定を切り替える。
このスクリーンショットだと分かりにくいかもしれないが、次のリファレンス名です。
- browser.cache.disk.enable
- browser.cache.memory.enable
Tags: apache







