为什么Apache HTTP Server如此复杂?


14

Apache HTTP服务器是比,说一个相当大的项目要大得多,lighthttpnginx否则肯定了“简单的HTTP服务器,”你看在C / C左右浮动++教程。

额外的代码是做什么的?它是增加安全性/稳定性(如果可以的话,如何呢?),还是仅用于执行诸如解析Apache conf文件/ .htaccess键入事物(以及,我猜VirtualHosts等等)之类的事情。

我要求不要批评Apache,但是因为我对编写各种Web服务器感兴趣,并且我想知道一些事情,尽管可能并不明显,但对于记住一个安全,稳定和快速的Web服务器来说,这些事情很重要。


它有助于清除所有不打包齿轮的人。
乔尔·埃瑟顿

6
这不是一个真正的答案-但我听说这个名字来自这样一个事实,即即使在开发初期,它也有很多贡献者。贡献了许多补丁,使其成为Patchy服务器。真实的故事。
杰里米

+1 @Joel Etherton:好故事,尤其是事实。但是,永远不要让真相成为好故事的
障碍

+1 @aharon以质疑现状为例。但是“编写网络服务器”?当有很多产品以及Apache时,我们不是在这里重新发明轮子吗?
therobyouknow

Answers:


20

它要复杂得多,因为:

  • 这是旧的
  • 它具有更大的功能集(“ 功能集比较”),
  • 它是模块化的
  • 它具有更广泛的平台支持OS支持比较),
  • 它具有多种操作模式(多进程,多线程等)。

但是也:

  • 它的开发更加积极(“ 状态比较”。截至2011年5月28日,Apache httpd具有最新更新,尽管其固有的发行过程应因其扩展的复杂性(而不是其竞争对手)而受到阻碍。)

话虽如此,R。的答案包含有关其体系结构的合理观点,以及为什么其他一些Web服务器也从相对成名的优势中受益。这取决于您想要什么。

您可能还需要查看/programming/475386/apache-vs-nginx-vs-lighttpd-which-is-simpler-to-configure-and-administer以获得更多内容。尽管没有直接回答您的问题,但整个主题指出了许多差异。


如果对从头开始编写Web服务器感兴趣,我会说学习Apache httpd是一件好事,特别是如果您可以回顾一下它随着时间的演变。它还显示了您需要避免的事情(无论是解决得当还是在其他方面都胜过其他事情)。但是,开始的代码可能有点复杂,因此您可能更喜欢使用较小,重量更轻的服务器。但是,请研究其总体架构并将其与其他架构进行比较。


1
+1:仅通过阅读变更日志历史记录,对了解Web服务器本身的演变方式以及多年来团队所面临的挑战具有非常重要的指导意义。
乔尔·埃瑟顿

1
+1 @haylem“其他一些相对享有名望的Web服务器受益” –令人欣慰的是,阅读了据说与Apache兼容的Apache替代品,即它们几乎可以完成相同的工作。
therobyouknow 2011年

3

我个人认为,这是因为它具有所有功能。您可以使用Apache来执行操作,而现在使用nginx或lighthttpd都无法执行。Apache实际上是一个附带HTTP支持的平台。您几乎可以实现任何协议,例如FTP或SMTP(例如,请参见mod_echo)。它具有对过滤器的支持,该过滤器使您可以:例如,从数据库而不是文件中提供PHP代码(因为mod_php是过滤器模块,而不是内容生成器)。这似乎不是一个很有用的想法,但是通常您可以使用过滤器来更改任何进出的内容,而无需调整原始内容生产者。它对不再存在的HTTP客户端进行了调整,但是在那时,Apache是​​以一致且无错误的方式为它们提供服务的唯一方法。如今,很多东西都没有使用过。

额外的代码也用于安全性,因为当您感到有人在利用安全漏洞时,mod_log_forensics和CoreDumpDirectory一起提供了一个真正的工具。对于其他Web服务器,还没有听说过类似的信息。至于稳定性,它来自架构良好的内核,而不是一些额外的代码。Apache开发人员邮件列表上的人被称为“核心稳定者”。他们对内核的任何更改都非常挑剔,并且倾向于将它们推入模块,这实际上使Apache相当稳定。如果失败,则大多数情况下是模块故障,而不是服务器核心中的错误。


3

我已经使用Apache超过十二年,同时担任大​​型Perl,Python和Ruby Web应用程序的管理员和开发人员。Apache是​​坚如磐石的Web服务器,具有简洁/模块化设计和强大的UNIX功能。它最强大的功能之一就是其纯粹的模块化和良好的文档记录。这是一个非常易于管理的Web服务器。15年的主导市场份额可以清楚地看出它的成熟和证明。

尽管用户文档非常好,但是不幸的是,对于开发人员/模块编写者而言,文档很少,而且我认为这会给它带来一点伤害,因为它没有吸引尽可能多的开发人员。但这绝不意味着它的设计不当-在这方面只是记录不清。尼克·邱(Nick Kew)有一本书,似乎是模块编写者的权威资源。但是,如果项目本身在编写模块的各个方面都有一些更好的文档,那就太好了。

至于它的过度设计-hogwash。它具有出色的设计。是的,到处都有一些疣,但是对于所有软件都是如此。它对内存池的使用非常棒,它可以插入不同的后端,这表明它是多么干净和模块化,它具有出色的C-API,并且APR使许多事情变得更加轻松,不仅对于Apache项目而言。其他项目的开发人员。如果您根本不关心可移植性,那么您会感激APR。它可能并不完美,但仍然坚固,设计合理且非常方便。

从功能,灵活性,管理,平台支持,可伸缩性,文档和成熟度的角度来看,Apache是​​一款出色的Web服务器。


-2

它是过度设计/过度设计的。最糟糕的是,它使用APR(Apache可移植运行时),这是一个膨胀层,最终花费了许多级别的函数调用和动态内存分配,并释放了完成单个printf调用的等效时间。所有这些导致它成为:

  • 非常慢
  • 非常耗费资源
  • 无法审核安全性
  • 难以理解和修改

5
您通常会指出其复杂性和(可能会争论,取决于哪些部分)不良设计的陷阱;不管这些陈述可能是有效的,它们并不是造成其复杂性的原因
Haylem 2011年

1
-1为APR膨胀。我在1.0之前的时代曾与APR合作,那时,它没有带来比1.3代码库更大的膨胀。同样,APR中的动态内存分配或多或少是1.3内存代码的精确副本。即使您是对的,任何形式的肿又如何使某些事情无法审核?
Jacek Prucia 2011年

同意@haylem(+1)并且也:@R ..的答案中的这四个点:你怎么知道?您要与什么进行比较。您可能是对的,但您的观点将是相对的,即“非常慢”-但与之相比呢?像这里提到的那些服务器?如果是这样,请引用它们。
therobyouknow 2011年

我相信thttpd网站在静态内容方面有一些不错的数字。更重要的是令人惊讶的是,从运行基于Web的学生作业系统的个人经验,阿帕奇也是很多慢与mod_perl比THTTPD只是运行的每个客户端的新的Perl实例。这是很久以前的事了,我从来没有做过严格的测试来找出所有原因。该部门刚刚购买了新服务器...
R .. GitHub停止帮助ICE

@R .:再说一遍,为什么还要用mod_perl运行它:)
haylem 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.