65.9K
CodeProject 正在变化。 阅读更多。
Home

在续订 Certbot 管理的 Let's Encrypt 证书后,重新加载运行在反向代理后面的 Docker 容器的服务

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 2 月 5 日

MIT

3分钟阅读

viewsIcon

3190

Linux VPS 上,用于在续订由 Certbot 管理的 Let's Encrypt 证书后,自动重新加载运行在 nginx 反向代理服务器后面的 Docker 容器的服务单元

引言

我想分享一下在容器化环境中简化循环更新免费Let's Encrypt证书的想法。我最喜欢的Web托管平台是Docker。因此,为了实现和发布Web应用程序,我使用在Linux VPS上运行的Docker容器。在这种环境中,我有许多Web应用程序容器运行在一个nginx反向代理服务器容器之后。但是,为了实现用于户外通信的HTTPS协议,我使用免费的Let's Encrypt证书,我使用Certbot工具进行管理。尽管所描述的环境无疑是一个受欢迎且出色的解决方案,但它也会导致一些问题。

也就是说,在没有额外工具的情况下,我必须记住在更新后将证书复制到代理服务器,然后手动重新加载使用该证书的网站。虽然这并不是一项困难的任务,但它需要一些注意力,而这些注意力本可以用于更有趣的活动。我解决这个小问题的想法非常简单且灵活。它允许我完全自动化证书更新过程,并且还允许我避免重启代理服务器。

背景

这个想法是使用Certbot计时器,它负责自动和循环地更新证书。Certbot在系统上安装了一个名为certbot.service的计时器服务,该服务会定期自动启动更新已安装证书的过程。

为了实现,我编写了一些可以自由配置的简单脚本。这些脚本在系统上安装了两个附加服务,这些服务与Certbot计时器一起工作。第一个服务我命名为certbot-renewed-copy.service,负责将更新后的证书自动复制到代理目录。第二个服务,名为certbot-post-renewal-reload.service,处理在证书更新时重新加载Web应用程序容器的问题。代理服务器容器不会被重新加载,这仅适用于应用程序容器。

在可能的情况下,Certbot使用webroot方法安装证书,因为它不需要你禁用使用端口80的代理服务器。

我假设Web应用程序容器是使用Docker Compose工具管理的。在该工具的配置文件中,对于给定的容器 (docker-compose.yml),应该在environment: VIRTUAL_HOST参数中指定与已安装证书对应的域名。

此外,我假设Certbot将证书安装在标准目录/etc/letsencrypt/live中。

启动的服务将其日志保存到标准系统日志中。因此,可以在给定服务的状态中查看它们,或者使用journalctl工具查看它们。

我已经在Debian 9和Ubuntu 16.04 Linux发行版上测试了此解决方案。

Using the Code

在开始安装之前,请将所有下载的文件复制到您选择的目录中。

安装过程首先包括自定义配置文件内容,然后运行脚本以安装服务。

config.copy.cf文件中,您应该编辑将要复制的证书域名列表 (certificates字段) 以及将它们复制到代理服务器的目录路径 (destination字段)。

例如

certificates = domain.com, sub.domain.com
destination = /path/to/proxy/certs

config.reload.cf文件中,在certs_path字段中,输入与上面证书将被复制到的代理服务器目录相同的路径

certs_path = /path/to/proxy/certs

config.location.cf文件包含所有docker-compose.yml文件的位置列表,这些文件用于启动我们打算在证书更新后自动重新加载的应用程序容器。

例如

/path/to/docked/web/app1
/path/to/docked/api2

为了在系统上安装脚本并运行上述服务,我准备了一个名为install.sh的简单脚本。

以这种方式运行它

$ sudo bash install.sh

可以使用这些命令检查已安装服务的状态和日志

$ sudo systemctl status certbot-renewed-copy.service
$ sudo systemctl status certbot-post-renewal-reload.service
© . All rights reserved.