Skip to content

P79 HTTP 长连接与短连接!Nginx 如何管理这些连接? ​

面试题:HTTP 长连接和短连接是什么?Nginx 怎么管理客户端/上游的连接?

1. 长连接 vs 短连接 ​

短连接 ​

每次 HTTP 请求都新建 TCP 连接,请求完即关闭:

text
建连(三次握手)→ 请求/响应 → 断开(四次挥手)
  • 缺点:频繁握手开销大;
  • 适合:请求频率低、连接复用收益小的场景。

长连接(HTTP/1.1 keep-alive) ​

同一 TCP 连接上复用多次请求/响应:

text
Connection: keep-alive(HTTP/1.1 默认)
  • 省去反复握手,吞吐更高;
  • 注意:占用连接资源(fd/内存),空闲连接要超时回收。

2. 常见头与参数 ​

http
Connection: keep-alive
Keep-Alive: timeout=60
  • 服务端(Tomcat)keepAliveTimeout 控制空闲连接存活;
  • 连接上的请求数达到上限(如 100)也会关闭(防止长连接霸占)。

3. Nginx 如何管理连接 ​

① 客户端侧(client → Nginx) ​

nginx
keepalive_timeout 65;              # 客户端连接空闲超时
keepalive_requests 1000;           # 单个客户端连接最大请求数

② 上游侧(Nginx → 后端) ​

重点:Nginx 与后端的长连接需要显式配置(HTTP/1.0 默认短连接):

nginx
upstream backend {
    server 10.0.0.1:8080;
    keepalive 32;                   # 每个 worker 保留的空闲上游连接数
}

server {
    location / {
        proxy_http_version 1.1;     # 必须用 1.1 才支持 keep-alive
        proxy_set_header Connection "";
        proxy_set_header Host $host;
    }
}
  • keepalive 是连接池:复用与后端的长连接,避免每次请求重新建连;
  • proxy_http_version 1.1 + 清空 Connection 头是经典配置,很多事故就是漏了这两行导致后端连接大量 TIME_WAIT。

4. 加分点 ​

  • 讲"Nginx 连接数模型":worker 进程 + 事件驱动(epoll),连接数上限受 worker_connections 和 fd 限制;
  • 提到 TIME_WAIT 问题:短连接大量出现 TIME_WAIT,用长连接/keepalive 缓解;
  • 追问"长连接怎么防资源耗尽":空闲超时 + 请求数上限 + 心跳。

一句话总结 ​

HTTP 短连接每次请求都握手,长连接(keep-alive)复用连接省开销;Nginx 管理连接分两侧:客户端侧 keepalive_timeout/requests,上游侧必须 proxy_http_version 1.1 + keepalive 连接池才能与后端复用长连接,否则全是 TIME_WAIT。

基于 VitePress 重建