我有一台服务器在内部端口上运行一些NodeJs应用程序(准确地说是MeteorJs)。我使用Nginx来proxy_pass
以URL为应用程序的请求。
假设app_1
在localhost:3000
上运行,我可以将app1.domain.com
代理传递给localhost:3000
,然后添加防火墙规则以限制对端口3000的访问。
然后,我使用letencrypt在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 Web服务器不提供新证书!
所以我添加了以下cron作业:
30 6 * * 3 service nginx restart
,但是它仍然无法刷新证书(这会导致导航器出错,原因是由于证书过期,连接不安全)。因此,我需要手动登录并重新加载nginx。
我的设置有什么问题?
谢谢
答案 0 :(得分:0)
经过更多测试后,以下是此问题的答案:
将cron作业设置为指向bash脚本:
12 6 * * 3 /root/renew.sh
并按如下所示设置bash脚本:
certbot renew
sleep 1m
service nginx reload
请注意sleep
命令的存在,该命令可以等待更新完成
答案 1 :(得分:0)
您可以在一个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中添加的。