为什么将MaxKeepAliveRequests设置为无限制的任何内容?


11

KeepAliveTimeout如果在给定的时间内未发出新请求,则Apache 会关闭保持活动连接。如果用户没有关闭浏览器/选项卡,则此超时(通常为5-15秒)最终将关闭大多数保持活动连接,并通过无限期地保持连接来防止浪费服务器资源。

现在,该MaxKeepAliveRequests指令对单个TCP连接(由于处于打开状态KeepAlive)将要服务的HTTP请求的数量设置了限制。将此设置为0意味着允许无限数量的请求。

为什么将这个设置为除“无限”以外的任何值? 如果客户端仍在积极地发出请求,那么在相同的保持活动连接上发生请求有何危害?达到限制后,请求仍会进入,只是在新连接上。

我的看法是,永远不要限制这一点。我想念什么?

Answers:


4

基本上,因为Apache不是为此而构建的。问题是服务器内存使用率。在许多配置中,内容生成是在与内容交付相同的过程中完成的,因此每个过程的规模都会扩大到它处理的最大内容。想象一下,由于一个沉重的php脚本,一个进程扩展到64mb,然后那个sitting肿的进程坐下来为静态文件提供服务。现在,将其乘以100。此外,如果任何地方都有内存泄漏,进程将无限制地增长。

保持连接设置应根据您的内容类型和流量进行平衡。通常,最佳配置将MaxKeepAliveRequests设置为高(100-500),将KeepAliveTimeout设置为低(2-5)以快速释放它们。


2

我知道这是一个古老的问题,但是我一直在进行一些调试,这似乎是(并且不仅对于Apache而言是正确的)MaxKeepAliveRequests独立于KeepAliveTimeout

意思是,timeout指令仅对空闲连接保持空闲状态(不进行读取或写入)-如果您继续在超时以下进行请求,则实际上可以通过同一连接进行无限量的请求。

由于某些原因,这可能不是很好,包括长期运行的tcp连接被随机终止?在任何情况下,http客户端都不是那么愚蠢,可以MaxKeepAliveRequests很好地处理“低” 设置,例如,编程语言相对容易检测服务器是否关闭了tcp连接,然后重新连接到它。此外,大多数http客户端将自己设置限制(例如,浏览器将在300秒左右后关闭保持活动的连接)。


1

原因之一是负载平衡。建立保持活动状态或http 1.1持久连接后,负载均衡器将在关闭前将其移至新主机。如果您有一个客户端通过其一个连接发出大量请求,则服务器之间的平衡可能不会很好。


但是那为什么重要呢?对我来说,将单个用户的连接分散到多台服务器上似乎是不可取的。负载平衡是为了处理大量用户,而不是单个用户的连接。实际上-如果单个用户要提供服务,则您希望将其限制在单个服务器中(他们可以有效地对其进行速率限制)。
乔纳森·莱因哈特

1
好点。一些想法:1.该服务器上的其他任何人也会受到重击。2.对于在HTTP级别以下工作的负载均衡器:将服务器从负载均衡器池中取出时,它不会关闭现有的HTTP连接。这使得仅通过负载平衡器将人们转移到其他服务器上变得更加困难。原因2是我在搜索以了解人们对该参数有何评论时进入此页面的方式。
dtauzell

1
第三个原因:如果您的服务器/应用程序进入错误状态并出错,则这种锁定会导致所有请求出错,直到情况得到纠正为止;而如果您限制了它们有多少机会与新服务器保持平衡, 。
dtauzell

我还没有遇到这样的负载均衡器。负载平衡器通常具有“粘性”参数,该参数定义当前会话内的所有客户端请求(例如,由IP确定)是否应该路由到同一上游,还是应该分散在上游。哪个选项有用,取决于应用程序在上游运行
曼努埃尔

1

部分是为了防止单个用户占用所有连接插槽。没有限制,一个恶意或编写不当的客户端可能会接管每个可用的连接,并永远保持下去。但是,与每个IP连接的限制相比,这并不是一个很好的缓解方法。

主要是负载平衡,但特别是在维护方面。如果要使服务器脱机,请将其断开至0个连接,但允许现有连接完成一段时间。对保持活动请求的数量进行限制意味着最终用户将可以优雅地创建新连接并将其移至新的后端服务器。可能有一些向服务器发出信号,通知它在耗尽过程中完全停止接受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.