零中断关键在于reload时旧连接的优雅收尾,需配置worker_shutdown_timeout并协同调优keepalive_timeout、proxy_read_timeout等参数,同时确保证书权限、链完整性和路径正确。

能实现零中断,关键不在“换证书”本身,而在于 reload 时旧连接如何收尾。默认 reload 会立即终止旧 worker 进程,导致长连接被 RST 中断;只要补上 worker_shutdown_timeout 并协同调优几项配置,就能真正守住连接不掉线。
必须显式配置 worker_shutdown_timeout
这是决定是否中断的核心开关,但 Nginx 默认值为 0(即不等待),必须手动设置:
- 在 http{} 或 main{} 块中添加:
worker_shutdown_timeout 30s; - 该值表示旧 worker 收到 QUIT 后最多等待 30 秒,期间继续处理已建立连接的请求,但不再接受新连接
- 设太短(如 5s)可能截断慢响应;设太长(超过后端超时)会导致 worker 卡住,建议略大于
proxy_read_timeout
同步调整三类关联超时参数
单靠 worker_shutdown_timeout 不够,还需确保上下游时间窗口匹配:
- keepalive_timeout:设为 ≥60s,避免 reload 前连接被 Nginx 主动关闭,保障复用连接存活
-
proxy_read_timeout / proxy_send_timeout:必须 ≥
worker_shutdown_timeout,否则旧 worker 可能因代理超时提前退出,丢弃未发完的响应 - ssl_session_timeout:建议设为 4h 左右,不影响 reload,但有助于客户端复用 TLS 会话,减少握手开销
证书文件与权限必须一次到位
reload 成功 ≠ 新证书生效。常见静默失败原因:
- 私钥权限不是 600(如 644),Nginx 启动新 worker 时会静默降级回用旧证书
- 证书链不完整(例如只传了 domain.crt,没传 fullchain.pem),部分客户端(尤其是 Android、旧 iOS)会校验失败
-
ssl_certificate写在 server 块外(如 http 块中),Nginx 会忽略,仍用旧配置 - 路径写错或文件不存在,新 worker 启动失败,主进程自动回退——此时看似 reload 成功,实则证书未更新
验证是否真零中断,不能只看日志
执行 nginx -s reload 后,要实测连接生命周期:
- 用
ss -tnp | grep :443 | grep ESTAB | wc -l观察 ESTAB 连接数,reload 前后应平滑过渡,不应归零 - 对 WebSocket 长连接持续 ping,reload 期间确认无 1006 错误
- 用
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts检查返回的证书指纹和有效期,确认已是新证书 - 抓包看是否有突现的 RST 包;或检查 error log 中是否出现
shutdown() failed或recv() failed


















