Nginx reload 不中断连接是因优雅重启机制:主进程校验配置后启新worker并通知旧worker停止接受新连接但继续处理已有连接;TLS已建立连接使用会话密钥,与证书文件无关,故证书更新不影响活跃连接。

证书更新后执行 nginx -s reload,Nginx 本身不中断现有连接——这是由其进程模型和信号机制决定的,并非“自动保持”,而是通过优雅重启(graceful reload)实现连接延续。关键不在证书本身,而在于 reload 过程中主进程如何调度新旧 worker 进程。
reload 时连接为何不断
Nginx 主进程收到 SIGHUP 后,会做三件事:
- 校验新配置语法(含新证书路径、私钥权限等),失败则中止,旧配置继续运行
- 启动一批新 worker 进程,加载新配置(包括新证书)、监听相同端口(SO_REUSEPORT 或 fork+bind 共享 socket)
- 通知旧 worker 进程停止接受新连接,但继续处理已建立的连接(HTTP/HTTPS 请求、WebSocket 握手、长连接数据帧等)
证书更新不影响连接生命周期
SSL/TLS 握手只发生在连接建立初期。已建立的 TLS 连接使用的是协商好的会话密钥(session key),与证书文件无关。证书仅用于:
- 初始握手时签名 ServerHello 和发送公钥
- 客户端验证服务端身份(证书链校验)
- 新连接建立时才会读取证书文件;reload 后的新连接自动用新证书,老连接不受影响
只要私钥未变更、证书未吊销,且客户端未主动重协商(rare),正在传输的 HTTPS 流、WebSocket 帧、HTTP/2 stream 都会持续完成。
必须确保的前置条件
reload 不断连不是默认保险箱,需满足以下条件:
-
证书文件可被 Nginx 主进程读取:私钥权限应为
600,属主为运行用户(如nginx或www-data),否则 reload 会失败或新 worker 启动异常 -
不要用 kill -9 或 systemctl restart:必须用
nginx -s reload或systemctl reload nginx,保证走 SIGHUP 流程 -
避免配置语法错误:例如
ssl_certificate路径写错、PEM 格式损坏,会导致新 worker 启动失败,旧 worker 继续运行但无法更新证书 -
worker_shutdown_timeout 合理设置(可选):若业务有超长请求(如大文件上传、流式响应),建议在
http块中配置worker_shutdown_timeout 30s;,防止旧 worker 卡住不退出
验证 reload 是否真正平滑
可通过以下方式确认连接未中断:
- 用
ss -tn state established '( sport = :443 )' | wc -l在 reload 前后对比 ESTABLISHED 连接数,应基本持平(缓慢自然下降) - 抓包观察某客户端连接:reload 后该 TCP 流仍在收发 TLS 应用数据(
Application Data),无Alert: Close Notify或 RST - 对 WebSocket 服务,持续 ping/pong 不中断,消息不丢;对 gRPC/HTTP/2,stream 不报
REFUSED_STREAM - 检查 error.log:无
SSL_CTX_use_PrivateKey_file() failed或no live upstreams类报错











