Tips記事
» 2002年04月17日 00時00分 UPDATE

Apacheにmod_gzipを組み込んで帯域を節約したい

[木田佳克,ITmedia]

 Apacheで配信されるWebコンテンツは,画像であればページ管理者の手によって圧縮率を高めファイル容量を小さくすることが可能だ。さらに,ほかの手段としては,サーバ側の設定であらかじめ圧縮を行ってから配信するという方法がある。これであればテキストファイル(HTMLファイル)のファイル容量も小さくすることができ,帯域を節約させることが可能だ。

 使用する条件としては,圧縮をするためにサーバ側のCPUパワーが多少消費されることと,ページを見る側にgzipを解凍するブラウザ環境が必要となる(IE5.x/6.xであれば問題は無い)。

 まず最初に,自分の環境でモジュール組み込みが容易にできるDSO(Dynamic Shared Object)をサポートする環境であるかを確認しよう(動的にモジュールを組み込める状態)。次のように,「mod_so.c」という文字列が見られればよい(最近のディストリビューションではDSO環境になっている)。

# httpd -l
Compiled-in modules:
 http_core.c
 mod_so.c
suexec: enabled; valid wrapper /usr/sbin/suexec

 mod_gzipは,次のサイトからダウンロードしよう。ここではソースコード(mod_gzip 1.3.19.1a - Complete source code as a 'C' code download. )を選択した。

HSC's mod_gzip for Apache Web Server

 ここではwgetでダウンロードを行い,apxsコマンドでモジュールを組み込む手順を挙げている(入力するのは黄色文字の個所)。

# wget http://www.remotecommunications.com/apache/mod_gzip/ src/1.3.19.1a/mod_gzip.c ←実際は1行で

# apxs -i -c mod_gzip.c
gcc -DLINUX=22 -DEAPI -DEAPI_MM -O2 -march=i386 -mcpu=i686 -fPIC -DEAPI_MM_CORE_PATH=/var/run/httpd.mm -fpic -DSHARED_MODULE -I/usr/include/apache -c mod_gzip.c
gcc -shared -o mod_gzip.so mod_gzip.o
cp mod_gzip.so /usr/lib/apache/mod_gzip.so
chmod 755 /usr/lib/apache/mod_gzip.so

 上記のように表示されインストールが終了したら,次にApacheの設定ファイルにmod_gzipの設定を行おう。

 LoadModule,AddModuleそれぞれの挿入個所は,参考Tips「Apacheに組み込まれているモジュール一覧が知りたい」を参考にして,それぞれのまとまりの最後にでも追加すればよい。<IfModule...は,上記モジュール行以降であれば任意の個所で構わない。

# vi /etc/httpd/conf/httpd.conf ←RPMパッケージの場合のパス

........中略.......

LoadModule gzip_module modules/mod_gzip.so

........中略.......

AddModule mod_gzip.c

........中略.......

<IfModule mod_gzip.c>
LogFormat "%h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_compression_ratio}npct." common_with_mod_gzip_info
LogFormat "%h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct." common_with_mod_gzip_info2
CustomLog /var/log/httpd/gzip_log common_with_mod_gzip_info2
mod_gzip_on Yes
mod_gzip_dechunk yes
mod_gzip_minimum_file_size 300
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_keep_workfiles No
mod_gzip_temp_dir /tmp
mod_gzip_item_include mime ^application/x-httpd-cgi
mod_gzip_item_include mime ^application/x-httpd-php
mod_gzip_item_include handler ^perl-script$
mod_gzip_item_include handler ^server-status$
mod_gzip_item_include handler ^server-info$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^httpd/unix-directory$
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_include file \.shtml$
mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.txt$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.pl$
mod_gzip_item_include file \.cgi$
mod_gzip_item_exclude file \.css$
mod_gzip_item_exclude file \.js$
mod_gzip_min_http 1001
</IfModule>

 上記の設定をそのままhttpd.conf内に貼り付けてもよいだろう。注意しておきたいのは,圧縮候補の設定とファイル容量に関する設定項目だ。ここでは,HTTP/1.1での接続が対象であり,画像ファイルは圧縮対象から外していることが分かるはずだ。下記に最低限知っておきたい設定項目を挙げてみた。

