如何使用mod_deflate保存流量在Lighttpd 1.4(Debian Etch)

如何使用mod_deflate保存流量在Lighttpd 1.4(Debian Etch) 在本教程中,我将描述如何安装和配置mod_deflate上

如何通过mod_deflate保存流量在Lighttpd 1.4(Debian Etch)

版本1.0
作者:Falko Timme

在本教程中,我将介绍如何在Debian Etch上的lighttpd 1.4 Web服务器上安装和配置mod_deflatemod_deflate默认包含在lighttpd 1.5中,但不包含在1.4中,其中使用mod_compressmod_deflate over mod_compress的优点是可以压缩静态和动态文件(如PHP文件),而mod_compress只能压缩静态文件。 Debian Etch的lighttpd版本是1.4.13,所以我们必须修补它来支持mod_deflatemod_deflate允许lighttpd压缩文件并将其传递给可以处理大多数现代浏览器所执行的压缩内容的客户端(例如浏览器)。 使用mod_deflate ,您可以将HTML,文本或XML文件压缩到大约。 20-30%的原始尺寸,从而节省您的服务器流量,使您的调制解调器用户更快乐。

压缩文件会导致服务器负载稍高,但根据我的经验,客户端与服务器的连接时间减少了很多。 例如,需要七秒钟下载未压缩的HTML文件的调制解调器用户现在可能只需要两秒钟的时间才能使用相同但压缩的文件。

通过使用mod_deflate,您不必担心您会排除使用旧版浏览器无法处理压缩内容的用户。 浏览器在传输任何文件之前与服务器进行协商,如果浏览器无法处理压缩内容,则服务器将传送未压缩的文件。

我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!

1初步说明

无论lighttpd是否已经安装,您都可以遵循本教程。 我们将构建一个新的lighttpd 1.4.13 .deb软件包,它将替换现有的lighttpd(如果已安装)。

如果lighttpd已经安装,您可以检查它的版本,并包括这样的功能:

lighttpd -V

输出应该是这样(它应该显示版本1.4.13):

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建立一个新的Lighttpd软件包,支持mod_deflate

首先,我们安装我们从源码编译lighttpd所需的一切:

apt-get install build-essential

然后我们去/ usr / src目录下载Debian Etch lighttpd源码包:

cd /usr/src
apt-get source lighttpd

现在跑

ls -l

看看你有什么lighttpd版本。 应该是1.4.13:

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#

现在我们从http://trac.lighttpd.net/trac/wiki/Mod_Deflate下载lighttpd-1.4.13.mod_deflate.jz.patch文件,并用lighttpd 1.4.13源修补它:

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

如果一切顺利,最后一个命令的输出应该如下所示:

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#

补丁应用没有错误后,我们构建我们的新的lighttpd .deb包:

dpkg-buildpackage

dpkg-buildpackage很可能会抱怨丢失的包,它需要构建新的lighttpd .deb包:

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#

如果您看到这样的错误,请安装丢失的软件包,例如:

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

之后再运行dpkg-buildpackage

dpkg-buildpackage

(在http://trac.lighttpd.net/trac/wiki/Mod_Deflate它说,必须在lighttpd中启用bzip2支持才能使mod_deflate工作。幸运的是,Debian的lighttpd软件包(因此也是我们的新软件包)默认情况下支持bzip2 ,所以没有必要做,以启用它。)

dpkg-buildpackage命令现在应该再次编译lighttpd,并在/ usr / src目录中创建一个新的.deb包。 这可能需要一些时间,所以请耐心等待。 最后可能会收到关于签名的警告 - 您可以忽略它们。

之后,我们去/ usr / src目录,看看我们得到了什么:

cd ..
ls -l

输出可能如下所示:

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#

如你所见,已经创建了一个新的lighttpd_1.4.13-4etch1_i386.deb包,我们现在可以这样安装(这将取代你现有的lighttpd):

dpkg -i lighttpd_1.4.13-4etch1_i386.deb

(如果需要这些模块,可以安装lighttpd-mod-cml_1.4.13-4etch1_i386.deblighttpd-mod-magnet_1.4.13-4etch1_i386.deblighttpd-mod-mysql-vhost_1.4.13-4etch1_i386.deblighttpd- mod-trigger-b4-dl_1.4.13-4etch1_i386.deblighttpd-mod-webdav_1.4.13-4etch1_i386.deb以同样的方式。)

现在我们必须将mod_deflate.so文件复制到lighttpd modules目录中:

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

如果你喜欢,你现在可以运行

lighttpd -V

检查构建日期以确保安装了新的lighttpd:

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#

如您所见,内置了bzip2支持,这是mod_deflate的先决条件 。 (不要担心,如果在输出中没有看到mod_deflate - 这是正常的。)

3配置Lighttpd

lighttpd配置在Debian Etch上的/etc/lighttpd/lighttpd.conf中。 我们打开该文件并将“mod_deflate”添加到server.modules节( 如果mod_rewrite已启用,则mod_deflate将被重新列入mod_rewrite! ):

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

它应该重新启动没有任何错误。

现在尝试从浏览器中的lighttpd服务器访问几个.html / .php / .txt / ...文件。 它应该没有问题地工作。 如果您获得空白页面,请尝试将/etc/lighttpd/lighttpd.conf中的deflate.output-buffer-size的值减小到20481024 (不要忘记在/ etc / lighttpd / lighttpd进行任何更改后重新启动lighttpd .conf )。

要验证mod_deflate是否真的压缩文件,可以在/etc/lighttpd/lighttpd.conf (之后重新启动lighttpd)中取消注释 deflate.debug =“enable”的行。 现在看看/var/log/lighttpd/error.log ,例如:

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

(如果要离开错误日志,请按CTRL-c

并尝试从lighttpd服务器访问一些文件。 如果一个文件被压缩,你应该在lighttpd的错误日志中找到类似的东西:

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

在这个例子中,这意味着文件大小为53875个字节的文件info.php已被压缩到只有8446字节。 这不到原来尺寸的20%!