我应该在 Apache2 中激活 keepAlive 吗?

Gab*_*osa 26 keepalive apache-2.2

在任何默认安装中,Apache 2 都关闭了 keepAlive,但查看另一台服务器时,keepAlive 模块已打开。

那么,我怎么知道 keepAlive 是否适合我?我在哪里可以找到一些关于配置这个的好例子?

Jes*_*r M 32

已经有 2 个很好的答案,但可能最重要的现实生活问题尚未提及。

首先,OP 可能想阅读前面的 2 个答案和这篇小博文,以了解什么是 keepalive。(作者没有详细说明连接打开的时间越长 TCPI/IP 变得“更快”的部分。确实,更持久的连接受益于IP 窗口缩放,但效果并不显着,除非文件是大,或者带宽延迟乘积异常大。)

使用 Apache 时反对 HTTP Keepalive 的一大争论是它会阻止 Apache 进程。即,使用 keepalives 的客户端将阻止“他的”Apache 进程为任何其他客户端提供服务,直到客户端关闭连接或达到超时。在同一时间段内,这个 Apache 实例可以为许多其他连接提供服务。

现在,一个非常常见的 Apache 配置是Prefork MPM和 PHP/Perl/Python 解释器,以及上述语言的应用程序代码。在这种情况下,每个 Apache 进程都是“重”的,因为它占用了几兆字节的 RAM(Apache 与解释器和应用程序代码链接)。这与每个保活的 Apache 实例的阻塞一起,是低效的。

一种常见的解决方法是使用具有不同配置的 2 个 Apache 服务器(都在同一物理服务器上,或根据需要在 2 个服务器上):

  • 一个带有 mod_php(或任何使用的编程语言)的“重”用于动态内容,并关闭 keepalives
  • 一个具有最少模块集的“轻量级”,用于提供静态内容(图像、css、js 等),并.

然后,您可以在需要时扩展这种动态和静态内容的分离,例如:

  • 对静态内容使用事件驱动的服务器,例如nginx
  • 将 CDN 用于静态内容(可以为您提供所有静态内容)
  • 实现静态和/或动态内容的缓存

另一种避免阻塞 Apache 的方法是使用具有更智能连接处理的负载平衡器,例如Perlbal

.. 以及更多。:-)

  • 这些答案在 8 年后仍然适用吗? (2认同)
  • 是的,如果您使用 prefork MPM,仍然相关。请注意,Apache httpd 2.4(例如在 RHEL7 中)默认使用 KeepAlive On(但没有在其配置中明确列出它 — 至少在 RHEL7 中)。 (2认同)

Max*_*nin 6

Keepalive 在某些情况下可能很好,但在其他情况下可能非常糟糕。它们减少了建立新连接的时间和精力,但它们会在 keepalive 超时期间占用服务器资源。例子:

  • 带有许多小对象的页面,拨号客户端 - 应该打开 keepalive。
  • 带有几个大对象的页面 - keepalive 不会是一个优势。
  • 具有大量唯一访问者的服务器 - 应该关闭 keepalive(否则,套接字和线程将坐在内存中等待 keepalive 超时而不为新客户端提供服务)。

如您所见,KeepAliveTimeout 还将在优化服务器性能方面发挥重要作用。

查看您的使用模式并自行决定。