mod_gzip_temp_dir 圧縮作業を行うテンポラリディレクトリ。可能であればRAMディスクに設定するとパフォーマンスを向上させられる
mod_gzip_maximum_file_size 圧縮対象とする最大容量
mod_gzip_minimum_file_size 圧縮対象とする最小容量
mod_gzip_maximum_inmem_size 圧縮に使用するメモリ容量
mod_gzip_item_include
(file|mime|header)
圧縮対象にするファイル種別
mod_gzip_item_exclude
(file|mime|header)
圧縮対象にするファイル種別
CustomLog ログファイルのフルパス指定

 設定後は,次のようにhttpdを再起動させよう。

# /etc/rc.d/init.d/httpd restart

 再起動後は,「Apacheの働きぶりをリアルタイムに確認したい」Tipsなどの手段で「mod_gzip/....」の文字列が見られれば,動作していると判断ができる。

Server Version: Apache/1.3.22 (Unix) (Red-Hat/Linux) mod_ssl/2.8.5 OpenSSL/0.9.6b DAV/1.0.2 PHP/4.0.6 mod_gzip/1.3.19.1a

 また,上記のhttpd.conf内設定でログファイルを作成するよう設定したので,次のように指定すれば圧縮状況を確認することが可能だ。

# tail /var/log/httpd/gzip_log

.........中略...........

192.168.0.2 - - [13/Apr/2002:23:48:57 +0900] "GET /images/mail_icon.gif HTTP/1.1" 304 - mod_gzip: DECLINED:EXCLUDED In:0 Out:0:0pct.
192.168.0.2 - - [13/Apr/2002:23:48:57 +0900] "GET /inframe_index.html HTTP/1.1" 200 1797 mod_gzip: DECHUNK:OK In:5626 Out:1797:69pct.
192.168.0.2 - - [13/Apr/2002:23:48:57 +0900] "GET /inframe_link.html HTTP/1.1" 200 3924 mod_gzip: DECHUNK:OK In:13782 Out:3924:72pct.

 ログに見られる「pct.」は圧縮率だ。例えば,最後の行の/inframe_link.htmlファイルは,元が約13.8Kバイトだったものが約4Kバイトに圧縮されて72%になったことを意味している。また,ログ内の緑で示した文字列のステータス表示には次のような意味がある。

OK 圧縮された
DECHUNK:OK 圧縮された(CGIなど)
DECLINED:EXCLUDED 圧縮対象外ファイル
DECLINED:NO_ACCEPT_ENCODING ブラウザがgzipに非対応
DECLINED:TOO_SMALL ファイル容量が設定よりも小さいため対象外
HTTP_LEVEL_TOO_LOW アクセス元HTTPバージョンがmod_gzip_min_httpで設定したものよりも低い(1001がHTTP/1.1,1000がHTTP/1.0)
RECOVERY 作業用ファイルが作成できない
SEND_AS_IS:NO_200 HTTP状態コードが200でないので圧縮されない(ブラウザ内にキャッシュファイルがある場合など)

 この圧縮ログをそのまま記録させていくならば,次のようにlogrotateの候補に追加させておこう。

# vi /etc/logrotate.d/apache

/var/log/httpd/access_log /var/log/httpd/gzip_log
/var/log/httpd/error_log
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}

.......以下略........

 ほかにも「mgstat」と呼ばれるツールを利用すれば,smod_gzipの圧縮状況をグラフ化することで視覚的に確認することが可能だ。

Mgstat」サイトから入手しよう

$ tar zxfv mgstat-0.10.tar.gz
$ cd mgstat-0.10
$ ./configure
$ su
# make;make install

# /usr/local/bin/mgstat -l /var/log/httpd/gzip_log -d /var/www/html/mgstat -s GALAXIES.jp

 上記のようにインストールを行い,「-l」でログファイルを,「-d」で書き出し先のディレクトリを指定する。すると,このようなページが作成されるのだ。日々の圧縮割合を把握するには最適だろう。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