Apache HTTP サーバ バージョン 2.0
Apache モジュール mod_deflate
説明: | クライアントへ送られる前にコンテンツを圧縮する |
---|---|
ステータス: | Extension |
モジュール識別子: | deflate_module |
ソースファイル: | mod_deflate.c |
概要
mod_deflate
モジュールは DEFLATE
出力フィルタを提供します。これはサーバからの出力を、ネットワークを
通してクライアントに送る前に圧縮することを可能にします。
参照
サンプル設定
下にせっかちな人向けの簡単な設定例を示します。
数タイプのみ圧縮する
AddOutputFilterByType DEFLATE text/html text/plain text/xml
以下の設定はコンテンツをより圧縮しますが、ずっと複雑な設定になります。 設定の隅々までよく理解しないで使わないでください。
画像以外全て圧縮する
<Location />
# 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
</Location>
圧縮を有効にする
Output Compression
圧縮機能は DEFLATE
フィルタ
により実装されています。以下のディレクティブはそのディレクティブのある
コンテナ中のドキュメントを圧縮するようにします:
SetOutputFilter DEFLATE
よく使われているブラウザでは、すべてのコンテンツに対する
圧縮を扱えるわけではありません。ですから、gzip-only-text/html
ノートを 1
にして、html ファイルに対してのみ
圧縮が働くようにした方がよいかもしれません (以下参照)
この値を 1
以外の値に設定した場合は無視されます。
通常、特定のMIMEタイプについてのみ圧縮したいのであれば、
AddOutputFilterByType
ディレクティブを使用します。次に Apache のドキュメントの html
ファイルのみの圧縮を有効にする例を示します。
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>
全てのファイルタイプでの圧縮に問題を抱えているブラウザに対しては、
BrowserMatch
ディレクティブを使用して、特定のブラウザに no-gzip
ノートをセットし、圧縮が行なわれないようにします。
no-gzip
と gzip-only-text/html
を組み合わせることで上手く対処できます。
この場合、前者が後者をオーバーライドします。
上記の設定例の抜粋を
次に示しますのでご覧下さい。
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
まず始めに User-Agent
文字列から Netscape Navigator
4.x であるかどうかを調べます。これらのバージョンでは、
text/html
以外のタイプの圧縮を扱うことができません。
4.06, 4.07, 4.08 は html ファイルの伸張にも問題を抱えています。
ですからこれらに対しては、完全に deflate フィルタをオフにします。
3 番目の BrowserMatch
ディレクティブで、推測したユーザーエージェントを修正します。
なぜなら Microsoft Internet Explorer も "Mozilla/4" と特定されますが、
これらは実際には圧縮を扱うことができるからです。
User-Agent
ヘッダを "MSIE"
(\b
は「単語の境界」を意味します) の追加文字で検査して、
これ以前に設定した制限を再び解除します。
注
DEFLATE
フィルタは必ず、PHP や SSI といった RESOURCE
フィルタの後になります。
DEFLATE フィルタは内部的なサブリクエストを関知しません。
入力の伸張
mod_deflate
モジュールは、gzip
で圧縮されたリクエスト本体を伸張するフィルタも提供しています。
この機能を有効にするには、SetInputFilter
か AddInputFilter
を使用して、
DEFLATE
フィルタを入力フィルタチェインに組み込みます。
例えば次のようになります。
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
この設定であれば、Content-Encoding: gzip
ヘッダを含むリクエストが来ると、本体は自動的に伸張されます。
gzip リクエスト本体を送信するブラウザはあまりありません。
しかし、例えば WebDAV
クライアントの幾つかなど、特別なアプリケーションでリクエストの
圧縮を実際にサポートしているものもあります。
Content-Length に関する注意
リクエスト本体それ自体を評価する場合は、Content-Length
ヘッダを信用しないでください。Content-Length ヘッダは、
クライアントから送信されるデータの長さを反映しているのであって、
伸張されたデータストリームのバイトカウントではありません。
Proxy サーバでの扱い
mod_deflate
モジュールは Vary: Accept-Encoding
HTTP 応答ヘッダを送信して、適切な Accept-Encoding
リクエストヘッダを送信するクライアントに対してのみ、
プロクシサーバがキャッシュした応答を送信するように注意を喚起します。
このようにして、圧縮を扱うことのできないクライアントに
圧縮された内容が送られることのないようにします。
もし特別に何かに依存して除外したい場合、例えば User-Agent
ヘッダなどに依存している場合、手動で Vary
ヘッダを設定して、
追加の制限についてプロクシサーバに注意を行なう必要があります。
例えば User-Agent
に依存して DEFLATE
を追加する典型的な設定では、次のように追加することになります。
Header append Vary User-Agent
リクエストヘッダ以外の情報 (例えば HTTP バージョン)
に依存して圧縮するかどうか決める場合、
Vary
ヘッダを *
に設定する必要があります。
このようにすると、仕様に準拠したプロクシはキャッシュを全く行なわなくなります。
例
Header set Vary *
DeflateBufferSize ディレクティブ
説明: | zlib が一度に圧縮する塊の大きさ |
---|---|
構文: | DeflateBufferSize value |
デフォルト: | DeflateBufferSize 8096 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateBufferSize
ディレクティブは
zlib が一度に圧縮する塊の大きさをバイト単位で指定します。
DeflateCompressionLevel ディレクティブ
説明: | 出力に対して行なう圧縮の程度 |
---|---|
構文: | DeflateCompressionLevel value |
デフォルト: | Zlib のデフォルト |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
互換性: | This directive is available since Apache 2.0.45 |
DeflateCompressionLevel
ディレクティブは
圧縮の程度を設定します。大きな値では、より圧縮が行なわれますが、
CPU 資源を消費します。
値は 1 (低圧縮) から 9 (高圧縮) です。
DeflateFilterNote ディレクティブ
説明: | ロギング用に圧縮比をメモに追加 |
---|---|
構文: | DeflateFilterNote [type] notename |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
互換性: | type is available since Apache 2.0.45 |
DeflateFilterNote
ディレクティブは
圧縮比に関するメモがリクエストに付加されることを指定します。
メモ (note) の名前はディレクティブに指定された値です。
メモはアクセスログに
値を記録し、統計を取る目的にも使えます。
例
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate
ログからもっと精密な値を抽出したい場合は、type 引数を使用して、データタイプをログのメモとして残すように指定できます。 type は次のうちの一つです。
Input
- フィルタの入力ストリームのバイトカウントをメモに保存する。
Output
- フィルタの出力ストリームのバイトカウントをメモに保存する。
Ratio
- 圧縮率 (
出力 / 入力 * 100
) をメモに保存する。 type 引数を省略した場合は、これがデフォルトとなります。
まとめると、次のようにログを取ることになるでしょう。
精密なログ採取
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate
参照
DeflateMemLevel ディレクティブ
説明: | zlib が圧縮に使うメモリのレベルを指定 |
---|---|
構文: | DeflateMemLevel value |
デフォルト: | DeflateMemLevel 9 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateMemLevel
ディレクティブは
zlib が圧縮に使うメモリのレベルを設定します (1 から 9 の間の値)。
(訳注: 2 を底とする対数の値になります。
8 程度が良いでしょう。)
DeflateWindowSize ディレクティブ
説明: | Zlib の圧縮用ウィンドウの大きさ |
---|---|
構文: | DeflateWindowSize value |
デフォルト: | DeflateWindowSize 15 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateWindowSize
ディレクティブは
zlib の圧縮用ウィンドウ (訳注: zlib で使用される履歴バッファ)
の大きさを指定します (1 から 15 の間の値)。
一般的に大きなウィンドウサイズを使用すると圧縮率が向上します。
(訳注: 2 を底とする対数の値になります。
8 から 15 にするのが良いでしょう。)