NGINX 的 keepalive 和 HTTP 中的 keep-alive 有什么区别?
keepalive
是一个在不同上下文中使用的概念,中文直译其实很简单,就是:保持活着。不同场景对应不同的含义。在 NGINX 和 HTTP 协议 中都有相关的设置,它们的作用和含义有所不同。我们可以从两个方面来理解它:
-
HTTP 协议中的
keep-alive
-
NGINX 配置中的
keepalive
(连接池配置)
HTTP 协议中的 keep-alive
在 HTTP 协议 中,keep-alive
是一个控制连接持续时间的头部字段。它也被称为 HTTP 持久连接,它允许一个 TCP 连接复用多个 HTTP 请求和响应,而不是为每个请求重新建立连接。
工作原理:
-
在 HTTP/1.0 中,默认情况下每次请求完成后,TCP 连接会关闭。
- HTTP/1.1
默认使用持久连接,即在响应头中包含
Connection: keep-alive
,这样同一个 TCP 连接可以用于多次请求和响应,从而减少了建立新连接的时间开销。
keep-alive
头部的主要作用是:
- 保持连接开启以处理多个请求,避免每个请求都要进行连接的建立和关闭。
- 提高性能,减少延迟和网络负载,尤其在高并发的请求场景下。
关于 HTTP keep-alive 在请求头的例子:
HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: timeout=5, max=100
Content-Type: text/html
<html>...</html>
Connection: keep-alive
表示当前连接在本次请求响应后保持开启,用于后续请求。
Keep-Alive: timeout=5, max=100
指定连接的最大生命周期和空闲等待时间。 其中,
- timeout=5:连接在没有活动时,最多保持 5 秒。
- max=100:连接可以处理最多 100 个请求。
在 HTTP 中,keep-alive
主要用于控制同一 TCP 连接的持续时间和复用能力。它的目的是避免每个请求都需要重新建立连接,进而提高性能。现在的浏览器都是默认开启的,对普通用户无感知的,了解下就可以了,如果有面试问到的话,按照上面的说法就足够了。
NGINX 配置中的 keepalive
在 NGINX 中,keepalive
主要与 反向代理 和 负载均衡 相关,控制连接池的管理。NGINX 使用 keepalive
来维护与上游服务器(一般是我们后端应用服务器,比如 Tomcat)的长连接,从而避免每次请求都需要重新建立连接。
主要配置项:
keepalive
(指代连接池的保持)
keepalive_timeout
(指代连接的空闲超时时间)
keepalive_requests
(指代每个连接允许的最大请求数)
举例说明: NGINX 的 keepalive 配置例子
http {
upstream backend {
server192.168.1.101;
server192.168.1.102;
keepalive32; # 连接池大小
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
keepalive 32;
与
upstream
后端服务器建立的连接池保持 32 个持久连接。这意味着 NGINX 会保持 32 个与后端服务器的长连接,这些连接可以复用,从而避免每次请求都需要重新建立连接。keepalive_timeout
控制与客户端的连接在空闲状态下最大保持时间。
keepalive_requests
限制每个连接可处理的最大请求数。
工作原理:
- 与后端服务器的连接池
当 NGINX 作为反向代理时,连接池可以减少连接建立的开销。即,在与上游服务器(如应用服务器、数据库服务器等)之间建立持久连接。
- 复用连接
保持与后端服务器的连接,这样多个请求可以复用这些连接,而不需要每次都建立新连接。
- 连接池大小
keepalive
指定了连接池的最大连接数,优化了代理请求时的性能。
假设有 100 个客户端(100次请求)请求到达 NGINX,NGINX 会使用连接池和 TCP 连接复用的方式,与后端服务器建立 32 个持久连接,这样就减少了每次请求建立新连接的开销。
在 NGINX 配置中,keepalive
主要是指与上游服务器之间的连接池配置,允许复用连接,减少建立连接的频率,并提高性能。如果你用的是 NGINX 作为你的服务网关,建议这个配置项要打开,可以提高你服务的性能。
区别对比
特性 |
HTTP |
NGINX |
---|---|---|
定义 |
HTTP 头部字段,控制 TCP 连接在客户端和服务器之间的复用。 |
NGINX 配置指令,用于控制与上游服务器之间的持久连接池,优化反向代理的性能。 |
作用 |
允许同一个连接处理多个 HTTP 请求,从而减少建立新连接的开销,提高性能。 |
控制与后端服务器之间的连接池数量和连接复用,减少建立新连接的开销,提高负载均衡性能。 |
应用层次 |
位于 HTTP 协议层,影响客户端和 Web 服务器之间的连接。 |
位于 NGINX 反向代理配置层,影响 NGINX 与上游服务器(如应用服务器)之间的连接。 |
配置方式 |
通过 HTTP 请求/响应头来控制。 |
通过 NGINX 配置文件中的 |
配置示例 | Connection: keep-alive
, | keepalive 32;
用于与后端服务器保持最大 32 个持久连接。 |
影响范围 |
主要影响客户端和 Web 服务器之间的请求。 |
主要影响反向代理中 NGINX 与上游服务器之间的连接池管理。 |
主要目标 |
提高客户端和 Web 服务器之间的性能,减少连接建立的延迟。 |
提高 NGINX 与后端服务器之间的性能,减少建立连接的频率并复用连接。 |
总结
它们的共同点是都涉及到连接复用的概念,但应用场景不同,一个是客户端与服务器之间,另一个是代理服务器与上游服务器之间。