Apache HTTP サーバ バージョン 2.3
説明: | クライアントへ送られる前にコンテンツを圧縮する |
---|---|
ステータス: | 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
# 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>
圧縮機能は 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 圧縮されたレスポンス
本文を inflate/uncompress するフィルタも提供しています。
この機能を有効にするには、SetOutputFilter
や AddOutputFilter
を使って、
INFLATE
フィルタを出力フィルタチェインに挿入します。
例えば次のようにします。
<Location /dav-area>
ProxyPass http://example.com/
SetOutputFilter INFLATE
</Location>
この例では、example.com からの gzip 圧縮された出力を伸長し、 その他のフィルタがさらにその出力を処理できるようにします。
mod_deflate
モジュールは、gzip
で圧縮されたリクエスト本体を伸張するフィルタも提供しています。
この機能を有効にするには、SetInputFilter
か AddInputFilter
を使用して、
DEFLATE
フィルタを入力フィルタチェインに組み込みます。
例えば次のようになります。
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
この設定であれば、Content-Encoding: gzip
ヘッダを含むリクエストが来ると、本体は自動的に伸張されます。
gzip リクエスト本体を送信するブラウザはあまりありません。
しかし、例えば WebDAV
クライアントの幾つかなど、特別なアプリケーションでリクエストの
圧縮を実際にサポートしているものもあります。
リクエスト本体それ自体を評価する場合は、Content-Length
ヘッダを信用しないでください。Content-Length ヘッダは、
クライアントから送信されるデータの長さを反映しているのであって、
伸張されたデータストリームのバイトカウントではありません。
mod_deflate
モジュールは Vary: Accept-Encoding
HTTP 応答ヘッダを送信して、適切な Accept-Encoding
リクエストヘッダを送信するクライアントに対してのみ、
プロクシサーバがキャッシュした応答を送信するように注意を喚起します。
このようにして、圧縮を扱うことのできないクライアントに
圧縮された内容が送られることのないようにします。
もし特別に何かに依存して除外したい場合、例えば User-Agent
ヘッダなどに依存している場合、手動で Vary
ヘッダを設定して、
追加の制限についてプロクシサーバに注意を行なう必要があります。
例えば User-Agent
に依存して DEFLATE
を追加する典型的な設定では、次のように追加することになります。
Header append Vary User-Agent
リクエストヘッダ以外の情報 (例えば HTTP バージョン)
に依存して圧縮するかどうか決める場合、
Vary
ヘッダを *
に設定する必要があります。
このようにすると、仕様に準拠したプロクシはキャッシュを全く行なわなくなります。
Header set Vary *
説明: | zlib が一度に圧縮する塊の大きさ |
---|---|
構文: | DeflateBufferSize value |
デフォルト: | DeflateBufferSize 8096 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateBufferSize
ディレクティブは
zlib が一度に圧縮する塊の大きさをバイト単位で指定します。
説明: | 出力に対して行なう圧縮の程度 |
---|---|
構文: | DeflateCompressionLevel value |
デフォルト: | Zlib のデフォルト |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
互換性: | This directive is available since Apache 2.0.45 |
DeflateCompressionLevel
ディレクティブは
圧縮の程度を設定します。大きな値では、より圧縮が行なわれますが、
CPU 資源を消費します。
値は 1 (低圧縮) から 9 (高圧縮) です。
説明: | ロギング用に圧縮比をメモに追加 |
---|---|
構文: | 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
説明: | zlib が圧縮に使うメモリのレベルを指定 |
---|---|
構文: | DeflateMemLevel value |
デフォルト: | DeflateMemLevel 9 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateMemLevel
ディレクティブは
zlib が圧縮に使うメモリのレベルを設定します (1 から 9 の間の値)。
(訳注: 2 を底とする対数の値になります。
8 程度が良いでしょう。)
説明: | Zlib の圧縮用ウィンドウの大きさ |
---|---|
構文: | DeflateWindowSize value |
デフォルト: | DeflateWindowSize 15 |
コンテキスト: | サーバ設定ファイル, バーチャルホスト |
ステータス: | Extension |
モジュール: | mod_deflate |
DeflateWindowSize
ディレクティブは
zlib の圧縮用ウィンドウ (訳注: zlib で使用される履歴バッファ)
の大きさを指定します (1 から 15 の間の値)。
一般的に大きなウィンドウサイズを使用すると圧縮率が向上します。
(訳注: 2 を底とする対数の値になります。
8 から 15 にするのが良いでしょう。)