为什么要将 MaxKeepAliveRequests 设置为非无限制值?

为什么要将 MaxKeepAliveRequests 设置为非无限制值?

阿帕奇的KeepAliveTimeout如果在给定的时间段内未发出新请求,则关闭保持连接。只要用户不关闭浏览器/选项卡,此超时(通常为 5-15 秒)最终会关闭大多数保持连接,并防止因无限期保持连接而浪费服务器资源。

现在MaxKeepAliveRequests该指令限制了单个 TCP 连接(由于KeepAlive) 将提供服务。将其设置为0意味着允许无限数量的请求。

为什么要将其设置为“无限制”以外的任何值? 假设客户端仍在主动发出请求,让它们在同一个保持活动连接上发生有什么坏处?一旦达到限制,请求仍会进入,只是在新的连接上。

在我看来,限制这一点毫无意义。我错过了什么?

答案1

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

应根据内容类型和流量平衡保持活动设置。通常,最佳配置是将 MaxKeepAliveRequests 设置为较高(100-500),将 KeepAliveTimeout 设置为较低(2-5),以便快速释放它们。

答案2

我知道这是一个老问题,但我一直在做一些调试,似乎(这不仅适用于 Apache)MaxKeepAliveRequests独立于工作KeepAliveTimeout

意思是,超时指令仅计算空闲的持久连接(无读取或写入) - 如果您继续在超时以下请求,您实际上可以通过同一个连接进行无限数量的请求。

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

答案3

一个原因可能是为了负载平衡。一旦建立了保持活动或 http 1.1 持久连接,负载平衡器就不会将其移动到新主机,直到它关闭。如果您有一个客户端通过其一个连接发出大量请求,则可能无法在服务器之间实现良好的平衡。

答案4

部分原因是为了防止单个用户独占所有连接槽。如果不进行限制,一个恶意或编写不当的客户端可能会接管每个可用连接并永远占据它们。然而,与每个 IP 连接限制之类的措施相比,这并不是一个很好的缓解措施。

主要是负载平衡,但具体与维护有关。如果您想让服务器脱机,请将其设置为 0 个连接,但允许现有连接在一段时间内完成。限制保持活动请求的数量意味着最终用户将正常创建新连接并移动到新的后端服务器。也许在耗尽过程中向服务器发出信号,告知它应该完全停止接受保持活动会更好,但据我所知,这样的功能不存在。

相关内容