Nginx 不考虑更新让我们加密证书
Nginx not taking into account renewed let's encrypt certificates
我在内部端口上有一个服务器 运行 一些 NodeJs 应用程序(准确地说是 MeteorJs)。我使用 Nginx 来 proxy_pass
以应用程序 URL 为目标的请求。
假设 app_1
在 localhost:3000
上是 运行,我会 proxy_pass app1.domain.com
到 localhost: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
我在内部端口上有一个服务器 运行 一些 NodeJs 应用程序(准确地说是 MeteorJs)。我使用 Nginx 来 proxy_pass
以应用程序 URL 为目标的请求。
假设 app_1
在 localhost:3000
上是 运行,我会 proxy_pass app1.domain.com
到 localhost: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