使用 Docker Compose 部署 Nginx 和 ACME 自动更新证书的解决方案,通常结合 CertbotCaddy 来实现自动生成和更新 SSL 证书。以下是一个完整的示例步骤,使用 CertbotDocker 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.comwww.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。
  • 定期检查证书是否正常续订(虽然是自动化的,但建议每月检查一次)。

标签: Nginx, SSL

添加新评论