当前位置: 代码迷 >> 综合 >> Lighttpd 配置与性能优化
  详细解决方案

Lighttpd 配置与性能优化

热度:65   发布时间:2024-01-20 10:01:36.0

Lighttpd 配置与性能优化
前提:还是针对高负载,静态页面,freebsd系统的web应用。
如果非要在LSWS(LiteSpeed Web Server)和lighttpd中间做的选择的话,我觉得是困难的。从现存的网上资料中很难有个权威的说法。因为测试没有特别的标准。例如在当前情况下,web server的配置是不是达到最优,甚至当你只对一中webserver测试的时候,你也会发现同种配置下连续测试,他们的结果都可能在波动。所以有时候很可能分不清哪种配置是最优秀的,适合当前情况。在这种情况下只能经过大量的反复的实验和观察。
下面是LSWS官方网站的一个测试图,可以看出LSWS和lighttpd在keep alive情况下差不大,当然不排除他们对自己的web server的偏向,或则他们更熟悉自己的server彻底配置。
图片太大,显示不完,建议拽出来看。http://www.litespeedtech.com/images/bench/ka.gif

Lighttpd <wbr>配置与性能优化

就使用的技术而言,lighttpd使用了Linux 2.6+使用epoll,而在FreeBSD上使用了kqueue。默认的都是poll,而我们的系统是freebsd,很不幸的是,当我在bsd上使用kqueue特性时,测试的结果显示,效率明显变低。我没想明白为什么,c10k的文章我没有足够时间去读,可以做个参考。
For more infomation in this topic take a look at http://www.kegel.com/c10k.html

再一个就是sendfile()技术,他能最小化应用程序所做的工作,直接把一个文件送到网卡。
在Linux 2.6+上使用sendfile64,可见现在好多小的httpd都对Linux 2.6+支持的很好,比如tux。

在针对我们的应用情况下,对配置文件进行一些修改。Time per request: 能达到0.65 [ms]左右相对于以前测的0.734[ms]左右,性能有很大提高。如果有大量的时间对每个性能指标进行测试,去掉不必要的模块和特性,应该在性能上还会有所提高,估计最好能到0.61[ms]左右。最近测试如下:
lighttpd 配置文件:去掉了很多不必要的特性。
#######lighttpd.conf.
server.port = 7983
server.modules = ("mod_access")
server.document-root = "/usr/home/yangjian/lighttpd/doc/"
server.pid-file = "/usr/home/yangjian/lighttpd/lighttpd.pid"
mimetype.assign = (
".html" => "text/html",
".js" => "text/javascript",
)
server.max-keep-alive-requests =4000
dir-listing.activate = "disable"

测试强度: ./ab -n 100000 -c 1000 http://192.168.241.109:7983/index.html

Server Software: lighttpd/1.4.7
Server Hostname: 192.168.241.109
Server Port: 7983

Document Path: /index.html
Document Length: 449 bytes

