Apache 和 Lighttpd 前置代理概念

5
为了减轻Apache的负担,人们经常建议使用lighttpd来提供静态内容。例如:http://www.linux.com/feature/51673 在这种设置中,Apache通过mod_proxy将对静态内容的请求传递回lighttpd,同时自己处理动态请求。
我的问题是:这如何减轻服务器的负担?由于每个请求仍然会生成一个Apache进程,这如何对负载产生积极影响?据我所见,通过lighttpd代理其请求的Apache进程的大小与如果它本身提供文件时的大小一样大。
5个回答

9
在Apache后面运行Lighttpd来提供静态文件似乎对我来说很愚蠢。Apache仍然需要解压HTTP数据包并通过其解析树解析请求,发送代理请求,然后Lighttpd必须重新解压缩,访问文件系统并通过Apache发送文件。我从未听说过有人在生产中使用这样的设置。
你会看到,人们使用像Nginx这样的轻量级Web服务器作为前端服务器来提供静态文件,并将动态URL代理到Apache。或者,您可以将VarnishSquid作为缓存反向代理前端运行,以便所有高流量的静态文件(即图像、CSS等以及任何愿意发送缓存友好标头的动态页面)都存储在内存中。
Apache也可以优化为提供静态文件--所以当我听到人们抱怨Apache时,通常是因为他们不知道如何配置它。他们只使用了预派发MPM(与线程或工作线程相比),并启用了各种模块(通常他们从Linux发行版的厨房水槽Apache包中运行,该包将所有内容构建为模块,并默认启用10-20个或更多模块)。首先通过关闭不需要的模块/支持.htaccess之类的愚蠢功能来调整Apache(这会使Apache在每个请求上扫描文件系统!)。 (您还可以运行两个Apache实例,其中“轻量级”Apache作为前端代理到“重型”Apache以处理动态请求...也许您的前端是线程化的,但后端是预派发的,因为您必须运行线程不安全的外部模块,例如mod_php。)
回复:
由于您仍然为每个请求生成一个Apache进程,这如何对负载产生积极影响?从我看到的情况来看,代理其请求的Apache进程的大小与如果它本身提供文件时的大小一样大。
如果您在每个请求上生成进程,那么这意味着您正在使用prefork MPM。请记住,当操作系统报告每个进程的内存使用情况时,不是所有内存都被固定,很多进程处于空闲状态。而当谈到速度时,您更关心给定请求的请求解析和内部代码分支(服务器正在处理多少处理?)而不是操作系统报告的内存使用情况。
例如,如果您启用了类似mod_php的东西,那么每个工作进程都将立即增加约20-40M(取决于PHP解释器中启用了什么),但这并不意味着Apache在静态请求上使用该内存。当然,如果您正在优化服务器以实现小型静态文件的最大并发性,则启用mod_php仍然非常糟糕,您无法将几乎相同数量的prefork进程装入RAM中。
我可能会想出一个“噩梦配置”用于Apache,使其在提供静态文件时比代理这些请求到后端Lighttpd更慢,但这将涉及在Apache中启用像.htaccess这样的昂贵功能,在Lighttpd中禁用这些功能,因此这并不公平。

2
  1. 如果你仍然有能力从同一台机器上提供静态和动态内容(就像他们在参考文章中所做的那样),那么我真的看不出这种设置的意义。
  2. 也许这确实减轻了Apache的负载,因为它不必对磁盘进行IO操作,但它会增加Lighttpd在同一台机器上的负载,从而降低了可用于Apache的负载...
  3. 也许Lighttpd的IO访问比Apache 1.3更轻,但为什么不完全切换到Apache 2或Lighttpd呢?如果性能真的开始变差,就将静态文件托管到另一台机器上(media.yourdomain.com)。

关于如何创建高性能设置的简要介绍可以在这里找到: 部署Django -> 滚动到接近结尾的Scaling页面


0
使用Apache MPM Worker fastcgi可以降低服务器内存使用率。MPM worker比Prefork更好地提供静态内容,并且在处理静态内容时几乎与lighttpd相当。

CGI进程将消耗剩余的差异;) 这根本不会有任何影响。 - Mario Mueller

0

每个请求都没有为Apache生成一个进程 - 静态文件(如图像)直接由lighttpd获取。


0

我对Apache的内部工作原理不是很了解,但我看到过一个关于内存压力的解释。简而言之,Apache试图平衡用于缓存和动态页面的内存使用情况,但通常会出现太多缓存和太少应用程序的情况。如果将它们分开到不同的进程中,每个进程都将针对特定的负载进行优化。

目前,我正在使用nginx作为前端。它非常快速轻便,并专门设计为前端代理;同时也可以提供静态文件服务。事实上,由于它还可以调用FastCGI进程,您可以摆脱Apache,仍然享受拆分文件/应用程序进程的好处。(还有一些额外的memcached魔法看起来绝对是天才)

(是的,lighttpd也可以用作Apache和/或FastCGI的前端)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接