mod_deflate を試してみた

May 26th, 2008 by naoya | Filed under day.

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 して次の設定を切り替える。

 

Firefox Disable Cache
 

このスクリーンショットだと分かりにくいかもしれないが、次のリファレンス名です。

  • browser.cache.disk.enable
  • browser.cache.memory.enable
この二つの値を false に設定しておく。そして、Live HTTP Header の画面を開いて Content-Encoding に gzip が含まれていることや jpg などでは gzip が含まれていないことを確認した。
この件とはあまり関係ないが、mod_deflate を設定すると ETag が「ハッシュ+-gzip」となってしまうのはちょっといただけない。
mod_deflate は今さらという感じがあるが、僕は今までちゃんと調べたことがなかったので調べてみた。一つずつちゃんと調べて今ある技術を一つずつ自分のものにしていって応用していきたい。

Tags:

Leave a Reply

Get Adobe Flash playerPlugin by wpburn.com wordpress themes