lighttpd
这两天试用了lighttpd来代替bbs使用的apache,印象深刻
bbs的在使用fweb之后一直使用 unix下的标准服务器apache作为web服务器。但是apache表现却不怎么令人满意。因为使用了php,所以还是用apache的1.3版本。 但是由于并发很高,导致随时有200+apache进程在运行,而且每个进程占用的内存随时间增加越来越多(可能是php的问题)。最后可能占用超过 700M的内存。同时apache导致系统用于nice的cpu也很高,一般在10%-20%之间。也许可以通过一些设置,比如静态文件的缓存时间,减少 每个apache进程的服务次数。这些问题是由于apache的prefork工作模式有关。每个apache进程只能同时服务于一个http连接。这种 模式好处在于每个进程不互相干扰,稳定性好;缺点也建立在优点之上,就是占用资源多,即使每个进程只使用2M内存(如果使用了php,这点内存根本不 够),100的并发连接就用掉200M的内存。不要以为100的并发很难达到,在低速连接占多数的时候,20req/s就能达到100的并发。即使在高速 连接占多数的情况(比如bbs),并发也是req/s的两倍左右。在使用apache的时候,bbs的web高峰期连接大概在150req/s,即使关掉 keepalive,还是要使用200多个进程来服务。
为了解决这个问题,我试用了其它一些http服务软件。很多短小精悍的,比如thttpd,boa之类的,不过大多不能支持fastcgi,也就不能用了。剩下有两个不错,一个是LiteSpeed Web Server(http://freshmeat.net/projects/lsws/), 还有一个就是lighttpd。先说LiteSpeed,这个不是开源软件,但标准版非商业使用是免费的,当然,只有二进制版本。这个软件速度稳定性都不 错,而且管理界面友好(web管理界面,他的配置文件是xml,很难配置),而且支持的功能也不少,文档比较齐全。但配置起来却让我摸不着头脑,总是不能 按照预期想法运行,由于没有形成一个社区,网上资源也很少,最后只能放弃。
lighttpd(www.lighttpd.net) 是一个开源软件,历史只有两三年。但功能不弱,我想用到的fastcgi,url rewrite都有,而且最重要的是,性能很强劲。在默认模式下,lighttpd使用poll()作为event handler,如果在linux2.4下,还可以选择rtsig作为event handler。如果不使用大文件(>4G)支持,lighttpd使用sendfile()来发送文件,完全的zero-copy。如果他的功能 还不能满足你的要求,你甚至可以自己写一个plugin,满足需求。
缺点就是bug比较多,软件并不稳定,而且文档太简略。尤其是使用内存,很难 说清楚具体使用量,一般在10-20M(繁忙站点),但有时候会突发到100多M,并稳定下来。不过相对apache的使用量,这个已经不算多。同时,软 件不稳定也很让人头痛,比如突然segfault,对于一个繁忙站点,这个是不能接受的!文档简略也很让人头痛,有些功能需要你自己猜测才懂得怎么配置。
不过总得来说,试用下来的感觉很好,如果配置得当,在相同并发下,使用的cpu和内存远小于apache。比如bbs,使用lighttpd后网页速度明显加快,高峰时期达到300+req/s,并发600+。但只使用了20多M内存,4%cpu。
具体配置可以参考网上的资料,下面说说要注意的地方:
1,编译的时候比较奇怪,我至今没弄清楚怎么选定只编译特定的模块。看了一下configure文件,大概是只要相应的库存在,就会编译相应的模块。比如如果有pcre的dev文件,就会编译rewrite模块。我只能放弃编译的静态版本的lighttpd的想法。
2,它的Conditional Configuration非常有用,可以实现很多想法。比如限制php只在特定目录下可以使用。简单的虚拟主机。不过似乎$HTTP["url"]的块里面不能使用mod_rewrite,只能二选其一。
3,lighttpd支持监听多端口,不过配置比较奇异,要使用Conditional Configuration。比如
$SERVER["socket"] == "0.0.0.0:8000" {}
就会让lighttpd同时监听server.port和8000端口。注意,{}里面不能再配置server.port,否则会导致重复绑定端口而退出。
4,linux2.4下使用rtsig后,性能表现要比poll要好很多,推荐使用!只需要增加
server.event-handler = "linux-rtsig"
到 配置文件就可以了。不过,软件实现方面有bug。在运行lighttpd时一定要加上-D参数,让lighttpd不自动运行到后台。否则你会发现一切正 常,但就是不能访问。估计是进程在设定socket fd的owner process后再daemonize,系统不能发送连接信号到程序。当然,一个程序运行于前台不是我们所需要的,我的解决方案是使用daemon这个软 件包。daemon是一个daemonize某个前台程序的工具,让人高兴的是,在子进程非正常退出的时候,daemon还会自动respawn!这点有 些类似于init进程,不过要比init好用点。daemon可以指定respawn的次数,间隔时间,放弃时间等等,否则,一个配置错误会让 daemon不停的respawn,让服务器假死。这样就曲线解决了lighttpd不稳定的问题。
5,如果你的站点很繁忙,那就把keepalive时间和次数减少点,比如
server.max-keep-alive-requests = 5
server.max-keep-alive-idle = 5
否则,即使lighttpd很强劲,处理太多fd也不是好想法,而且很容易导致fd overflow。
6, lighttpd使用fastcgi模式兼容php(还有python,ruby,perl等等,只要能使用fastcgi模式)。不过有一点兼容问题, 否则PATH_INFO环境变量不太对,php会报告no input file,你需要在php fcgi server配置文件里增加
"broken-scriptfilename" => "enable"
然后在php.ini里面增加
cgi.fix_pathinfo=1
lighttpd虽然不错,但大多情况下我还是推荐使用apache。
1,如果你不介意性能,或者有很充足的硬件,那就用apache吧,维护成本,bug成本,安全成本都会降低
2,你不希望出错,每一个连接都很重要,使用apache吧
3,你懒得配置lighttpd(确实要比apache复杂,如果你只是简单应用)
4,你要用php,但是fastcgi模式的php不兼容你的web应用。
5,你是apache fans
下面的情况,你需要选择lighttpd
1,你认为简单就是美,apache太庞大了
2,你没有充足的硬件,性能又很重要
3,你要尝试新事物
当然,你还可以选择同时运行apache和lighttpd,一个做前台,一个做后台。至于谁前谁后,似乎网上都有实例
下面是lighttpd官方网站给出的lighttpd特点,你可以参考参考;)
virtual hosts
virtual directory listings
URL-Rewriting, HTTP-Redirects
automatic expiration of files
Large File Support (64bit fileoffsets)
Ranges (start-end, start-, -end, multiple ranges)
on-the-fly output-compression with transparent caching
deflate, gzip, bzip2
authentication
basic, digest
backends: plain files, htpasswd, htdigest, ldap
fast and secure application controlled downloads
Server Side Includes
User Tracking
FastCGI, CGI, SSI
PHP-Support:
same speed as or faster than apache + mod_php4
includes a utility to spawn FastCGI processes (neccesary for PHP 4.3.x)
via FastCGI and CGI interface
support Code Caches like Turckmm, APC or eaccelarator
load-balanced FastCGI
(one webserver distibutes request to multiple PHP-servers via FastCGI)
Security features:
chroot(), set UID, set GID
protecting docroot
strict HTTP-header parsing
使用apache的理由还有一个
那就是公司政治因素。往往最终选择什么产品,技术不是最主要的。。。lighthttpd这种东西也只能自己玩玩。连商业中间件都把apache集成进去作为web server。。。
不懂
折腾