简单说一下:Lighttpd是一个轻量级的Web 服务器,支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。其静态文件的响应能力远高于Apache,可谓Web服务器的后期之秀。

  许多技术专家认为,在Web 服务器中Lighttpd比Apache更小更轻量,却拥有比后者更高的性能。虽然Lighttpd在Web服务器方面只占很小的市场份额,“但它正极速增长,日后必将是Web服务器领域的有力竞争者。”

   

  针对我们的普遍应用情况下,对配置文件进行一些修改。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”

  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

Features: enabled: ; auth-crypt compress-bzip2 compress-deflate compress-gzip large-files network-ipv6 disabled: auth-ldap network-openssl regex-conditionals stat-cache-fam 1 storage-gdbm 9 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 *w
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.max-fds 因为lighttpd是一个单线程(single-threaded)服务器,它的主要资源限制是文件描述符数目,默认值是1024。如果在一个高负载的站点上,可能你需要通过下面的设定增加这个限定值

server.max-fds = 2048 但这个限定只有在lighttpd做为root身份运行时才能生效。

onnection.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

  如果需要跑静态页面,可以忽略本文 keep-alive 部分(并调大常连接数),以下是比较常用的优化措施:

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) 此外,网络方面,核心的参数也需要适当进行修改, 这里就不需要详细说明了.

6 本文涉及 lighttpd.conf 参数总结以下适合linux 2.6,php-fastcgi

var.author="fcicq"
server.stat-cache-engine = "fam"
server.network-backend = "linux-sendfile

server.event-handler = "linux-sysepoll"
server.max-keep-alive-requests = 0