Lighttpd 1.4 で mod_deflate を使ってトラフィックを節約する方法(Debian Etch)
Version 1.0
Author: Falko Timme
重要: この手順は Debian Etch(lighttpd 1.4 系)を前提としています。lighttpd 1.5 以降には mod_deflate が標準で含まれているため、同じ手順は不要です。作業は root または sudo 権限で行ってください。
概要
mod_deflate はクライアントが圧縮対応であれば動的・静的コンテンツ双方を圧縮して配信できるモジュールです。mod_compress が静的ファイルのみを扱うのに対し、mod_deflate は PHP など動的に生成されるレスポンスも圧縮できます。典型的な圧縮率は元サイズの約20〜30%程度になり得るため、回線コストやページロード時間の改善に有効です。
用語(1行定義): mod_deflate — lighttpd に追加してレスポンスを gzip/bzip2 等で圧縮するプラグイン。
重要: 圧縮はサーバーの CPU を追加で利用しますが、多くのケースでクライアントの転送時間短縮により全体パフォーマンスが改善されます。ブラウザはサーバーとネゴシエーションして圧縮対応でないクライアントには非圧縮で配信します。
1 事前の注意
既存の lighttpd に上書きする形で新しい .deb を作成・インストールします。lighttpd が既に入っているかどうかに関わらず、この手順に従えます。
まずバージョンとビルド時の機能を確認してください:
lighttpd -V
出力の例(バージョン 1.4.13 が表示されることを期待):
server1:~#\u00a0lighttpd\u00a0-V
lighttpd-1.4.13\u00a0(ssl)\u00a0-\u00a0a\u00a0light\u00a0and\u00a0fast\u00a0webserver
Build-Date:\u00a0Jun\u00a0\u00a01\u00a02007\u0018:19:33
Event\u00a0Handlers:
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0select\u00a0(generic)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0poll\u00a0(Unix)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0rt-signals\u00a0(Linux\u00a02.4+)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0epoll\u00a0(Linux\u00a02.6)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-\u00a0/dev/poll\u00a0(Solaris)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-\u00a0kqueue\u00a0(FreeBSD)
Network\u00a0handler:
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0sendfile
Features:
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0IPv6\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0zlib\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0bzip2\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0crypt\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0SSL\u00a0Support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0PCRE\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0mySQL\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0LDAP\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0memcached\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-\u00a0FAM\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0LUA\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0xml\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0SQLite\u00a0support
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0GDBM\u00a0support
server1:~#
2 ソースから mod_deflate 有効の lighttpd パッケージを作る
ここでは実際に Debian のソースパッケージを取り出し、mod_deflate パッチを当てて .deb を作成します。主な流れは以下です。
- ビルドに必要なパッケージを入手
- /usr/src にソースを取得
- mod_deflate パッチをダウンロードして patch を適用
- dpkg-buildpackage でビルド
- 生成された .deb をインストール
まずはビルドツールをインストールします:
apt-get install build-essential
ソースを取得:
cd /usr/src
apt-get source lighttpd
取得したファイルの確認:
ls -l
期待される出力(lighttpd-1.4.13 があること):
server1:/usr/src#\u00a0ls\u00a0-l
total\u00a0804
drwxr-xr-x\u00a08\u00a0root\u00a0root\u00a00\u00a04096\u00a02007-08-08\u00a019:03\u00a0lighttpd-1.4.13
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0\u00151573\u00a02007-06-01\u00a020:15\u00a0lighttpd_1.4.13-4etch1.diff.gz
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0\u001109\u00a02007-06-01\u00a020:15\u00a0lighttpd_1.4.13-4etch1.dsc
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0793309\u00a02007-06-01\u00a020:15\u00a0lighttpd_1.4.13.orig.tar.gz
server1:/usr/src#
次に mod_deflate パッチをダウンロードし、ソースに適用します:
wget http://trac.lighttpd.net/trac/attachment/wiki/Mod_Deflate/lighttpd-1.4.13.mod_deflate.jz.patch?format=raw
mv lighttpd-1.4.13.mod_deflate.jz.patch?format=raw lighttpd-1.4.13.mod_deflate.jz.patch
cd lighttpd-1.4.13
patch -p1 < ../lighttpd-1.4.13.mod_deflate.jz.patch
patch 成功時の例:
server1:/usr/src/lighttpd-1.4.13# patch -p1 < ../lighttpd-1.4.13.mod_deflate.jz.patch
patching file configure.in
patching file src/base.h
patching file src/chunk.c
patching file src/chunk.h
patching file src/connections.c
patching file src/http_chunk.c
patching file src/joblist.c
patching file src/Makefile.am
patching file src/Makefile.in
patching file src/mod_deflate.c
patching file src/plugin.c
patching file src/plugin.h
patching file src/request.c
patching file src/response.c
patching file src/server.c
Hunk #1 succeeded at 176 (offset 1 line).
Hunk #2 succeeded at 270 (offset 1 line).
Hunk #3 succeeded at 1043 (offset 1 line).
Hunk #4 succeeded at 1271 (offset 1 line).
Hunk #5 succeeded at 1324 (offset 1 line).
Hunk #6 succeeded at 1344 (offset 1 line).
server1:/usr/src/lighttpd-1.4.13#
依存関係の確認とインストール: dpkg-buildpackage を実行すると不足パッケージを指摘されます。指示に従って必要パッケージを apt-get install してください。
例(不足パッケージがある場合):
apt-get install debhelper cdbs libssl-dev zlib1g-dev libbz2-dev libattr1-dev libpcre3-dev libmysqlclient15-dev libldap2-dev libfcgi-dev libgdbm-dev libmemcache-dev liblua5.1-0-dev dpatch patchutils pkg-config uuid-dev libsqlite3-dev libxml2-dev
補足: mod_deflate のために bzip2 サポートが必要とされていますが、Debian の lighttpd パッケージは既に bzip2 サポートを組み込んでいるため追加設定は不要です。
ビルドが成功すると /usr/src に新しい .deb が生成されます。生成物の例:
server1:/usr/src#\u00a0ls\u00a0-l
total\u00a01628
drwxr-xr-x\u00a08\u00a0root\u00a0root\u00a04096\u00a02007-08-08\u00a019:09\u00a0lighttpd-1.4.13
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a029377\u00a02007-08-08\u00a019:07\u00a0lighttpd_1.4.13-4etch1.diff.gz
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0861\u00a02007-08-08\u00a019:07\u00a0lighttpd_1.4.13-4etch1.dsc
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a02000\u00a02007-08-08\u00a019:12\u00a0lighttpd_1.4.13-4etch1_i386.changes
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0287998\u00a02007-08-08\u00a019:12\u00a0lighttpd_1.4.13-4etch1_i386.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a069033\u00a02006-12-13\u00a017:22\u00a0lighttpd-1.4.13.mod_deflate.jz.patch
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a0793309\u00a02007-06-01\u00a020:15\u00a0lighttpd_1.4.13.orig.tar.gz
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a099606\u00a02007-08-08\u00a019:11\u00a0lighttpd-doc_1.4.13-4etch1_all.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a063136\u00a02007-08-08\u00a019:12\u00a0lighttpd-mod-cml_1.4.13-4etch1_i386.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a062948\u00a02007-08-08\u00a019:12\u00a0lighttpd-mod-magnet_1.4.13-4etch1_i386.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a058546\u00a02007-08-08\u00a019:12\u00a0lighttpd-mod-mysql-vhost_1.4.13-4etch1_i386.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a060212\u00a02007-08-08\u00a019:12\u00a0lighttpd-mod-trigger-b4-dl_1.4.13-4etch1_i386.deb
-rw-r--r--\u00a01\u00a0root\u00a0src\u00a070268\u00a02007-08-08\u00a019:12\u00a0lighttpd-mod-webdav_1.4.13-4etch1_i386.deb
server1:/usr/src#
生成された .deb をインストールします(既存の lighttpd は置き換えられます):
dpkg -i lighttpd_1.4.13-4etch1_i386.deb
必要なら、modules 用の .deb も同様にインストールできます。
最後に mod_deflate の .so をモジュールディレクトリへコピーします(手順の一部):
cp /usr/src/lighttpd-1.4.13/debian/tmp/usr/lib/lighttpd/mod_deflate.so /usr/lib/lighttpd
インストール後、lighttpd のビルド日などを確認して新しいバイナリが反映されているか確認します:
lighttpd -V
出力例(Build-Date が更新されているかを確認):
server1:/usr/src#\u00a0lighttpd\u00a0-V
lighttpd-1.4.13\u00a0(ssl)\u00a0-\u00a0a\u00a0light\u00a0and\u00a0fast\u00a0webserver
Build-Date:\u00a0Aug\u00a0\u00a08\u00a02007\u00a019:10:28
...(省略)...
server1:/usr/src#
注意: 出力に mod_deflate が明示的に表示されないことがありますが、.so をコピーして設定を有効にすれば動作します。
3 lighttpd の設定
Debian Etch の設定ファイルは /etc/lighttpd/lighttpd.conf です。server.modules の配列に “mod_deflate” を追加します。mod_rewrite を使っている場合は mod_rewrite の後に mod_deflate を配置する点に注意してください。
vi /etc/lighttpd/lighttpd.conf
| [...] server.modules = ( "mod_access", "mod_alias", "mod_accesslog", "mod_fastcgi", # "mod_rewrite", "mod_deflate", # "mod_redirect", # "mod_status", # "mod_evhost", # "mod_compress", # "mod_usertrack", # "mod_rrdtool", # "mod_webdav", # "mod_expire", # "mod_flv_streaming", # "mod_evasive" ) [...]
|
次に mod_deflate 固有の設定を追加します(/etc/lighttpd/lighttpd.conf の末尾に追加するのが簡単です)。
| [...] deflate.enabled = "enable" deflate.compression-level = 9 deflate.mem-level = 9 deflate.window-size = 15 # deflate.bzip2 only in patch for 1.4.x deflate.bzip2 = "enable" # deflate.allowed_encodings only in 1.5.x #deflate.allowed_encodings = ( "bzip2", "gzip", "deflate" ) deflate.min-compress-size = 200 #deflate.sync-flush = "enable" deflate.output-buffer-size = 4096 deflate.work-block-size = 512 deflate.mimetypes = ("text/html", "text/plain", "text/css", "text/javascript", "text/xml") #deflate.debug = "enable"
|
設定後に lighttpd を再起動します:
/etc/init.d/lighttpd restart
エラーが出ずに再起動すれば設定は適用されています。ブラウザで .html、.php、.txt などをアクセスして問題がないか確認してください。空白ページが出る場合は deflate.output-buffer-size を 2048 または 1024 に下げて再試行してください(設定変更後は再起動が必要)。
圧縮の検証
deflate.debug を有効にすると /var/log/lighttpd/error.log に圧縮情報が出力されます。設定でコメントを外してから lighttpd を再起動し、ログを監視します:
tail -f /var/log/lighttpd/error.log
アクセスを行うと、以下のようなログが出ます:
[...]
2007-08-08 18:40:33: (mod_deflate.c.919) in: 53875 out: 8446
2007-08-08 18:40:33: (mod_deflate.c.1020) finished uri: /info.php , query:
[...]
この例では info.php のサイズ 53875 バイトが 8446 バイトに圧縮されており、元の約15%以下になっていることがわかります。
よくあるエラーと対処(トラブルシューティング)
重要: 変更ごとに必ず lighttpd を再起動し、/var/log/lighttpd/error.log を確認してください。
- 空白ページが返る
- deflate.output-buffer-size を 4096 から 2048 または 1024 に下げて試す。バッファ周りの設定が原因で表示できないことがあります。
- パッケージビルドで依存関係エラー
- dpkg-buildpackage の出力を確認し、指示されたパッケージを apt-get で追加インストールする。
- mod_deflate が効いているか不安
- deflate.debug を有効にし、ログ内の “in: X out: Y” 行を探す。クライアント側ではブラウザのデベロッパーツールで Response Headers に “Content-Encoding: gzip” 等があることを確認。
- 古いブラウザ向けの互換性
- サーバーは Accept-Encoding ヘッダを確認してクライアント対応を自動判定するため、特別な設定は不要。ただしプロキシや中継機器がヘッダを書き換えると問題が起きる可能性がある。
代替アプローチと比較
- mod_compress
- 静的ファイルのみを事前圧縮し配信する場合は軽量で有効。ただし動的コンテンツを圧縮できない。
- 逆プロキシ(例: nginx)を使った圧縮
- 既存のインフラで負荷分散やキャッシュと併用するには有効。reverse proxy 側で gzip を有効化して backend は非圧縮で動かす設計が可能。
- アプリケーション側で圧縮(PHP の ob_gzhandler 等)
- アプリケーションレベルで細かく制御したい場合に有効。Web サーバー側の設定より柔軟だがアプリごとの実装が必要。
どれを選ぶかは負荷分散、既存構成、運用コストによって決めてください。
導入前後チェックリスト(運用者向け)
導入前
- サーバーのバックアップを取得
- 現行 lighttpd の設定ファイルを保存
- 現行パッケージのバージョンとビルド日を記録
導入後
- /etc/lighttpd/lighttpd.conf に “mod_deflate” を追加
- deflate 設定を追加して再起動
- ログで “in: out:” エントリが出ることを確認
- ブラウザで Content-Encoding ヘッダを確認
- 動的ページ・静的ファイル共に表示が崩れていないことを確認
- 監視ツール/SLI に基づきレスポンス時間と CPU 使用率を観察
受け入れ基準
- 圧縮対象のレスポンスでログに “in: X out: Y” の記録があること
- ブラウザのレスポンスヘッダに Content-Encoding が付与されること(圧縮対応クライアント)
- ページ表示が崩れないこと
- 通常負荷下で CPU 使用率の増加が許容範囲であること
テストケース/受け入れテスト
- 静的 HTML(500KB)をダウンロードし、圧縮後のサイズが目に見えて小さくなる
- PHP で動的に生成したページをアクセスし、圧縮ログが出ることを確認
- 非対応クライアント(Accept-Encoding を送らない curl)で非圧縮が返ることを確認
コマンド例(非圧縮確認):
curl -H "Accept-Encoding:" -I http://yourserver/path
用語集(1行説明)
- deflate: 圧縮アルゴリズムの一つ。gzip でよく使われる。
- Content-Encoding: サーバーがレスポンスに適用したエンコーディングを示す HTTP ヘッダ。
- Accept-Encoding: クライアントが受け入れ可能な圧縮方式を示す HTTP ヘッダ。
決定フロー(簡易)
以下は導入判断の簡易フローです。小さなインスタンスで低トラフィックならアプリ側での圧縮、負荷分散や複数サイトを運用する場合は web サーバー/プロキシ側での圧縮を検討してください。
flowchart TD
A[現在の構成を確認] --> B{動的コンテンツが多いか}
B -- はい --> C[mod_deflate を検討]
B -- いいえ --> D[mod_compress または事前圧縮を検討]
C --> E{既に reverse proxy があるか}
E -- はい --> F[proxy 側で圧縮]
E -- いいえ --> G[lighttpd に mod_deflate を導入]
セキュリティとプライバシーの注意点
圧縮自体はデータの可視性を変えませんが、圧縮バグ(例: CRIME や BREACH のような特定の攻撃ベクトル)に注意が必要なプロトコル構成があります。特に機密データを含む応答を圧縮する場合は、HTTPS と組み合わせた対策(トークンやヘッダの扱い)を検討してください。
まとめ
- mod_deflate を lighttpd 1.4 に追加すると転送量を大幅に削減できます。
- ソースにパッチをあてて .deb をビルドし、/etc/lighttpd/lighttpd.conf にモジュールと設定を追記します。
- 動作確認は deflate.debug とログの “in: out:” を使って行います。
- 代替手段(mod_compress、reverse proxy、アプリ圧縮)と比較し、構成に合う方法を選んでください。
参考リンク
- Lighttpd: http://www.lighttpd.net
- mod_deflate: http://trac.lighttpd.net/trac/wiki/Mod_Deflate
- Debian: http://www.debian.org