http 长连接,也称为 http 持久连接(http persistent connection)或 http 连接重用,是一种在 http 协议中实现的机制。
在传统的 http 通信中,每个 http 请求和响应都会伴随着 tcp 连接的建立和关闭,这在高并发场景下会增加网络开销和延迟。
而 http 长连接则允许客户端和在完成一次 http 事务后保持 tcp 连接打开,以便后续的http请求可以复用同一连接,而不是每次都创建新的连接。
核心意图是在一段时间内复用tcp连接。
以下是一些关于http长连接的关键点:
连接保持:在http/1.1及更高版本中,默认启用长连接。响应头中的 connection: keep-alive 指示客户端和服务器都应尝试保持连接开放。
如果要关闭 keep-alive,需要在 http 请求的包头里添加: connection :close
现在大多数浏览器都默认是使用 http/1.1,所以 keep-alive 都是默认打开的。
性能优化:通过减少tcp连接的创建和销毁,长连接减少了网络开销,降低了延迟,并提高了整体性能。
keep-alive 头:keep-alive 头通常用于设置连接的超时时间,即连接在无活动多久后关闭。如果不指定,连接可能会在一段时间后自动关闭,或者在服务器或客户端选择关闭时关闭。
资源管理:虽然长连接可以提高效率,但服务器需要管理这些持续连接的资源,防止过多的开放连接耗尽服务器资源。
适用性:并非所有http请求都适合使用长连接,例如,如果请求之间有安全隔离的需求,或者服务器需要释放资源,可能会选择关闭连接。
要想做到 client 与 nginx 之间保持长连接,需要:
- client 发送过来的 http 请求 header 要求携带 "keep-alive"
- nginx 设置支持 keepalive
nginx中的 keepalive 配置项:keepalive_timeout
nginx 使用 keepalive_timeout 来指定 keepalive 的超时时间(timeout),指定每个 tcp 连接最多可以保持多长时间。nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。
注意和 tcp 的 keepalive 区别对待:
http 协议的 keepalive 意图在于连接复用,同一个连接上串行方式传递请求-响应数据。
tcp 的 keepalive 机制意图在于保活、心跳,检测连接错误。
linux 操作系统中设置 keepalive 相关参数(/etc/sysctl.conf):
net.ipv4.tcp_keepalive_time=90
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=2
link: