为了减轻Apache的负担,人们经常建议使用lighttpd来提供静态内容.
例如http://www.linux.com/feature/51673
在此设置中,Apache通过mod_proxy将静态内容请求传递回lighttpd,同时为自身提供动态请求.
我的问题是:这如何减少服务器上的负载?由于每个请求都会产生一个apache进程,这对负载有何影响?从我可以看到,通过lighttpd代理其请求的Apache进程的大小与它为文件本身提供服务时的大小一样大.
在 Apache之后运行Lighttpd 来提供静态文件肯定对我来说是一个脑子.Apache仍然必须解压缩HTTP数据包并通过其解析树解析请求,发送代理请求,然后Lighttpd必须重新解压缩,命中文件系统并通过Apache发回文件.我从来没有听说有人在制作中使用这样的设置.
你会看到,人们使用像Nginx这样的轻量级网络服务器作为前端服务器来为Apache提供静态文件和代理动态URL.或者,您可以将Varnish或Squid作为缓存反向代理前端运行,以便所有高流量静态文件(即图像,CSS等以及您愿意发送缓存友好标头的任何动态页面)都可以使用记忆
Apache也可以进行优化以提供静态文件 - 所以当我听到人们抱怨Apache时,他们真的不知道如何配置它.他们只使用了prefork MPM(相对于线程或工作者)并启用了各种模块(通常它们是从Linux发行版的厨房接收器Apache程序包运行的,它将所有内容构建为模块并默认启用10-20模块或更多).通过关闭不需要的模块/愚蠢的功能来调整Apache,例如支持.htaccess(这使Apache在每个请求上扫描文件系统!).(你也可以运行两个Apache实例,一个"轻"的Apache作为前端代理一个"重"的Apache动态请求......
回覆:
由于每个请求都会产生一个apache进程,这对负载有何影响?从我可以看到,通过lighttpd代理其请求的Apache进程的大小与它为文件本身提供服务时的大小一样大.
如果您在每个请求中生成进程,那么这意味着您正在使用prefork MPM.请记住,当操作系统报告每个进程的内存使用情况时,并非所有内存都已连接,很多进程都处于空闲状态.当你谈论速度时,你更关心的是请求解析和给定请求的内部代码分支(服务器处理多少处理?)而不是操作系统报告的内存使用情况.
例如,如果启用mod_php之类的东西,那么每个工作进程将立即上升大约20-40M(取决于PHP解释器中启用的内容),但这并不意味着Apache正在使用该内存静态请求.当然,如果你在小型静态文件上优化服务器以获得最大的并发性,那么启用mod_php仍然会非常糟糕,你将无法在RAM中安装几乎同样多的prefork进程.
我也许可以想出一个"噩梦配置"为Apache这将使得它实际上更慢提供静态文件的时间比进行代理这些请求到后端Lighttpd的,但它会涉及使昂贵的功能,如Apache中的.htaccess在Lighttpd的是残疾人,所以这不太公平.