使用 Docker Compose 部署 Nginx 和 ACME 自动更新证书的解决方案
使用 Docker Compose 部署 Nginx 和 ACME 自动更新证书的解决方案,通常结合 Certbot 或 Caddy 来实现自动生成和更新 SSL 证书。以下是一个完整的示例步骤,使用 Certbot 和 Docker Compose 来实现 Nginx 中证书的自动更新。
1. 准备工作
- 确保服务器有一个域名并已解析到服务器 IP(例如
example.com
)。 - 已安装 Docker 和 Docker Compose。
2. 目录结构
创建一个项目目录并设置如下结构:
acme-nginx/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ └── default.conf
│ ├── ssl/
└── certbot/
nginx/conf.d/
: 存放 Nginx 的站点配置文件。nginx/ssl/
: 用于存储 SSL 证书文件。certbot/
: Certbot 的配置和数据卷。
3. 创建 docker-compose.yml
在项目根目录下创建 docker-compose.yml
文件:
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
depends_on:
- certbot
restart: unless-stopped
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 12h & wait $${!}; certbot renew; done'"
restart: unless-stopped
4. 配置 Nginx 站点
修改或创建文件 nginx/conf.d/default.conf
,配置 Nginx 以使用 HTTP 验证,并应用后续的 SSL 证书:
初始配置(仅 HTTP)
在 HTTPS 证书申请之前,使用以下配置:
server {
listen 80;
server_name example.com; # 替换为你的域名
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
5. 启动容器并申请证书
启动 Docker Compose 服务:
docker-compose up -d
申请 SSL 证书:
docker-compose run certbot certonly --webroot --webroot-path=/var/www/certbot --email [email protected] --agree-tos --no-eff-email -d example.com -d www.example.com
- 替换
[email protected]
为你的邮箱地址。 - 替换
example.com
和www.example.com
为你的域名。
成功后,证书会生成在 certbot/conf/live/example.com/
目录下。
6. 配置 HTTPS
更新 nginx/conf.d/default.conf
文件,启用 HTTPS:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
7. 重启 Nginx 服务
每次更新配置文件后,重启 Nginx 服务以加载新的配置:
docker-compose restart nginx
8. 配置自动更新证书
在 docker-compose.yml
中,Certbot 服务已被配置为每 12 小时尝试续订证书。同时,为了确保 Nginx 能应用最新的证书,可以通过以下方式重载 Nginx:
修改 certbot
服务的 entrypoint
,在证书更新后触发 Nginx 重载:
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 12h & wait $${!}; certbot renew && docker exec nginx nginx -s reload; done'"
restart: unless-stopped
9. 验证证书更新
可以手动测试自动更新是否生效:
docker-compose run certbot renew
docker exec nginx nginx -s reload
10. 完成
通过以上步骤,你已经成功使用 Docker Compose 部署了 Nginx,并实现了 ACME 自动更新证书的功能。
注意事项
- 确保 80 和 443 端口开放。
- 确保域名正确解析到服务器的 IP。
- 定期检查证书是否正常续订(虽然是自动化的,但建议每月检查一次)。