Apache HTTP サーバ バージョン 2.2

Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.2 > モジュール

# Apache モジュール mod_deflate

Available Languages: en | ja | ko

説明: | クライアントへ送られる前にコンテンツを圧縮する
ステータス: | Extension
モジュール識別子: | deflate_module
ソースファイル: | mod_deflate.c

### 概要

`mod_deflate` モジュールは `DEFLATE` 出力フィルタを提供します。これはサーバからの出力を、ネットワークを 通してクライアントに送る前に圧縮することを可能にします。

### ディレクティブ

### トピック

- サンプル設定
- 圧縮を有効にする
- Proxy サーバでの扱い

### 参照

- Filters

## サンプル設定

下にせっかちな人向けの簡単な設定例を示します。

### 数タイプのみ圧縮する

`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>`

## 圧縮を有効にする

### 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 フィルタは内部的なサブリクエストを関知しません。

### 注

`SetEnv` で設定される `force-gzip` 環境変数がありますが、これは ブラウザの accept-encoding 設定を無視し、圧縮した出力をします。

### 出力の伸長

`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` ヘッダを信用しないでください。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`

### 参照

- `mod_log_config`

## 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 にするのが良いでしょう。)

Available Languages: en | ja | ko