Bandbreite sparen mit mod_deflate auf Lighttpd 1.4 (Debian Etch)

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man mod_deflate auf einem lighttpd 1.4 Web Server auf Debian Etch installiert und konfiguriert. mod_deflate ist standardmäßig in lighttpd 1.5 integriert, allerdings nicht in 1.4, wo mod_compress stattdessen verwendet wird. Der Vorteil von mod_deflate gegenüber mod_compress ist, dass es statische und dynamische Dateien komprimieren kann (wie zum Beispiel PHP Dateien), wohingegen mod_compress nur statische Dateien komprimiert. Die lighttpd Version, die Debian Etch aufweist, ist 1.4.13, also müssen wir es patchen um mod_deflate zu unterstützen. mod_deflate erlaubt lighttpd Dateien zu komprimieren und sie an Clients (z.B. Browser) zu senden, die komprimierte Inhalte bearbeiten können, wie es die meisten modernen Browser können. Mit mod_deflate kannst Du HTML, Text oder XML Dateien auf ungefähr 20 - 30% ihrer originalen Größe komprimieren, dies spart Deinem Server Bandbreite, was Deine Modem Benutzer glücklicher macht.

Das Komprimieren von Dateien verursacht eine etwas größere Last auf Deinem Server, was jedoch meiner Erfahrung nach von der Tatsache wettgemacht wird, dass die Verbindungszeiten der Clients mit Deinem Server deutlich verringert werden. Zum Beispiel braucht nun ein Modem Benutzer, der sieben Sekunden benötigte, um eine unkomprimierte HTML Datei runter zu laden, nur noch zwei Sekunden für den gleichen Vorgang, allerdings mit einer komprimierten Datei.

Wenn Du mod_deflate verwendest, brauchst Du keine Angst haben, dass Du Benutzer mit älteren Browsern, die komprimierte Inhalte nicht bearbeiten können, ausschließt. Der Browser verhandelt mit dem Server bevor irgendeine Datei transferiert wird und falls der Browser nicht über die Kapazität verfügt, komprimierten Inhalt zu bearbeiten, liefert der Server die Dateien unkomprimiert.

Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen - dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

Du kannst dieser Anleitung folgen, ganz egal ob lighttpd bereits installiert ist oder nicht. Wir werden ein neues lighttpd 1.4.13 .deb Paket erstellen, das das vorhandene lighttpd (falls es installiert ist) ersetzt.

Wenn lighttpd bereits installiert ist, kannst Du dessen Version und integrierte Funktionen wie folgt überprüfen:

lighttpd -V

Die Ausgabe sollte wie folgt aussehen (es sollte Version 1.4.13 anzeigen):

server1:~# lighttpd -V
lighttpd-1.4.13 (ssl) - a light and fast webserver
Build-Date: Jun 1 2007 18:19:33

Event Handlers:


+ select (generic)
+ poll (Unix)
+ rt-signals (Linux 2.4+)
+ epoll (Linux 2.6)
- /dev/poll (Solaris)
- kqueue (FreeBSD)

Network handler:

+ sendfile

Features:


+ IPv6 support
+ zlib support
+ bzip2 support
+ crypt support
+ SSL Support
+ PCRE support
+ mySQL support
+ LDAP support
+ memcached support
- FAM support
+ LUA support
+ xml support
+ SQLite support
+ GDBM support

server1:~#


2 Ein neues Lighttpd Paket mit mod_deflate Unterstützung erstellen

Zuerst installieren wir alles, was wir brauchen, um lighttpd aus den Quellen zu erstellen:

apt-get install build-essential

Dann gehen wir zum /usr/src Verzeichnis und laden das Debian Etch lighttpd Quell-Paket runter:

cd /usr/src
apt-get source lighttpd

Führe nun Folgendes aus

ls -l

um herauszufinden, was für eine lighttpd Version Du bekommen hast. Es sollte die Version 1.4.13 sein:

server1:/usr/src# ls -l
total 804
drwxr-xr-x 8 root root 4096 2007-08-08 19:03 lighttpd-1.4.13
-rw-r--r-- 1 root src 15173 2007-06-01 20:15 lighttpd_1.4.13-4etch1.diff.gz
-rw-r--r-- 1 root src 1098 2007-06-01 20:15 lighttpd_1.4.13-4etch1.dsc
-rw-r--r-- 1 root src 793309 2007-06-01 20:15 lighttpd_1.4.13.orig.tar.gz
server1:/usr/src#

