mod_deflateによるコンテンツの圧縮転送実用 Apache 2.0運用・管理術(4)(2/3 ページ)

» 2005年10月07日 00時00分 公開
[鶴長鎮一@IT]

mod_deflateモジュールのインストール

 前述したとおり、Apache 2.0でコンテンツの圧縮転送を行うには、mod_deflateモジュールを使用します。mod_deflateモジュールのインストール方法は、以下の3種類に大別できます。各自やりやすい方法でインストールしてください。

RPMによるインストール

 Red Hat Linux、Fedora Core、SUSE LINUX、Turbolinuxなど、RPMパッケージでApacheをインストールした場合、mod_deflate.soは標準でインストールされています。Red Hat Linux、Fedora Core、Turbolinuxは「/usr/lib/httpd/modules/」、SUSE LINUXは「/usr/lib/apache2/」がモジュールのインストール先です。

 これ以外のディストリビューションでモジュールが見つからない場合は、「ソースからインストール(DSOによる動的組み込みの場合)」を参照ください。モジュールインストール後の作業は、「httpd.confの編集」に続きます。

ソースからインストール(Apacheに組み込む場合)

 Apacheのインストールを最初からやり直すことで、Apache本体へmod_deflateモジュールを組み込むことができます。Apache本体に組み込むと、モジュールのロードにかかる時間を節約できます。

 Apache本体に組み込むには、Apacheのconfigure実行時に「--enable-deflate」オプションを追加します。

# cd /Apacheのソース/
# ./configure --enable-deflate
# make
# make install

 この後の作業は、「httpd.confの編集」に続きます。

ソースからインストール(DSOによる動的組み込みの場合)

 DSO(Dynamic Shared Object:Apacheの基本インストールの「DSOとapxs」参照)を利用すれば、インストール済みのApacheにmod_deflateモジュールを追加することができます。

 DSOを利用してモジュールを組み込む場合は、まずmod_deflate.soファイルを作成してインストールします。mod_deflate.soのソースはApacheソースの中のmodules/filters/にあります。そのディレクトリでapxsコマンドを実行します。

# cd /Apacheのソース/modules/filters/
# /usr/local/apache2/bin/apxs -i -a -c mod_deflate.c
注:apxsのパスは適宜変更(以下同)。

 apxsコマンドに「-i」「-a」オプションを追加することで、make後にモジュールを規定の場所に移動し、httpd.confにモジュールをロードする設定が追加されます。「-c」オプションは、モジュールのソースファイルを指定します。

 この後「httpd.confの編集」の作業を行うのですが、以下のようなメッセージが出力されてモジュールの組み込みに失敗する場合があります。

Cannot load /usr/local/apache2/modules/mod_deflate.so into server: /usr/local/apache2/modules/mod_deflate.so: undefined symbol: deflate

 この場合は、mod_deflate.soに必要なライブラリを静的に組み込む必要があります。大抵はzlibを取り込むことで解決します。モジュール作成時にzlibを組み込むには、「-lz」オプションを追加します。

# /usr/local/apache2/bin/apxs -i -a -c mod_deflate.c -lz

httpd.confの編集

 次に、httpd.confでモジュールの読み込みとコンテンツ圧縮の設定を行います。

LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter DEFLATE

 1行目がモジュールを読み込む指定です。モジュールをApache本体に組み込んだ場合は、この指定は不要です。2行目は、サーバから転送するコンテンツに圧縮を適用する指定です。

 特定のディレクトリに格納されているコンテンツに対してのみ適用させる場合は、<Location>や<Directory>ディレクティブを併用します。

<Directory "/パス/example/">
SetOutputFilter DEFLATE
</Directory>

 圧縮の程度を指定することもできます。「DeflateCompressionLevel」に対して、1〜9の値を設定します。

DeflateCompressionLevel 5

 値が大きくなるほど圧縮率は大きくなりますが、その分CPUの負荷が高くなります。運用実態に合わせて徐々に値を上げるようにしましょう。

 最低限の設定は完了ですが、圧縮転送が行われていることを確認するためにログを取る設定を追加します。通常のaccess_logやerror_logとは別に、新たなログをCustomLogを利用して収集することにします。CustomLogについては、機会があれば別の回で紹介します。

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate
CustomLog logs/deflate_log deflate

 圧縮比を表示させるため、「DeflateFilterNote」で圧縮に関する値の出力を可能にします。「Input」は圧縮前のバイトカウント、「Output」は圧縮後のバイトカウント、「Ratio」は圧縮率(Output / Input × 100)の指定です。DeflateFilterNoteで使用可能になった値を「LogFormat」で書式整形し、「CustomLog」でファイル出力を行います。また、ログ出力の際にWebブラウザ名を表示させるように、「%{User-agent}i」を加えます。

 以上でmod_deflateの基本設定は完了です。

圧縮処理の制御

 最初に述べたとおり、mod_deflateによるコンテンツ圧縮を行う場合、コンテンツ圧縮に対応したWebブラウザでなければコンテンツを正しく表示できなくなります。FirefoxやInternet Explorerなど、PC用の主要なWebブラウザの多くがHTTP 1.1に準拠しており、コンテンツ圧縮にも対応しています。しかし、非対応のWebブラウザも存在します。

 また、HTMLファイルなどのテキストデータは圧縮効果が期待できますが、GIFやJPEGなどの画像データはすでに圧縮されているため、あまり効果は見込めません。逆に、CPUが無駄に消費されます。

 圧縮転送を行う際は、クライアント側のWebブラウザや送信するコンテンツの種類に応じて機能を無効化するのが効果的です。

●MIMEタイプ指定で特定のファイル形式のみを圧縮

 コンテンツの種類(ファイル形式)を見分けるためにMIMEタイプを利用し、圧縮を行うコンテンツを個別に指定します。指定しないMIMEタイプのコンテンツは圧縮されません。

AddOutputFilterByType DEFLATE text/html text/plain text/xml

●Webブラウザと非圧縮コンテンツの指定

 以下の例は、アクセスがあった際にコンテンツを圧縮して送信するWebブラウザをMozilla系(ただしNetscape Navigator 4.0xは除外)とInternet Explorerに限定しています。さらに、拡張子が「.gif」「.jpeg」「.jpg」「.png」のファイルを圧縮対象から除外しています。Webブラウザの識別には、「BrowserMatch」を使用しています。

<Location />
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)$ no-gzip dont-vary
</Location>
注:<Location>ディレクティブは必要がある場合のみ使用します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。