ssl_handshake_timeout 用于防止恶意客户端在 SSL 握手阶段长时间挂起连接,避免耗尽 worker 进程、内存和文件描述符;仅对未完成握手的连接生效,需配合 listen ... ssl 使用,推荐设为 10–30 秒。

ssl_handshake_timeout 是 Nginx 中用于限制 TLS/SSL 握手过程最大耗时的指令,主要作用是防止恶意或异常客户端在 SSL 握手阶段长时间挂起连接,从而消耗服务器的 worker 进程、内存和文件描述符等资源。
它解决什么问题?
SSL/TLS 握手比普通 HTTP 请求更耗费 CPU 和时间,尤其涉及非对称加密(如 RSA 密钥交换、ECDSA 签名验证)。如果攻击者发起大量不完成握手的连接(例如只发 ClientHello 就停滞),或使用极慢的网络故意拖慢流程,Nginx 的 worker 进程会被持续占用,导致无法响应正常请求,甚至触发 accept() failed (24: Too many open files) 或进程阻塞。
如何配置与生效范围
该指令仅在 http 或 server 块中有效,单位为秒(支持小数),默认值为 60s:
- 放在
http块中:全局生效,影响所有启用了 SSL 的 server - 放在
server块中:仅对该虚拟主机生效,可差异化控制 - 必须配合
listen ... ssl使用,纯 HTTP server 不生效
合理设置建议
一般生产环境推荐设为 10s 到 30s,兼顾兼容性与防护强度:
- 低于 5s 可能误杀弱网用户(如高延迟移动网络、卫星链路)
- 超过 60s 失去防护意义,接近默认值,难以缓解慢握手攻击
- 若后端有硬件加速卡或 OpenSSL 启用 async 模式,可适当放宽至 20–25s
- 搭配
ssl_protocols TLSv1.2 TLSv1.3;可减少旧协议带来的握手开销
它不是万能的,还需配合其他机制
ssl_handshake_timeout 仅终止“未完成握手”的连接,不能替代整体连接层防护:
- 对已完成握手但后续不发 HTTP 请求的空闲 HTTPS 连接无效 → 需靠
keepalive_timeout - 不阻止 SYN Flood 或 TCP 层泛洪 → 需系统级限速(如
net.ipv4.tcp_syncookies)或前置防火墙 - 不防应用层慢速攻击(如 Slowloris)→ 需
client_header_timeout、client_body_timeout等 - 高并发场景建议同时调低
worker_connections并启用multi_accept off;,避免单次 accept 处理过多握手请求










