这篇文章介绍了如何通过 Docker + Nginx + Certbot 自动申请 Let’s Encrypt 免费 HTTPS 证书,并实现自动续期。
一、准备工作
确保你已经完成以下准备:
- 拥有一个域名(如
www.example.com)并已将其解析到你的云服务器 IP。
- 已生成静态网站页面。
- Docker 和 Docker Compose 已在服务器上安装。
- 开放了服务器的 80 和 443 端口。
二、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 天,你需要定期执行续期命令:
推荐方式:使用宿主机 cron 自动续期
- 创建续期脚本
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
docker exec container-nginx nginx -s reload
|
- 添加定时任务:
加入:
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,并实现自动续期,提升安全性和专业性。