Nun laden wir die lighttpd-1.4.13.mod_deflate.jz.patch Datei von http://trac.lighttpd.net/trac/wiki/Mod_Deflate und patchen die lighttpd 1.4.13 Quellen damit:

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

Wenn alles klappt, sollte die Ausgabe des letzten Befehls wie folgt aussehen:

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#

Nachdem der Patch ohne Fehler angebracht wurde, erstellen wir unser neues lighttpd .deb Paket:

dpkg-buildpackage


dpkg-buildpackage wird sich höchstwahrscheinlich über fehlende Pakete beschweren, die es benötigt um das neue lighttpd .deb Paket zu erstellen:

server1:/usr/src/lighttpd-1.4.13# dpkg-buildpackage
dpkg-buildpackage: source package is lighttpd
dpkg-buildpackage: source version is 1.4.13-4etch1
dpkg-buildpackage: source changed by Steve Kemp <skx@debian.org>
dpkg-buildpackage: host architecture i386
dpkg-buildpackage: source version without epoch 1.4.13-4etch1
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 5.0.0) 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
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)
server1:/usr/src/lighttpd-1.4.13#

Wenn Du auf einen ähnlichen Fehler stößt, installiere die fehlenden Pakete, z.B. wie folgt:

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

Führe danach erneut dpkg-buildpackage aus:

dpkg-buildpackage

