Nginx 不考虑更新让我们加密证书

Nginx not taking into account renewed let's encrypt certificates

我在内部端口上有一个服务器 运行 一些 NodeJs 应用程序(准确地说是 MeteorJs)。我使用 Nginx 来 proxy_pass 以应用程序 URL 为目标的请求。

假设 app_1localhost:3000 上是 运行,我会 proxy_pass app1.domain.comlocalhost:3000 然后添加防火墙规则来限制在端口 3000 上访问。

然后我使用 letsencrypt 在 app1.domain.com 的传入连接上添加 SSL。我使用 certbot certonly -w /var/www/app1 -d app1.domain.com 生成证书,然后设置 nginx 配置文件以使用它。

在更新证书之前,一切都完美无缺。

要进行更新,我有以下 cron 作业:

12 6 * * 3 /root/renew.sh

使用以下脚本 /root/renew.sh :

certbot renew 
service nginx reload

我遇到的问题是,过期后,nginx 网络服务器不再提供新证书!

所以我添加了以下 cron 作业:

30 6 * * 3 service nginx restart

但它仍然无法刷新证书(这会导致导航器出错,说连接不安全,因为证书过期)。所以我需要手动登录并重新加载nginx。

我的设置有什么问题?

谢谢

经过更多测试,这里是这个问题的答案:

将 cron 作业设置为指向 bash 脚本:

12 6 * * 3 /root/renew.sh

并像这样设置 bash 脚本:

certbot renew
sleep 1m
service nginx reload

请注意 sleep 命令的存在,该命令允许等待更新完成

您可以在一个 cronjob 行中设置所有内容(修改后的基本设置):

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "nginx -t && systemctl restart nginx"

此 cron 作业每天触发两次,以检查证书是否在接下来的 30 天内过期。它不应该导致性能问题。

如果它即将过期,那么它会安静地自动更新它而不生成输出并重新启动 NGINX 以应用更改。如果证书没有过期则不会执行任何操作。

注意 --deploy-hook 参数已添加到 2017 年 7 月发布的 certbot 版本 0.17