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。