使用Docker的Nginx镜像将hexo博客迁移到阿里云服务器并使用Certbot实现自动签发及续签Let‘s Encrypt免费SSL证书
在开始前:
- 请确保你阿里云服务器的安全组中开启了80端口和443端口。
- 确保你已经有了自己的域名并已经设置了正常的DNS解析地址。
安装Certbot工具
更新系统,安装安装Certbot及Nginx插件
这里非常简单,两行命令就搞定了。
1 | # 更新系统包 |
获取Let’s Encrypt证书
Certbot支持多种证书获取模式,包括Standalone模式、Webroot模式和DNS验证模式。使用Standalone模式获取证书是最简单的方式,无需现有Web服务器运行,但需要临时开放80端口。也就是说在运行下面命令前,你需要看一下自己的80端口现在有没有被占用,如果被占用了,需要及时将占用程序退出,否则会报错。
1 | sudo netstat -tulnp | grep :80 |
- 示例输出:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx→ 进程名是nginx
然后退出它就可以了:
1 | sudo systemctl stop nginx |
然后运行 Certbot
1 | # 示例:使用邮箱test@lovone.email为域名test.com申请SSL证书 |
正常情况下会在你的/etc/letsencrypt/live/test.com 文件夹下生成pem证书。

配置自动续签任务
Certbot默认安装后会自动创建Cron定时任务,实现证书自动续签。
验证Cron任务是否已生成:
1 | # 查看Certbot的Cron配置 |
输出应包含类似以下内容:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && certbot -q renew
此配置表示每12小时(每天两次)检查证书有效期,如果剩余有效期少于30天,则自动续签.
如果希望确保证书续签后Docker容器内的Nginx服务能自动重新加载配置,需要在Cron命令中添加--post-hook参数:
1 | # 编辑root用户的Cron任务 |
此配置会在每12小时检查一次证书,如果需要续签,则执行续签操作,并在完成后通过docker exec命令重载容器内的Nginx服务,使新证书生效。
创建Dockerfile配置Nginx安全设置
1 | # 使用国内镜像加速源获取基础镜像 |
Dockerfile实现了三个关键的安全配置
- 使用国内镜像加速源
docker.1ms.run/nginx:alpine提高镜像拉取速度 - 通过
sed命令修改Nginx配置,隐藏版本信息(server_tokens off) - 删除默认配置文件
default.conf,避免与自定义配置冲突
配置nginx.conf
1 | server { |
配置文件实现了基本的安全要求
- 隐藏Nginx版本信息(
server_tokens off) - 禁止访问以点开头的隐藏文件和文件夹(
location ~^\.(git|env|log)规则) - 禁用目录列表(
autoindex off) - 在HTTP端口(80)上将所有请求重定向到HTTPS
- 配置SSL证书路径和安全参数
编写docker-compose.yml
接下来创建docker-compose.yml文件,定义Nginx服务并配置卷挂载,确保证书和博客源码可以访问:
1 | version: '3.8' |
docker-compose.yml文件实现了关键的卷挂载功能
- 将物理机上的博客源码目录挂载到容器的
/usr/share/nginx/html目录 - 将物理机上的Let’s Encrypt证书目录挂载到容器的
/etc/letsencrypt目录
通过这种挂载方式,容器内的Nginx可以访问最新的博客内容和证书,无需重新构建镜像即可更新。Certbot在物理机上获取和续签的证书会自动同步到容器中。
构建自定义Nginx镜像并启动服务
1 | # 构建镜像 |
此时你在浏览器中访问test.com,浏览器会先访问http://test.com ,随后跳转到https://test.com,表示此时已成功配置好SSL证书。

维护与升级
随着博客内容的更新和Nginx配置的调整,需要定期维护和升级服务:
1 | # 拉取最新的博客源码 |
Good Luck !





