重新启动 Nginx 或在证书更改时重新加载证书缓存

Posted

技术标签:

【中文标题】重新启动 Nginx 或在证书更改时重新加载证书缓存【英文标题】:Restart Nginx or reload certificate cache on cert change 【发布时间】:2020-10-07 10:39:14 【问题描述】:

背景:

我正在 Docker 中运行一个应用程序,该应用程序将由通常不了解 Docker 本身的随机用户管理。我正在构建应用程序,以便尽可能从网络服务器本身进行配置。

它运行 3 个非根容器:

容器 1:Gunicorn、Django、Certbot 容器 2:nginx 容器 3:Postgresql

我可以让 Django 应用程序通过网站本身运行 certbot 以获取证书并将证书复制到 nginx 正在使用的卷中。但是旧的或自签名的证书似乎在启动时被 nginx 缓存,因此在 nginx 重新启动之前不会使用新证书。

这就是问题所在,我现在必须重新启动 nginx 或以某种方式自动重新加载证书。通过触发从 Django 容器到 Nginx 容器的重新启动,可能是通过 curl 或其他方式。或者我可以使用看门狗之类的东西来监视文件以进行文件更改。

问题:

如果证书更改,自动重新加载 nginx 的最佳方法是什么?或者我可以在不重新启动服务器的情况下清除证书的证书缓存吗?您对此有何建议?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

重新加载应该足以加载新证书。

一些选项:

使用主机cron重新加载nginx

0 */6 * * * docker exec <nginx_container_name> nginx -s reload

使用 certbot deploy hook(你需要在 nginx 容器中运行 certbot 或者想办法让这个 deploy hook 远程)
/etc/letsencrypt/cli.ini:
deploy-hook = nginx -s reload

【讨论】:

即使我重新加载 nginx,我也得到了相同的证书 我推荐使用nginx -t && nginx -t reload,这样任何无效的配置都不会导致您的网站在半夜宕机。

以上是关于重新启动 Nginx 或在证书更改时重新加载证书缓存的主要内容,如果未能解决你的问题,请参考以下文章

JBoss 无需重新启动即可重新加载证书信任库

IIS 重新启动后 JWKS 更改

Nginx配置https证书

在重启期间使用 https 站点将证书密码传递给 Nginx

即使在从钥匙串访问和 App Store Connect 中删除后,重新启动 Xcode 时,已删除的 iOS 证书仍会继续显示在钥匙串中

什么是“javax.net.ssl.SSLHandshakeException:服务器证书更改在重新协商期间受到限制”以及如何防止它?