Answers:
编辑:我的答案仅涵盖了原始未编辑的问题,即问题是否在负载均衡器/反向代理中很典型。我不确定nginx / product X是否支持此功能,我99.9%的反向代理经验是使用HAproxy。
正确。HTTP保持活动在客户端,但不在服务器端。
为什么?
如果您分解了一些细节,则可以快速了解为什么这样做有好处。对于此示例,假设我们正在加载一个页面www.example.com,并且该页面包含3个图像,即img [1-3] .jpg。
请注意,建立并关闭了4个单独的TCP会话。
HTTP Keep-Alive允许单个TCP连接一个接一个地服务多个HTTP请求。
请注意,使用Keep-Alive,仅建立1个TCP连接并最终将其关闭。
要回答这个问题,您必须了解在客户端和服务器之间建立TCP连接需要做什么。这称为TCP 3向握手。
网络具有延迟,因此三向握手的每个步骤都需要一定的时间。可以说,客户端和服务器之间有30毫秒的时间,来回建立IP连接所需的IP数据包的发送意味着建立TCP连接需要3 x 30毫秒= 90毫秒。
这听起来可能并不多,但是如果我们认为在原始示例中,我们必须建立4个独立的TCP连接,则该时间将变为360ms。如果客户端和服务器之间的延迟是100ms而不是30ms怎么办?然后我们的4个连接需要1200毫秒才能建立。
更糟糕的是,一个典型的网页可能需要不止3张图像才能加载,客户端可能需要请求多个CSS,JavaScript,图像或其他文件。如果页面加载了其他30个文件,并且客户端-服务器延迟为100毫秒,那么我们花多长时间建立TCP连接?
建立TCP连接以加载引用30个其他文件的网页花费了9.3秒。而且,这甚至不计算发送HTTP请求和接收响应所花费的时间。
使用HTTP Keep-Alive,我们只需要建立1个TCP连接,这需要300毫秒。
HTTP反向代理(例如HAproxy)通常部署在非常接近它们所代理的后端服务器的位置。在大多数情况下,反向代理与其后端服务器之间的等待时间将小于1毫秒,因此建立TCP连接比在客户端之间建立连接要快得多。
但这只是原因的一半。HTTP服务器为每个客户端连接分配一定数量的内存。使用Keep-Alive,它将使连接保持活动状态,并且通过扩展,它将保持服务器上使用的一定数量的内存,直到达到Keep-Alive超时时间为止,根据服务器配置的不同,最长可达15s。 。
因此,如果我们考虑在HTTP反向代理的服务器端使用Keep-Alive的效果,我们会增加对内存的需求,但是由于代理与服务器之间的延迟非常低,因此,我们并没有从中获得真正的收益。减少了TCP三向握手所花费的时间,因此,在这种情况下,通常最好禁用代理和Web服务器之间的Keep-Alive。
免责声明:是的,此解释未考虑到浏览器通常会并行建立与服务器的多个HTTP连接这一事实。但是,浏览器将与同一主机建立多少个并行连接是有限制的,通常,此连接的大小仍然足够小,可以保持活动状态。
Nginx在两侧都支持保持活动。