我正在使用 IIS(在 Windows 2003 上)并在我的默认网站中放置了一个 dummy.html。该文件为空。
我正在使用wfuzz 多次访问此文件(wfuzz 执行 HTTP 请求),使用以下命令:
wfuzz.exe -c -z range -r 0-5000 "http://localhost/dummy.html"
我运行了 5 个并行 wfuzz 几分钟,然后 IIS 停止响应。发生这种情况时,我无法再在端口 80 上远程登录 localhost。如果我停止 wfuzz 客户端并等待一分钟,我可以再次远程登录端口 80。
如果我选择了在 IIS 中启用 HTTP Keep-Alives ,我只会看到这个问题。如果我禁用此选项,问题似乎就消失了。我可以运行 15 wfuzz 几分钟,并且仍然能够在端口 80 上 telnet localhost 没有任何问题。
IIS 被配置为使用无限数量的连接。
那么,为什么启用了Enable HTTP Keep-Alives后 IIS 会在一分钟后停止响应呢?
起初我以为问题是处于 TIME_WAIT 状态的套接字数量过多,但我不明白如果这是原因,为什么取消选择Enable HTTP Keep-Alives会解决问题。如果我的客户端在每个请求之间断开连接,我认为此设置不会对 IIS 行为产生任何影响。
启用 HTTP Keep-Alives 尝试保持连接打开,以允许客户端下载多个资源,而无需为每个资源设置新连接的开销。超时是它等待的时间。
即使在 IIS 中设置了无限连接,机器可以处理的连接数仍然存在限制。通过在您的锤击测试中反复设置新的,您已经达到了该限制并阻止了 telnet 进行的新操作。
通过禁用 http 保持活动或减少超时,您增加了连接的周转率,但代价是增加了与您的测试客户端不同的实际浏览器的开销。在试图获得性能时,您实际上可能已经降低了它。
像大多数事情一样,找到最佳设置是一种平衡行为,这取决于您的实际使用情况。
它是导致它的 TIME_WAIT 状态。我在注册表中修改了 TIME_WAIT 状态的超时,问题就消失了。仍然不确定启用 HTTP Keep-Alives 会如何影响这一点,但是......
对于高性能网站,MS 建议进行以下更改:
请注意,需要重新启动服务器才能进行这些更改。
看:
(来自我的StackOverflow答案)