keepalive_timeout本身不减少tls握手次数,仅控制空闲tcp连接关闭时间;真正减少握手靠复用已有连接,需配合ssl_session_cache、ssl_session_timeout等tls会话复用配置及客户端行为协同优化。

keepalive_timeout 本身不减少握手建立次数,它只决定已建立的连接在空闲多久后被关闭。真正减少 TLS 握手次数靠的是复用已有连接,而 keepalive_timeout 是让连接“活得久一点”,从而提高复用概率。
理解 keepalive_timeout 的作用
该指令设置 Nginx 与客户端之间 HTTP Keep-Alive 连接的空闲超时时间。例如:
keepalive_timeout 60;
表示:一个 HTTP 连接在无请求时最多保持打开 60 秒,期间若客户端发起新请求,可直接复用该连接(包括底层 TCP 和已完成的 TLS 会话),避免新建 TCP 连接和 TLS 握手。
配合 TLS 会话复用才真正减少握手
仅调大 keepalive_timeout 不足以保证 TLS 复用,还需启用并配置 TLS 层的会话缓存机制:
- 启用会话缓存:用 ssl_session_cache shared:SSL:10m; 开启共享内存缓存,支持多 worker 复用会话票证
- 设置会话有效期:用 ssl_session_timeout 4h; 延长 TLS 会话缓存在服务端的有效期(建议 ≥ keepalive_timeout)
- 开启会话票证(可选但推荐):添加 ssl_session_tickets on;,允许客户端存储加密票证,下次连接时直接提交,跳过服务端查缓存步骤
客户端行为同样关键
服务端配置再好,若客户端不复用连接,也白搭。常见影响因素包括:
- 浏览器默认启用 Keep-Alive,通常复用良好;但某些 SDK 或旧版 HTTP 客户端可能默认关闭或短超时
- HTTP/1.1 请求需带 Connection: keep-alive(现代客户端自动加)
- 避免在请求中主动发送 Connection: close
- 高并发下连接池大小不足,也可能导致提前断连——需检查客户端连接池配置(如 max idle time、max connections)
验证是否生效
可通过以下方式确认复用效果:
- 用 openssl s_client -connect example.com:443 -reconnect 观察是否出现 Reused session
- Nginx 日志中开启 $ssl_protocol 和 $ssl_cipher,对比相同 IP 的多次请求是否协议/密钥套件一致
- 抓包看 TCP 层:复用连接时只有 HTTP 请求,无 SYN/SYN-ACK/Finished 等 TLS 握手报文











