以前我一个同事做过测试,用lighttpd的fastCGI方式跑php,确实更节省内存,
不过在性能上中等访问量时反而比apache慢,小访问量和超大访问量时确又比apache快,这是在内存足够的情况下测试的。
JavaEye2.0上线之前,我曾经用Lighttpd跑过半个月的JavaEye 1.0(PHPBB论坛),在此前我自己做的压力测试表明大负载量下面,Apache的module运行PHP比Lighttpd的FastCGI运行PHP要快不少,这一点和你的同事测试结果是吻合的。但实际上部署上线以后,Lighttpd以FastCGI方式运行PHP,比原来的Apache明显要快很多,所以测试不能等同于实际生产环境。
你要考虑到一个很重要的因素,在实际互联网环境下,用户浏览器发起请求,用户浏览器在接受页面数据的这两个过程一般都需要1-2秒延迟,而PHP程序处理往往只需要0.1-0.2秒,所以FastCGI方式下,你可以用很少的PHP进程去响应很大的并发量。但在测试环境下,这两个和用户交互的重要延迟时间被彻底抹杀了,FastCGI开了几个进程,就只能同时响应几个请求,其他测试请求就必须等待,当然会比Apache慢了。
例如你用ab并发100个请求,Apache会在很短的时间内fork出来100个进程同时处理,但是FastCGI只有10个进程,他只能同时处理10个请求,其他请求必须等待,因此在测试环境下大并发量FastCGI就显得慢得多。但实际互联网环境下并不是这么回事,除了浏览器的请求和页面下载的延迟作用可以导致FastCGI显得更有效率之外,一个动态请求还会附带n个js,css,图片的请求,对于apache来说,都需要fork进程处理这些静态资源,而这些负载在ab测试当中都无法被体现出来。
这是两种不同的运行方式不可一概而论的。Apache以module的方式加载PHP,的确一个httpd不过20多MB内存,但是对于JavaEye这样访问量的网站来说,峰值访问期,apache需要fork出来150个httpd进程来处理,那么你算一下,150*20M = 3GB内存,是不是更加恐怖呢?同样的情况Lighttpd+FastCGI(Ruby),Lighttpd仅仅占用30MB内存,FastCGI开10 个就够了,总共需要30+180*10=1.8GB,你觉得哪种方式节省内存?
顺便说一句,Lighttpd+FastCGI(PHP)是比Apache更好的PHP部署环境,根据我的经验,FastCGI方式下的每个PHP进程保持在40-50MB左右的内存,总共需要30+50*10=530MB,比Apache的3GB,简直不可同日而语阿!