为什么 Nginx 和 HTTP 中都有 keep-alive ,一文带你了解 TCP 连接复用

NGINX 的 keepalive 和 HTTP 中的 keep-alive 有什么区别?

keepalive 是一个在不同上下文中使用的概念,中文直译其实很简单,就是:保持活着。不同场景对应不同的含义。在 NGINX 和 HTTP 协议 中都有相关的设置,它们的作用和含义有所不同。我们可以从两个方面来理解它:

  1. HTTP 协议中的 keep-alive

  2. 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

    限制每个连接可处理的最大请求数。

工作原理:

  1. 与后端服务器的连接池

    当 NGINX 作为反向代理时,连接池可以减少连接建立的开销。即,在与上游服务器(如应用服务器、数据库服务器等)之间建立持久连接。

  2. 复用连接

    保持与后端服务器的连接,这样多个请求可以复用这些连接,而不需要每次都建立新连接。

  3. 连接池大小

    keepalive 指定了连接池的最大连接数,优化了代理请求时的性能。

假设有 100 个客户端(100次请求)请求到达 NGINX,NGINX 会使用连接池和 TCP 连接复用的方式,与后端服务器建立 32 个持久连接,这样就减少了每次请求建立新连接的开销。

在 NGINX 配置中,keepalive 主要是指与上游服务器之间的连接池配置,允许复用连接,减少建立连接的频率,并提高性能。如果你用的是 NGINX 作为你的服务网关,建议这个配置项要打开,可以提高你服务的性能。

区别对比

特性

HTTP keep-alive

NGINX keepalive

定义

HTTP 头部字段,控制 TCP 连接在客户端和服务器之间的复用。

NGINX 配置指令,用于控制与上游服务器之间的持久连接池,优化反向代理的性能。

作用

允许同一个连接处理多个 HTTP 请求,从而减少建立新连接的开销,提高性能。

控制与后端服务器之间的连接池数量和连接复用,减少建立新连接的开销,提高负载均衡性能。

应用层次

位于 HTTP 协议层,影响客户端和 Web 服务器之间的连接。

位于 NGINX 反向代理配置层,影响 NGINX 与上游服务器(如应用服务器)之间的连接。

配置方式

通过 HTTP 请求/响应头来控制。

通过 NGINX 配置文件中的 keepalive 指令来控制与上游服务器的连接池管理。

配置示例Connection: keep-alive

Keep-Alive: timeout=5, max=100

keepalive 32;

 用于与后端服务器保持最大 32 个持久连接。

影响范围

主要影响客户端和 Web 服务器之间的请求。

主要影响反向代理中 NGINX 与上游服务器之间的连接池管理。

主要目标

提高客户端和 Web 服务器之间的性能,减少连接建立的延迟。

提高 NGINX 与后端服务器之间的性能,减少建立连接的频率并复用连接。

总结

它们的共同点是都涉及到连接复用的概念,但应用场景不同,一个是客户端与服务器之间,另一个是代理服务器与上游服务器之间。

nginx确实支持HTTP Keep-alive功能,这使得浏览器可以利用同一个连接发送多个请求并接收响应,提高了网络通信效率,减少了建立TCP连接的成本。 ### HTTP Keep-alive详解 HTTP Keep-alive,也称为持久连接,允许客户端(通常是Web浏览器)在完成了一个HTTP请求之后,继续保持与服务器的连接状态一段时间。这样做的目的是为了减少建立新连接所需的时间,同时也可以让服务器在同一连接上处理后续的请求,从而提高性能减少资源消耗。 ### Nginx如何实现Keep-aliveNginx配置文件中,默认情况下已经启用了Keep-alive功能。你可以通过`proxy_http_version 1.1;``http { keepalive_timeout 50s;}`这样的指令来调整HTTP版本以及Keep-alive超时时间等设置。 - `proxy_http_version 1.1;`用于启用HTTP/1.1协议,这是启用Keep-alive的关键之一。 - `keepalive_timeout 50s;`表示当无数据传输超过50秒后关闭连接。 ### 开启调整Keep-alive 如果你需要调整默认设置,例如增加Keep-alive的超时时间或者优化资源管理,可以在`server`块或者全局`http`块中添加上述指令: ```nginx http { # 其他配置... proxy_http_version 1.1; keepalive_timeout 60s; # 设置为60秒作为示例 } server { # 其他服务器特定配置... } ``` ### 相关问题: 1. **HTTP Keep-alive对服务器资源的影响是什么?** - 使用HTTP Keep-alive可以帮助服务器更高效地管理连接,减少连接建立断开来的系统开销,尤其是在高并发访问的情况下更为明显。 2. **如何在Nginx配置文件中禁用HTTP Keep-alive?** - 可以将`keepalive_timeout`值设为0秒,并关闭`proxy_http_version`为1.1的功能。但这可能会导致浏览器尝试使用HTTP/1.0连接,这通常不会保持连接,除非有额外的脚本或配置来实现这一目标。 3. **为何在某些场景下需要禁用HTTP Keep-alive?** - 禁用HTTP Keep-alive可能出于安全、性能或其他特定需求考虑,比如: - 需要防止长时间占用连接影响其他流量,特别是在有流量控制限制的网络环境。 - 某些服务可能需要明确地清理每个会话的资源,禁止共享连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值