在任何默认安装中,Apache 2 都关闭了 keepAlive,但查看另一台服务器,keepAlive 模块已打开。
那么,我怎么知道 keepAlive 是否适合我?在哪里可以找到一些关于配置它的好例子?
答案1
已经有两个不错的答案了,但也许最重要的现实问题尚未提及。
首先,原帖作者可能想读一下前面两个答案,这篇小博客文章了解什么是 keepalive。(作者没有详细说明 TCPI/IP 连接打开时间越长,速度就越快。确实,更持久的连接受益于IP窗口缩放但除非文件很大或带宽延迟乘积异常大,否则影响并不显著。)
使用 Apache 时反对 HTTP Keepalive 的最大争论是它会阻止 Apache 进程。即,使用 keepalives 的客户端将阻止“他的”Apache 进程为任何其他客户端提供服务,直到客户端关闭连接或达到超时。在同一时间段内,这个 Apache 实例可以为许多其他连接提供服务。
现在,一个非常常见的 Apache 配置是预分叉 MPM以及 PHP / Perl / Python 解释器,以及上述语言的应用程序代码。在这种情况下,每个 Apache 进程都很“繁重”,因为它占用了几兆字节的 RAM(Apache 与解释器和应用程序代码链接在一起)。这与每个 keepalive Apache 实例的阻塞一起,效率低下。
常见的解决方法是使用 2 个 Apache 服务器(根据需要,都位于同一台物理服务器上,或者位于 2 台服务器上),并采用不同的配置:
- 一个“重型”的 mod_php(或任何使用的编程语言)用于动态内容,保持活动关闭。
- 一个“轻量级”的,具有最少的模块集,用于提供静态内容(图像、css、js 等),保持活动开启。
然后,您可以扩展动态和静态内容的分离需要的时候,例如:
- 使用事件驱动服务器来处理静态内容,例如nginx。
- 使用 CDN 提供静态内容(可以为您提供所有静态内容服务)
- 实现静态和/或动态内容的缓存
避免阻塞 Apache 的另一种方法是使用具有更智能连接处理的负载平衡器,例如佩尔巴尔。
.. 以及更多。 :-)
答案2
在某些情况下,保持连接可能很好,但在其他情况下,它们可能非常糟糕。它们减少了建立新连接的时间和精力,但它们会在保持连接超时期间占用服务器资源。示例:
- 包含许多小对象的页面、拨号连接的客户端 - 应开启 keepalive。
- 包含一些大型对象的页面 - keepalive 不会有任何优势。
- 具有非常多独立访问者的服务器 - 应该关闭保持连接(否则,套接字和线程将停留在内存中等待保持连接超时并且不会为新客户端提供服务)。
可以看出,KeepAliveTimeout 在优化服务器性能方面也将发挥很大的作用。
看看您的使用模式并自行决定。
答案3
您绝对应该使用 KeepAlive On。
看:
http://httpd.apache.org/docs/2.0/mod/core.html#keepalive
这样,浏览器将重新使用单个 TCP 连接来发送多个查询。通常,一个网站有许多组件(HTML 页面、javascript 代码、图像)。只要这些资源位于同一个域中,因此可以由同一个服务器提供服务,KeepAlive 连接就可以大大提高性能,因为浏览器不必建立新的 TCP 连接。
浏览器通常会打开大约 3 个与域的并行连接。假设您的网站中有 18 个对象。浏览器将打开 3 个连接,并且在每个连接中下载 6 个对象 - 使用 KeepAlive 模式。如果没有 KeepAlive,它必须打开 18 个 TCP 连接,这非常慢。
大多数或所有现代浏览器都符合 HTTP/1.1 标准,因此这应该可以正常工作。
某些 HTTP 代理(例如 Squid)不符合 HTTP/1.1 标准,但它们仍然请求使用 KeepAlive 连接。