【发布时间】:2011-05-24 07:49:40
【问题描述】:
我有一个通过 IIS 7.0 部署的 Web 应用程序。该应用程序可供大量用户访问并处理大量数据。我的问题是关于默认设置为 true 的 HTTP Keep-Alive 选项。
将 HTTP Keep-Alive 设置为 false 或 true 是否更好?
如果为 true 是使用超时的好方法吗?
【问题讨论】:
我有一个通过 IIS 7.0 部署的 Web 应用程序。该应用程序可供大量用户访问并处理大量数据。我的问题是关于默认设置为 true 的 HTTP Keep-Alive 选项。
将 HTTP Keep-Alive 设置为 false 或 true 是否更好?
如果为 true 是使用超时的好方法吗?
【问题讨论】:
KeepAlive 通常应该用于处理紧跟 HTML 请求的请求。假设在第一次访问您的网站时,我得到了一个包含 5 个 css、5js 和 25 个图像的 HTML 页面,我将使用我仍然存在的 HTTP 连接来请求这些东西(嗯,取决于浏览器,我可能会使用3个连接来加速这些事情)。
为了处理这个事实,我们通常使用 2s 或 3s 的 Keepalive。拥有更长的保活意味着连接正在等待用户可能请求的下一页。这可能是一种有效的思维方式,下次用户想要一个页面时,我们将避免浪费时间建立 HTTP 连接(这可能是请求/响应时间中最长的部分)。但是对于您的服务器,这意味着由服务器处理的大部分 HTTP 连接都在做...什么也没有。您将达到您的 MaxConnection(W3SVC/MaxConnections,荒谬的默认值为 10),而连接什么也不做。特别糟糕。这么长时间保持活动需要大型网络服务器,并且应该仅在您的应用程序真正需要时使用。
如果您在“经典网站”中使用 Keepalive,您必须更改连接超时(默认为 2 分钟)。在 Apache 中,您将有 2 个设置,一个 keepalive tiemout(默认为 5 秒)和一个连接超时(2 分钟)。在 IIS 中,似乎两者都使用了超时设置。所以不要将它设置为 2 秒(发送请求的客户端真的很慢会超时),但像 10 秒这样的时间可能就足够了。现在一种响应是禁止 Keep-Alive,并使浏览器打开更多连接。另一个回应是使用现代网络服务器(例如 nginx 或 cherokee),它以比 Apache 或 IIS 更优雅和无资源的方式处理保持连接。
即使不使用 Keepalive,客户端超时等待 2 分钟的原因是什么?它肯定太高了,降低这个值到 60 左右。
然后你应该检查几个与超时相关的设置 (ConnectionTimeout, HeaderWaitTimeout, MinFileBytesPerSec) 以及注册表中performances settings 上的这个不错的响应。
【讨论】:
本文将带来更多见解,不要忘记检查“我们如何解决它?”部分 http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/
【讨论】:
我认为让所有用户都连接起来并不是一个好主意。
因为:
使用连接超时(最多 5 分钟即可)
但是:如果您的应用程序是实时聊天 - 您应该保持所有连接都处于活动状态。这种方式最好使用Ajax Long Polling Request + Node JS + 一些快速的nosql db来存储聊天消息。
【讨论】: