nginx -s reload 后新 worker 处理新 tls 握手请求时可能因证书加载异常、ocsp stapling 首次阻塞或 ssl_handshake_timeout 被覆盖而超时,导致客户端报 ssl handshake timeout;需检查证书路径权限、ocsp 配置及超时值是否合理。

平滑重载(nginx -s reload)本身不中断已有连接,但会新建 worker 进程并启用新配置——若新配置中 TLS 相关参数不合理,或证书/密钥加载异常,新 worker 在处理**新进来的 TLS 握手请求**时就可能超时。这类问题表现为:重载后短时间内大量客户端报“连接失败”“SSL handshake timeout”,而旧连接仍正常;error_log 中高频出现 ssl handshake timeout 或 SSL_do_handshake() failed,且时间戳集中在 reload 之后。
重点查新 worker 启动后的首波握手行为
平滑重载后,新 worker 进程从零开始接收新连接。它必须完成以下动作才能响应 HTTPS 请求:
- 加载新的 SSL 证书与私钥(路径是否正确?权限是否可读?是否被锁?)
- 初始化 OpenSSL 上下文(如密码套件、协议版本、SNI 缓存等)
- 首次响应 ClientHello 时,需同步完成证书发送、密钥交换协商
任一环节卡顿(如证书文件过大、磁盘 I/O 延迟、OCSP Stapling 首次阻塞查询),都可能导致首波握手耗时陡增,突破 ssl_handshake_timeout 限制。
检查 reload 后证书加载是否成功
新配置若引用了错误路径、损坏证书或权限不足的密钥,Nginx 不会报错退出,但会在首次握手时静默失败:
- 执行
nginx -t只校验语法,不验证证书可读性;务必手动确认:ls -l /etc/nginx/ssl/example.com.pem /etc/nginx/ssl/example.com.key - 查看 error_log 中 reload 后是否有类似
cannot load certificate或no suitable key found的 warning 级日志 - 用
openssl x509 -in /path/to/cert.pem -text -noout和openssl rsa -in /path/to/key.key -check -noout独立验证证书与密钥有效性
警惕 OCSP Stapling 首次启用延迟
若新配置中启用了 ssl_stapling on 且 ssl_stapling_verify on,Nginx 新 worker 在首次收到 ClientHello 后,会主动向 CA 的 OCSP 响应器发起 DNS 查询+HTTP 请求获取 stapling 响应。该过程在网络不佳或 CA 响应慢时可能耗时数秒:
- 若
ssl_handshake_timeout设为 5s,而 OCSP 查询花了 4.8s,后续密钥交换只剩 0.2s,极易超时 - 临时验证:注释掉
ssl_stapling相关指令,reload 后观察握手是否恢复正常 - 长期建议:搭配
ssl_stapling_responder显式指定可信响应地址,并确保 DNS 解析稳定;或启用ssl_stapling_cache缓存结果
对比 reload 前后 ssl_handshake_timeout 是否被意外覆盖
平滑重载加载的是完整配置树,若新配置中某 http、server 或 location 块里遗漏了 ssl_handshake_timeout,Nginx 将回退到默认值(1m),看似宽松,实则埋雷:
- 默认 60 秒远超合理范围,容易掩盖真实握手瓶颈,也易被慢速攻击利用
- 更危险的是:某些 include 文件或模板生成逻辑,在 reload 时因变量未渲染,导致该指令被跳过
- 排查方法:执行
nginx -T | grep ssl_handshake_timeout,确认所有生效 server 块中该值明确存在且数值合理(公网 5–8s,内网 ≤10s)