Concurrency Level: 1000
Time taken for tests: 65.180092 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 68281158 bytes
HTML transferred: 44953431 bytes
Requests per second: 1534.21 [#/sec] (mean)
Time per request: 651.801 [ms] (mean)
Time per request: 0.652 [ms] (mean, across all concurrent requests)
Transfer rate: 1023.01 [Kbytes/sec] received

LiteSpeed的测试都是在默认配置下。它的结果不太稳定,最好的记录是0.603ms,这是lighttpd所没有过的好成绩,但大多数情况下都在0.70左右,有好多次在0.76以上。我这里说的都是LiteSpeed的标准版,pro版是要花钱的性能当然要好些。LiteSpeed是同过web 管理的,这是它的一个比较好的特性。如果经过优化我想它和lighttpd应该还是不差上下的。

我暂时先选择相对稳定点的lighttpd作为我们的web server,然后对它的配置和优化进行说明。Lighttpd配置文件很简单,相信大家配过apache的都能看明白。我就只对影响性能的指标挑出来讨论。参考文章http://www.lighttpd.net/documentation

可以看出我上面的那个配置文件非常简短。我去掉了所有不必要的特性。添加的模块只有mod_access,如果没有它访问是就会出现403错误。除了它之外系统默认启用的模块有
mod_indexfiles ,mod_dirlisting, mod_staticfile。但在默认已经编译进去的模块清单如下:
对于这些已经编译进去的在启用时就非常简单了,enable一下就ok了。Lighttpd想添加一个功能一般情况下只需要添加一两行指令到配置文件中,比apache易配置多了。
Plugins:
enabled:
mod_access
mod_accesslog
mod_alias
mod_auth
mod_cgi
mod_compress
mod_dirlisting
mod_evhost
mod_expire
mod_fastcgi
mod_indexfiles
mod_proxy
mod_rrdtool
mod_scgi
mod_secdownload
mod_setenv
mod_simple_vhost
mod_staticfile
mod_status
mod_userdir
mod_usertrack
mod_webdav
disabled:
mod_cml
mod_mysql_vhost
mod_redirect
mod_rewrite
mod_ssi
mod_trigger_b4_dl

Features:
enabled:
auth-crypt
compress-bzip2
compress-deflate
compress-gzip
large-files
network-ipv6
disabled:
auth-ldap
network-openssl
regex-conditionals
stat-cache-fam
storage-gdbm
storage-memcache
webdav-properties
每个模块的作用和我上次写的apache的性能优化中提到的大同小异。所以我想如果只保留核心功能,性能应该会提升一些的。配置选项:
server.chroot
使用chroot提高安全性时,web服务器的root目录。建议使用。

server.username = "..." server.groupname = "..."
放弃root权限。

dir-listing.activate
如果没有找到index文件就列出目录。建议disable。

server.event-handler
设置时间处理方式。Default: "poll"。Bsd上默认就可以,使用kqueue反而影响了效率。原因不明。以下是各种操作系统对应的方式:
OS Method Config-Value
all select select
Unix poll poll
Linux 2.4+ rt-signals linux-rtsig
Linux 2.6+ epoll linux-sysepoll
Solaris /dev/poll solaris-devpoll
FreeBSD, ... kqueue freebsd-kqueue
server.max-request-size
maximum size in kbytes of the request (header + body)
Default: 2Gb

server.max-worker
lighttpd默认只启动一个进程工作,但也支持apache那样启动多个进程,我的实验显示启动多个进程同时工作时并不能提高性能。

server.max-keep-alive-requests
这一条比较关键,对性能的影响比较大。在一个keep-alive会话终止连接前能接受处理的最大请求数。Default: 128,对一个高负载的应用来说是不够的。我用了4000。

server.max-keep-alive-idle
一个空闲keep-alive连接被丢弃前,存在的的最大秒数。Default: 30。


server.error-handler-404
页面找不到时候的处理,对性能没什么影响,指出来一下,例如:
server.error-handler-404 = "/error-404.php"

server.max-fds
因为lighttpd是一个单线程(single-threaded)服务器,它的主要资源限制是文件描述符数目,默认值是1024。如果在一个高负载的站点上,可能你需要通过下面的设定增加这个限定值
server.max-fds = 2048 但这个限定只有在lighttpd做为root身份运行时才能生效。


connection.kbytes-per-second,server.kbytes-per-second
还有值得一提的时lighttpd可以限制每个连接或则特定虚拟机的流量。


compress.cache-dir,compress.filetype
如果文本稍微大点可以考虑使用压缩算法,减少带宽同时也能提高效率。例如:
compress.cache-dir = "/var/www/cache/"
compress.filetype = ("text/plain", "text/html")


server.stat-cache-engine = "fam"
这一条能明显提升性能,stat() cache。一个stat调用代价可能是昂贵的。为它设一个cache能省时间又避免上下文切换。替代每次都stat()来确定文件的存在,它只stat()一次,然后会监视目录,如果目录不变,他里面的文件也就没有变化。我们的内存文件系统中有没必要保留,依情况而定。
server.stat-cache-engine = "fam" # either fam, simple or disabled

在FreeBSD上可能提升一些性能同过 启用accept-filters仅仅编译你的内核用下面选项:options ACCEPT_FILTER_HTTP
先写这么多,以后随着lighttpd应用再对内容进行丰富.

 

4,优化

     1 最大连接数

            默认是1024
            修改 server.max-fds,大流量网站推荐2048.

            因为lighttpd基于线程,而apache(MPM-prefork)基于子进程,
所以apache需要设置startservers,maxclients等,这里不需要

     2 stat() 缓存

               stat() 这样的系统调用,开销也是相当明显的.
              缓存能够节约时间和环境切换次数(context switches)

              一句话,lighttpd.conf加上
              server.stat-cache-engine = “fam”

              lighttpd还另外提供simple(缓存1秒内的stat()),disabled选项.
              相信没人会选disabled吧.

      3 常连接(HTTP Keep-Alive)

             一般来说,一个系统能够打开的文件个数是有限制的(文件描述符限制)
            常连接占用文件描述符,对非并发的访问没有什么意义.

            (文件描述符的数量和许多原因有关,比如日志文件数量,并发数目等)

           这是lighttpd在keep-alive方面的默认值.
server.max-keep-alive-requests = 128
server.max-keep-alive-idle = 30

换言之,lighttpd最多可以同时承受30秒长的常连接,每个连接最多请求128个文件.
但这个默认值确实不适合非并发这种多数情况.

lighttpd.conf 中减小
server.max-keep-alive-requests
server.max-keep-alive-idle
两个值,可以减缓这种现象.

甚至可以关闭lighttpd keep-alive.
server.max-keep-alive-requests = 0

4 事件处理

对于linux kernel 2.6来说,没有别的可说
lighttpd.conf中加上这一句足矣
server.event-handler = “linux-sysepoll”

另外,
linux 2.4 使用 linux-rtsig
freebsd 使用 freebsd-kqueue
unix 使用 poll

5 网络处理

lighttpd 大量使用了 sendfile() 这样一个高效的系统调用.
减少了从应用程序到网卡间的距离.
(同时也减少了lighttpd对cpu的占用,这部分占用转嫁到内核身上了)

根据平台,可以设置不同的参数.
server.network-backend = “linux-sendfile”
(linux)
freebsd: freebsd-sendfile
unix: writev

如果有兴趣的话,也可以看看lighttpd在async io(aio)上的实现,仅限 lighttpd 1.5
(linux-aio-sendfile, posix-aio, gthread-aio)

此外,网络方面,核心的参数也需要适当进行修改,
这里就不需要详细说明了.


    5,启动
    6,配置日志
    logrotate & cronolog
logrotate很粗暴,直接把进程砍了然后移动日志
cronolog就是比较不错的方式.
lighttpd用法:
accesslog.filename = " |/usr/sbin/cronolog /var/log/lighttpd/%Y/%m/%d/access_XXXX.log"


    7,安装pcre
      从何处下载?
      http://www.pcre.org/
       wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.4.tar.bz2
     安装过程:
      
  ./configure
  make clean
  make
  make install

8,支持fam
   gamin默认已安装了此包
   yum install gamin-devel

   另外配置时需添加:
   ./configure --prefix=/usr/local/lighttpd --with-fam

9,测试lighttpd的启动:
/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf

10,防止盗链
  #$HTTP["referer"] !~ "^($|http://.*/.(chinafotopress/.com|chinafotopress/.cn))" {      
#    $HTTP["url"] =~ "/.(jpg|jpeg|png|gif|rar|zip|mp3)$" {
#       #url.redirect = (".*"    => "http://www.baidu.com/")
#        url.access-deny = (".jpg")
#    }
#}

#$HTTP["referer"] == "" {
#    $HTTP["url"] =~ "/.(jpg|jpeg|png|gif|rar|zip|mp3)$" {
#       #url.redirect = (".*"    => "http://www.baidu.com/")
#        url.access-deny = (".jpg")
#    }
#}