使用 Docker + Nginx + Certbot 实现自动申请和续期 SSL 证书

这篇文章介绍了如何通过 Docker + Nginx + Certbot 自动申请 Let’s Encrypt 免费 HTTPS 证书,并实现自动续期。


一、准备工作

确保你已经完成以下准备:

  1. 拥有一个域名(如 www.example.com)并已将其解析到你的云服务器 IP。
  2. 已生成静态网站页面。
  3. Docker 和 Docker Compose 已在服务器上安装。
  4. 开放了服务器的 80443 端口。

二、Docker Compose 配置

这是我的 docker-compose.yml 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.9'

services:
nginx:
image: nginx:alpine
container_name: container-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/public:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx/logs:/var/log/nginx
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- certbot
restart: always
mem_limit: 256m

certbot:
image: certbot/certbot
container_name: container-certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: >
sh -c "certbot certonly --webroot --webroot-path=/var/www/certbot
--email [email protected] --agree-tos --no-eff-email
-d www.example.com"

请将 [email protected]www.example.com 替换为你自己的邮箱和域名。


三、Nginx 配置(nginx.conf)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name www.example.com;

location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
root /usr/share/nginx/html;
index index.html;
}
}

server {
listen 443 ssl;
server_name www.example.com;

ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

location / {
root /usr/share/nginx/html;
index index.html;
}
}

四、申请证书失败排查

如果 Certbot 申请证书失败,通常是因为:

  • 端口 80 被防火墙或安全组屏蔽(解决:开放端口)
  • Nginx 没有正确响应 .well-known/acme-challenge/ 路径
  • Certbot 的 --webroot-path 路径和 Nginx 不一致

测试方法:

1
curl http://www.example.com/.well-known/acme-challenge/test

如果你能访问,说明配置 OK。


五、自动续期配置

Let’s Encrypt 证书有效期是 90 天,你需要定期执行续期命令:

1
certbot renew --quiet

推荐方式:使用宿主机 cron 自动续期

  1. 创建续期脚本 renew.sh
1
2
3
4
5
6
7
8
9
#!/bin/bash

docker run --rm \
-v /path/to/your/project/certbot/conf:/etc/letsencrypt \
-v /path/to/your/project/certbot/www:/var/www/certbot \
certbot/certbot renew --quiet

# 重载 nginx 容器
docker exec container-nginx nginx -s reload
  1. 添加定时任务:
1
crontab -e

加入:

1
0 3 * * * /bin/bash /path/to/your/project/renew.sh >> /var/log/renew.log 2>&1

这样每天凌晨 3 点会自动尝试续期,成功后自动 reload Nginx。


六、查看证书状态

查看当前证书信息:

1
2
3
docker run --rm \
-v ./certbot/conf:/etc/letsencrypt \
certbot/certbot certificates

通过 Docker Compose + Nginx + Certbot,你可以方便地为静态网站启用 HTTPS,并实现自动续期,提升安全性和专业性。


使用 Docker + Nginx + Certbot 实现自动申请和续期 SSL 证书
http://eevann.cn/2024/09/03/nginx-cerbot/
作者
月下独白
发布于
2024年9月4日
许可协议