我应该在Apache2中激活keepAlive吗?


25

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

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

Answers:


31

已经有2个好的答案,但是可能没有提到现实生活中最重要的问题

首先,OP可能需要阅读前面的2个答案和此小博文,以了解什么是keepalive。(作者并未详细说明打开连接的时间越长,TCPI / IP就会“更快”。的确,持久的连接受益于IP窗口缩放,但是除非文件被压缩,否则效果并不明显。较大,或者带宽延迟积很大。)

使用Apache时反对HTTP Keepalive的一个主要论点是它阻止了Apache进程。也就是说,使用keepalive的客户端将阻止“他的” Apache进程为其他客户端提供服务,直到该客户端关闭连接或达到超时为止。在相同的时间范围内,该Apache实例可以提供许多其他连接。

现在,非常常见的Apache配置是Prefork MPM和PHP / Perl / Python解释器以及上述语言的应用程序代码。在这种情况下,每个Apache进程都占用大量MB RAM(与解释器和应用程序代码链接的Apache),这意味着它“繁重”。这与阻止每个keepalive'd Apache实例一起使用,效率很低。

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

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

然后,您可以根据需要扩展动态和静态内容的分离,例如:

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

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

.. 以及更多。:-)


2
这些答案在8年后仍然有用吗?
TheStoryCoder

是的,如果您使用的是前叉MPM,则仍然适用。请注意,Apache httpd 2.4(例如,在RHEL7中)默认情况下使用KeepAlive On(但未在其配置中明确列出它-至少在RHEL7中)。
卡梅隆·克尔

5

在某些情况下,Keepalive可能很好,而在另一些情况下,它们可能非常糟糕。它们减少了建立新连接的时间和精力,但是在保持活动超时期间占用服务器资源。例子:

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

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

查看您的使用方式并自己决定。


0

您绝对应该使用KeepAlive On。

看到:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

这样,浏览器将重新使用单个TCP连接来发送多个查询。通常,网站具有许多组件(HTML页面,javascript代码,图像)。只要这些资源位于同一域中,因此可以由同一服务器提供服务,由于浏览器无需建立新的TCP连接,因此KeepAlive连接可以极大地提高性能。

浏览器通常会打开大约3个与域的并行连接。假设您的网站中有18个对象。浏览器将打开3个连接,并使用KeepAlive模式在每个连接中下载6个对象。如果没有KeepAlive,则必须打开18个TCP连接,这非常慢。

大多数或所有现代浏览器都符合HTTP / 1.1,因此应该可以使用。

某些HTTP代理(例如Squid)不符合HTTP / 1.1,但无论如何它们都要求使用KeepAlive连接。


这只是出于客户端考虑,而我认为服务器端资源的使用也很重要。
Morgan Cheng

服务器端资源的使用比用户感知的延迟重要吗?
伊夫·容克伊拉

1
我也相信可以打开KeepAlive,但是Apache的默认超时时间为15秒,因为它使进程阻塞的时间太长了,所以它太宽裕了。我通常将超时设置为2秒左右,这导致在大约一个页面加载期间使用KeepAlive。
马丁·海默斯
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.