5

为了减轻 Apache 的负载,人们经常建议使用 lighttpd 来提供静态内容。

例如http://www.linux.com/feature/51673

在此设置中,Apache 通过 mod_proxy 将静态内容请求传递回 lighttpd,同时自己处理动态请求。

我的问题是:这如何减少服务器的负载?由于您仍然为每个传入的请求生成一个 apache 进程,这对负载有何积极影响?从我可以看到,通过 lighttpd 代理其请求的 Apache 进程的大小与它为文件本身提供服务时一样大。

4

5 回答 5

9

在 Apache后面运行 Lighttpd来提供静态文件对我来说确实是个脑残。Apache 仍然需要解包 HTTP 数据包并通过其解析树解析请求,发送代理请求,然后 Lighttpd 必须重新解包,点击文件系统并通过 Apache 将文件发送回。我从未听说有人在生产中使用这样的设置。

您将看到,人们使用像Nginx这样的轻量级网络服务器作为前端服务器来为 Apache 提供静态文件和代理动态 URL。或者,您可以运行VarnishSquid作为缓存反向代理前端,以便提供所有高流量静态文件(即图像、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 仍然会非常糟糕,您将无法将几乎尽可能多的 prefork 进程放入 RAM。

我可能会为 Apache 想出一个“噩梦配置”,它实际上比将这些请求代理到后端 Lighttpd 更慢地提供静态文件,但它会涉及在 Apache 中启用昂贵的功能,例如在 Lighttpd 中禁用的 .htaccess,所以这真的不公平。

于 2008-10-09T01:48:01.197 回答
2
  1. 如果您仍然有能力从同一台机器上提供静态和动态内容(正如您在参考文章中所做的那样),那么我真的认为该设置没有任何意义。
  2. 也许它确实减少了 Apache 的负载,因为它不必对磁盘做 IO,但它会增加同一台机器上 Lighttpd 的负载,从而减少apache 的可用负载......
  3. 也许 Lighttpd IO 访问比 Apache 1.3 更轻,但为什么不完全切换到 Apache 2 或 Lighttpd 呢?如果性能真的开始变差,请将静态文件托管在另一台机器 (media.yourdomain.com) 上。

我在这里找到了关于如何进行高性能设置的简短介绍: 部署 Django -> 在结束前滚动到Scaling某个页面

于 2008-10-08T09:40:31.803 回答
0

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

于 2008-10-08T09:17:45.470 回答
0

我不太了解 Apache 的内部工作原理,但我看到的一种解释是关于内存压力。简而言之,Apache 试图平衡它用于缓存和动态页面的内存;但通常以缓存过多而应用程序过少而告终。如果将它们分成不同的进程,每个进程都会针对负载类型进行优化。

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

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

于 2008-10-08T10:08:58.783 回答
0

使用 Apache MPM Worker fastcgi 这将降低您的服务器内存使用率。MPM worker 比 Prefork 更好地提供静态内容,并且在静态内容方面几乎与 lighttpd 相当。

于 2008-11-17T01:19:07.480 回答