keepalive_timeout 控制 nginx 与客户端空闲连接等待时长,仅影响前端链路;设为 30 25 表示 nginx 30 秒后断连,响应头提示客户端 25 秒复用;需配合 keepalive_requests 使用,避免连接无限复用。

keepalive_timeout 决定 Nginx 与客户端之间空闲连接能“等多久才关”,它不控制连接总寿命,只管“没新请求时最多挂几秒”。这个值直接影响连接能否复用、复用是否有效,进而牵动握手开销、资源占用和用户体验。
它让连接复用成为可能,但不是自动生效
HTTP/1.1 默认支持 Keep-Alive,但 Nginx 不会无条件留着连接——它靠 keepalive_timeout 主动管理空闲窗口。设为 30 秒,意味着:一个请求响应完后,Nginx 会继续监听该 TCP 连接 30 秒;期间若客户端发来第二个请求(比如加载 CSS 或图片),就直接复用,省掉三次握手和 TLS 协商。
- 设为 0:彻底禁用长连接,每次请求都新建 TCP 连接
- 设太短(如 2 秒):用户还没点下一页,连接已断,复用率趋近于零
- 设太长(如 300 秒):大量连接空挂着,占文件描述符和内存,可能触发 “Too many open files”
它只管前端,不管后端
keepalive_timeout 仅作用于 Nginx 和浏览器/App/CDN 等客户端之间的链路。它对后端服务(如 Java 或 Python 应用)完全无影响。后端建连开销靠 upstream keepalive 解决,两者必须分开配、一起调——Nginx 前端留太久,后端却早把连接关了,结果就是 502 错误或 “upstream prematurely closed connection”。
- 前端连接复用 → 靠 keepalive_timeout + keepalive_requests
- 后端连接复用 → 靠 upstream keepalive + proxy_http_version 1.1 + 后端自身 keep-alive 配置
它有两个实际参数,用途不同
写成 keepalive_timeout 30 25; 时:
- 第一个值(30):Nginx 自身行为——空闲 30 秒就断连
- 第二个值(25):仅写入响应头
Keep-Alive: timeout=25,供客户端参考,不影响 Nginx
很多客户端(尤其是移动端 App)会按这个提示值决定是否复用,所以第二个数建议略小于第一个数,避免客户端还打算复用,Nginx 却已关闭连接。
它必须配合 keepalive_requests 才算完整
即使连接没超时,也不能让它无限处理请求。否则一个慢请求或异常客户端可能长期霸占连接,挤占其他用户资源。
- keepalive_requests 默认 100,适合大多数 Web 页面
- 静态资源服务(如 CDN)可设 500–1000,提升复用效率
- 高安全要求场景可设 50,加快连接轮转
- 该值达到即断连,不受 keepalive_timeout 约束