(Auf http://trac.lighttpd.net/trac/wiki/Mod_Deflate heißt es, dass bzip2 Unterstützung in lighttpd für mod_deflate aktiviert sein muss, damit es funktioniert. Erfreulicherweise unterstützt Debians lighttpd Paket (und daher auch unser neues Paket) bzip2 standardmäßig, wir brauchen also nichts zu tun um es zu aktivieren.)

Der dpkg-buildpackage Befehl sollte nun lighttpd wieder neu erstellen und ein neues .deb Paket im /usr/src Verzeichnis erstellen. Das kann etwas dauern, sei bitte geduldig. Es kann sein, dass Du einige Warnungen über Signaturen erhlätst - die kannst Du ignorieren.

Danach gehen wir in das /usr/src Verzeichnis und sehen nach, was wir haben:

cd ..
ls -l

Die Ausgabe könnte wie folgt aussehen:

server1:/usr/src# ls -l
total 1628
drwxr-xr-x 8 root root 4096 2007-08-08 19:09 lighttpd-1.4.13
-rw-r--r-- 1 root src 29377 2007-08-08 19:07 lighttpd_1.4.13-4etch1.diff.gz
-rw-r--r-- 1 root src 861 2007-08-08 19:07 lighttpd_1.4.13-4etch1.dsc
-rw-r--r-- 1 root src 2000 2007-08-08 19:12 lighttpd_1.4.13-4etch1_i386.changes
-rw-r--r-- 1 root src 287998 2007-08-08 19:12 lighttpd_1.4.13-4etch1_i386.deb
-rw-r--r-- 1 root src 69033 2006-12-13 17:22 lighttpd-1.4.13.mod_deflate.jz.patch
-rw-r--r-- 1 root src 793309 2007-06-01 20:15 lighttpd_1.4.13.orig.tar.gz
-rw-r--r-- 1 root src 99606 2007-08-08 19:11 lighttpd-doc_1.4.13-4etch1_all.deb
-rw-r--r-- 1 root src 63136 2007-08-08 19:12 lighttpd-mod-cml_1.4.13-4etch1_i386.deb
-rw-r--r-- 1 root src 62948 2007-08-08 19:12 lighttpd-mod-magnet_1.4.13-4etch1_i386.deb
-rw-r--r-- 1 root src 58546 2007-08-08 19:12 lighttpd-mod-mysql-vhost_1.4.13-4etch1_i386.deb
-rw-r--r-- 1 root src 60212 2007-08-08 19:12 lighttpd-mod-trigger-b4-dl_1.4.13-4etch1_i386.deb
-rw-r--r-- 1 root src 70268 2007-08-08 19:12 lighttpd-mod-webdav_1.4.13-4etch1_i386.deb
server1:/usr/src#

Wie Du siehst, ist ein neues lighttpd_1.4.13-4etch1_i386.deb Paket erstellt worden, das wir nun wie folgt installieren können (das wird Dein vorhandenes lighttpd ersetzen):

dpkg -i lighttpd_1.4.13-4etch1_i386.deb

(Wenn Du diese Module benötigst, kannst Du lighttpd-mod-cml_1.4.13-4etch1_i386.deb, lighttpd-mod-magnet_1.4.13-4etch1_i386.deb, lighttpd-mod-mysql-vhost_1.4.13-4etch1_i386.deb, lighttpd-mod-trigger-b4-dl_1.4.13-4etch1_i386.deb und lighttpd-mod-webdav_1.4.13-4etch1_i386.deb nach dem gleichen Verfahren installieren.)

Nun müssen wir die Datei mod_deflate.so in das lighttpd Modul-Verzeichnis kopieren:

cp /usr/src/lighttpd-1.4.13/debian/tmp/usr/lib/lighttpd/mod_deflate.so /usr/lib/lighttpd

Wenn Du magst, kannst Du nun Folgendes ausführen

lighttpd -V

um das Erstellungsdatum herauszufinden, um sicher zu gehen, dass das neue lighttpd installiert ist:

server1:/usr/src# lighttpd -V
lighttpd-1.4.13 (ssl) - a light and fast webserver
Build-Date: Aug 8 2007 19:10:28

Event Handlers:


+ select (generic)
+ poll (Unix)
+ rt-signals (Linux 2.4+)
+ epoll (Linux 2.6)
- /dev/poll (Solaris)
- kqueue (FreeBSD)

Network handler:

+ sendfile

Features:


+ IPv6 support
+ zlib support
+ bzip2 support
+ crypt support
+ SSL Support
+ PCRE support
+ mySQL support
+ LDAP support
+ memcached support
- FAM support
+ LUA support
+ xml support
+ SQLite support
+ GDBM support

server1:/usr/src#

Wie Du sehen kannst, ist eine bzip2 Unterstützung eingebaut, was eine Voraussetzung für mod_deflate ist. (Mach Dir keine Sorgen, wenn Du mod_deflate nicht in der Ausgabe siehst - das ist normal.)

3 Konfiguration von Lighttpd

Die lighttpd Konfiguration ist auf Debian Etch in /etc/lighttpd/lighttpd.conf. Wir öffnen diese Datei und fügen "mod_deflate", der server.modules Zeile hinzu (falls mod_rewrite aktiviert ist, ist es wichtig, dass mod_deflate hinter mod_rewrite aufgeführt wird!):

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" ) [...]
In der gleichen Datei fügen wir folgende mod_deflate Konfiguration hinzu (Du kannst es ans Ende von /etc/lighttpd/lighttpd.conf setzen):
[...]
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"
Danach starten wir lighttpd neu:

/etc/init.d/lighttpd restart

Es sollte ohne Fehler neu starten.

Versuch nun auf ein paar .html/.php/.txt/... Datein von einem lighttpd Server in einem Browser zuzugreifen. Es sollte ohne Probleme funktionieren. Falls Du blanke Seiten erhalten solltest, versuche den Wert von deflate.output-buffer-size in /etc/lighttpd/lighttpd.conf auf 2048 oder 1024 zu verringern (vergiss nicht lighttpd nach den Änderungen von /etc/lighttpd/lighttpd.conf neu zu starten).

Um zu prüfen, dass mod_deflate wirklich Deine Dateien komprimiert, kannst Du die Zeile deflate.debug = "enable" in /etc/lighttpd/lighttpd.conf aktivieren (starte lighttpd danach neu). Sieh Dir nun /var/log/lighttpd/error.log an, z.B. wie folgt:

tail -f /var/log/lighttpd/error.log

(drücke STRG-c wenn Du das error-log verlassen möchtest)

und versuche auf ein paar Dateien von Deinem lighttpd Server zuzugreifen. Wenn eine Datei komprimiert wird, solltest Du etwas ähnliches in lighttpds error-log finden:

[...]
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:
[...]

In diesem Beispiel bedeutet das, dass die Datei info.php die eine Dateigröße von 53875 Bytes hat, auf nur 8446 Bytes komprimiert wurden ist. Das sind weniger als 20% der Originalgröße!

4 Links