Docker+certbot+Nginx实现自动续期https证书

使用 Docker 和 Certbot 配置 HTTPS 的完整指南

本文将详细介绍如何使用 Docker 和 Certbot 为你的网站配置 HTTPS,并设置自动续期任务。以下是详细步骤:


1. 下载 Certbot 镜像

首先,拉取 Certbot 的 Docker 镜像:

bash 复制代码
bash
复制
docker pull certbot/certbot

2. 创建 docker-compose.yml 文件

创建一个 docker-compose.yml 文件,定义 Nginx 和 Certbot 服务:

yaml 复制代码
yaml
复制
version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf          # 主配置文件
      - ./nginx/conf:/etc/nginx/conf.d                  # 动态配置目录
      - ./nginx/html:/usr/share/nginx/html                # 网站根目录
      - ./certs:/etc/letsencrypt                            # 证书持久化存储(关键!)
      - ./nginx/logs:/var/log/nginx                       # 日志目录
    networks:
      - nginx-network
    restart: always
    command: >
      sh -c "nginx -g 'daemon off;'"
    depends_on:
      - certbot   # 确保 Certbot 先启动(仅首次申请时必要)

  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certs:/etc/letsencrypt                          # 证书存储(与 Nginx 共享)
      - ./nginx/html:/var/www/html                      # HTTP 验证所需的 Webroot
    networks:
      - nginx-network
    restart: always

networks:
  nginx-network:
    driver: bridge
    name: nginx-network

3. 创建 nginx.conf 文件

./nginx/nginx.conf 中配置 Nginx 的 HTTP 验证路径:

bash 复制代码
nginx
复制
server {
    listen 80;
    server_name xxx.com;  # 替换为你的域名

    # 配置 HTTP 验证可访问
    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt;  # 对应 Certbot 的 Webroot 路径
    }

    # 301 永久重定向到 HTTPS(正式获取证书后启用)
    # return 301 https://$host$request_uri;
}

4. 启动服务

使用 Docker Compose 启动服务:

复制代码
bash
复制
docker compose up -d

5. 测试证书发放

运行以下命令测试证书发放是否正常:

css 复制代码
bash
复制
docker compose run --rm certbot certonly --webroot --webroot-path /etc/letsencrypt --dry-run -d xxx.com

如果输出 The dry run was successful.,说明测试成功。


6. 正式获取证书

如果测试成功,去掉 --dry-run 参数正式获取证书:

css 复制代码
bash
复制
docker compose run --rm certbot certonly --webroot --webroot-path /etc/letsencrypt -d xxx.com

按照提示输入邮箱等信息,完成证书申请。


7. 生成结果文件

Certbot 会在 ./certs/live/xxx.com/ 目录下生成证书文件,包括:

  • fullchain.pem:完整的证书链
  • privkey.pem:私钥

8. 创建 HTTPS 配置文件

./nginx/https.conf 中配置 HTTPS:

ini 复制代码
nginx
复制
server {
    listen       443 ssl;
    server_name  xxx.com;

    ssl_certificate /etc/letsencrypt/live/xjskr.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xjskr.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

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

    location /skr-oa {
        alias   /usr/share/nginx/html/oa;
        index  index.html index.htm;
    }

    location /okx {
        alias /usr/share/nginx/html/okx;
        index okx.html okx.htm;
    }

    location /love {
        alias   /usr/share/nginx/html/hp;
        index  index.html index.htm;
    }

    location /api/ {
        proxy_pass http://gateway:8001/;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

将此文件挂载到 Nginx 的配置目录中,或者替换 nginx.conf 中的 server 块。


9. 重启 Nginx

重新加载 Nginx 配置以应用 HTTPS:

复制代码
bash
复制
docker compose restart nginx

10. 配置定时任务自动续期

为了避免证书过期,设置一个定时任务每月 1 号和 15 号自动续期证书并重启 Nginx:

复制代码
bash
复制
sudo crontab -e

添加以下内容:

bash 复制代码
bash
复制
0 0 1,15 * * cd /root/docker/nginx && /usr/bin/docker compose run --rm certbot renew && /usr/bin/docker compose restart nginx

保存后,定时任务将自动运行。


总结

通过以上步骤,你已经成功使用 Docker 和 Certbot 为你的网站配置了 HTTPS,并设置了自动续期任务。这样可以确保你的网站始终安全可靠,避免因证书过期导致的服务中断。

相关推荐
止语Lab1 天前
Go并发编程实战:Channel 还是 Mutex?一个场景驱动的选择框架
开发语言·后端·golang
小码哥_常1 天前
Spring Boot一键限速:守护你的接口“高速路”
后端
阿丰资源1 天前
基于SpringBoot的物流信息管理系统设计与实现(附资料)
java·spring boot·后端
王码码20351 天前
Go语言的包管理:从GOPATH到Go Modules
后端·golang·go·接口
IT_陈寒1 天前
Redis的内存溢出坑把我整懵了,分享这个血泪教训
前端·人工智能·后端
Jasper_o1 天前
MassTransit OutBox 不发送消息问题
后端·.net
掘金码甲哥1 天前
glm模型这么火,咱们用vllm也咧一个呗
后端
邦爷的AI架构笔记1 天前
踩坑3天后,我把公司的AI接口全换成了多模型路由——GPT-6和Claude Opus 4.7同时上线的这周
人工智能·后端
DashVector1 天前
AI Agent 接入 Zvec (一):MCP 篇
数据库·人工智能·后端
程序员老邢1 天前
【技术底稿 15】SpringBoot 异步文件上传实战:多线程池隔离 + 失败重试 + 实时状态推送
java·经验分享·spring boot·后端·程序人生·spring