Nginx keepalived 长连接

An Introduction to HTTP and Keepalive Connections

HTTP keepalive connections are a necessary performance feature that reduce latency and allow web pages to load faster.

HTTP保持连接是一项必要的性能特点,可减少延迟并允许网页加载更快。 

HTTP is a simple, text‑based protocol. If you’ve not done so before, take a look at the output from an HTTP debugging tool such as the one in your web browser, and check out the standard request and response structure:

HTTP是一个简单的基于文本的协议。如果您以前从未这样做过,请查看HTTP调试工具(例如Web浏览器中的工具)的输出,并检查标准的请求和响应结构:

In its simplest implementation, an HTTP client creates a new TCP connection to the destination server, writes the request, and receives the response. The server then closes the TCP connection to release resources.

在最简单的实现中,HTTP客户端与目标服务器建立一个新TCP连接,写入请求并接收响应。然后服务器关闭TCP连接释放资源。

This mode of operation can be very inefficient, particularly for complex web pages with a large number of elements or when network links are slow. Creating a new TCP connection requires a ‘three‑way handshake’, and tearing it down also involves a two‑way shutdown procedure. Repeatedly creating and closing TCP connections, one for each message, is akin to hanging up and redialing after each person speaks in a phone conversation.

这种操作模式可能效率很低,特别是对于具有大量信息的复杂网页或网络链接速度较慢的情况。创建新的TCP连接需要进行“三向握手”,而将其断开也需要进行双向关闭过程。重复创建和关闭TCP连接(每个消息一个),类似于在每个人在电话交谈中讲话后挂断并重拨。

HTTP uses a mechanism called keepalive connections to hold open the TCP connection between the client and the server after an HTTP transaction has completed. If the client needs to conduct another HTTP transaction, it can use the idle keepalive connection rather than creating a new TCP connection.

HTTP使用一种称为keepalive连接机制来在HTTP事务完成后保持打开客户端与服务器之间的TCP连接。如果客户端需要执行另一个HTTP事务,则可以使用空闲的keepalive连接,而不是创建新的TCP连接。

Clients generally open a number of simultaneous TCP connections to a server and conduct keepalive transactions across them all. These connections are held open until either the client or the server decides they are no longer needed, generally as a result of an idle timeout.

客户端通常会打开与服务器的多个同时TCP连接,并在所有客户端之间进行keepalive事务,这些连接一直保持打开状态,直到客户端或服务器决定不再需要它们(通常是由于空闲超时)。

Modern web browsers typically open 6 to 8 keepalive connections and hold them open for several minutes before timing them out. Web servers may be configured to time these connections out and close them sooner.

浏览器通常会打开6到8个keepalive连接,并在超时之前将其保持几分钟的打开状态。可以配置Web服务器使这些连接超时并尽快关闭它们。

 

短连接

HTTP 最早期的模型和 HTTP/1.0 的默认模型,是短连接。每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。

TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载,短连接破坏了 TCP 具备的能力,并且新的冷连接降低了其性能。

这是 HTTP/1.0 的默认模型(如果没有指定 Connection 协议头,或者是值被设置为 close)。而在 HTTP/1.1 中,只有当 Connection 被设置为 close 时才会用到这个模型。

备注: 除非是要兼容一个非常古老的,不支持长连接的系统,没有一个令人信服的理由继续使用这个模型。

 

 

长连接

短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 TCP 连接的性能只有在该连接被使用一段时间后(热连接)才能得到改善。为了缓解这些问题,长连接的概念便被设计出来了,甚至在 HTTP/1.1 之前。或者,这被称之为一个 keep-alive 连接。

一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭(服务器可以使用 Keep-Alive 协议头来指定一个最小的连接保持时间)。

长连接也还是有缺点的;就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受 DoS 攻击。这种场景下,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。

HTTP/1.0 里默认并不使用长连接。把 Connection 设置成 close 以外的其他参数都可以让其保持长连接,通常会设置为 retry-after

在 HTTP/1.1 里,默认就是长连接的,不再需要标头(但我们还是会把它加上,万一某个时候因为某种原因要退回到 HTTP/1.0 呢)。

 

Connection

Connection 通用标头控制网络连接在当前会话完成后是否仍然保持打开状态。如果发送的值是 keep-alive,则连接是持久的,不会关闭,允许对同一服务器进行后续请求。

Connection: keep-alive
Connection: close 

 

 

指令

表明客户端或服务器想要关闭该网络连接,这是 HTTP/1.0 请求的默认值

以逗号分隔的 HTTP 头 [通常仅有 keep-alive]

表明客户端想要保持该网络连接打开,HTTP/1.1 的请求默认使用一个持久连接。这个请求头列表由头部名组成,这些头将被第一个非透明的代理或者代理间的缓存所移除:这些头定义了发出者和第一个实体之间的连接,而不是和目的地节点间的连接。

 

 

HTTP 流水线

备注: HTTP 流水线在现代浏览器中并不是默认被启用的:

  • 有缺陷的代理服务器仍然很常见,这些会导致 Web 开发人员无法预见和轻松诊断的奇怪和不稳定行为。
  • 正确的实现流水线是复杂的:传输中的资源大小、多少有效的 RTT 会被用到以及有效带宽都会直接影响到流水线提供的改善。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。
  • 流水线受制于队头阻塞(HOL)问题。

由于这些原因,流水线已被 HTTP/2 中更好的算法——多路复用(multiplexing)所取代。

默认情况下,HTTP 请求是按顺序发出的。下一个请求只有在当前请求收到响应过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。

流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的最大分段大小(MSS)选项,仍然足够包含一系列简单的请求。

并不是所有类型的 HTTP 请求都能用到流水线:只有幂等方式,比如 GETHEADPUT 和 DELETE 能够被安全地重试。如果有故障发生时,流水线的内容要能被轻易的重试。

今天,所有遵循 HTTP/1.1 标准的代理和服务器都应该支持流水线,虽然实际情况中还是有很多限制:一个很重要的原因是,目前没有现代浏览器默认启用这个特性。

 

 

Nginx 长连接 Keepalive

keepalive可以有效的提升我们连接的使用效率,这里的keepalive是指Http协议里面的keepalive而不是TCP协议里面的keepalive。keepalive分为对下游客户端keepalive行为也分为对上游tomcat行为。这里指的是keepalive对客户端的行为。

多个HTTP请求复用同一个TCP连接,比如浏览器只需要建立一个TCP连接就可以运行多个HTTP请求。复用一个TCP连接减少了建立连接断开连接的次数,减少了握手次数。

 

 Keepalive  语法

Syntax: keepalive_disable none | browser ...;#某些浏览器对keepalive支持不好,默认是IE6就不使用keepalive
Default: keepalive_disable msie6;
Context: http, server, location

Syntax: keepalive_requests number; #在一个TCP连接当上最多执行多少个HTTP请求,默认是100
Default: keepalive_requests 100;
Context: http, server, location

Syntax: keepalive_timeout timeout [header_timeout]; #timeout:用户一个HTTP请求完成以后最多经过timeout时间,如果还是没有新的请求进来就会关连接,默认75s。
Default: keepalive_timeout 75s;
Context: http, server, location

Nginx 处理的每个请求均有相应的超时设置。如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提升 Nginx 的性能。

HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。

HTTP 有一个 KeepAlive 模式,它告诉 webserver 在处理完一个请求后保持这个 TCP 连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值