重新启动Nginx或重新加载证书缓存以更改证书。

10

背景:

我在Docker容器内运行一个应用程序,由随机用户管理,他们通常对Docker本身没有任何了解。 我正在构建这个应用程序,使其尽可能从Web服务器本身进行配置。

它运行3个非root容器:

  • 容器1:Gunicorn、Django、Certbot
  • 容器2:Nginx
  • 容器3:Postgresql

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

这里有一个问题,我现在必须重新启动nginx或以某种方式自动重新加载证书。 可以通过从Django容器触发重启到Nginx容器,例如通过curl之类的方式。 或者我可以使用类似于watchdog的东西来监视文件是否发生了变化。

问题:

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

提前感谢您的帮助!

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
14

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

一些选项:

  • 使用主机cron重新加载nginx

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

  • 使用certbot deploy hook(您需要在nginx容器中运行certbot或考虑一种方法使此部署钩子远程)
/etc/letsencrypt/cli.ini:
deploy-hook = nginx -s reload

即使我重新加载了nginx,我仍然得到相同的证书。 - SOAL ABDELDJALLIL
2
我建议使用nginx -t && nginx -t reload,这样任何无效的配置都不会导致您的网站在半夜崩溃。 - Daniël van den Berg
可能是打错了:应该是 nginx -t && nginx -s reload,对吗? - PFudd
4
在这种情况下,“nginx -t”无法帮助解决“nginx -s reload”的问题,因为后者已经进行了测试,如果配置文件错误,则会停止重新加载。引用自文档:...“它检查新配置文件的语法有效性,并尝试应用其中提供的配置。”...“否则,主进程会回滚更改,并继续使用旧配置工作。” - Vin
1
请注意,如果您在几分钟前进行了测试,则可能会保持与仍在运行的旧工作程序的保持活动连接。要么等待所有旧工作程序退出,要么打开一个新的浏览器(或私人窗口)并从那里进行测试。 - higuita
дёҖдәӣдәәејәзғҲе»әи®®дҪҝз”ЁжӣҙеҸҜйқ зҡ„deploy-hook = systemctl reload nginxиҖҢдёҚжҳҜnginx -s reloadгҖӮ - Dmitry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,