Docker Compose+Nginx+Certbot自动化部署HTTPS的详细指南

 更新时间:2025年07月06日 10:06:41   作者:码上有潜  
打造属于您的全自动 HTTPS 服务,无需复杂配置,无需手动维护,只需 3 个核心文件和 5 分钟时间,即可实现永久自动化的 HTTPS 加密解决方案,下面我们就来看看具体方法吧

引言:三文件搞定 HTTPS 自动化部署

本文将展示如何仅用三个配置文件和 Docker Compose 实现:

  • 全自动 HTTPS 证书管理
  • HTTP 自动重定向到 HTTPS
  • 零干预证书续期
  • 极简目录结构

无需复杂脚本,无需额外工具,只需以下结构:

/home/middleware/nginx/
├── conf.d/
│   ├── default.conf    # HTTP 处理
│   └── ssl.conf        # HTTPS 服务配置
├── nginx.conf          # 主配置
├── docker-compose.yml  # 服务编排
└── cert/               # 证书存储目录

1. 创建目录结构

mkdir -p /home/middleware/nginx/{conf.d,cert}
cd /home/middleware/nginx

2. 配置文件内容

2.1nginx.conf(主配置文件)

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  /var/log/nginx/access.log  main;
    
    sendfile        on;
    keepalive_timeout  65;
    
    # 包含其他配置
    include /etc/nginx/conf.d/*.conf;
}

2.2conf.d/default.conf(HTTP 处理)

# 处理 HTTP 请求
server {
    listen 80;
    server_name example.com www.example.com;
    
    # Certbot 验证目录
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    
    # 其他所有请求重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

2.3conf.d/ssl.conf(HTTPS 服务)

# HTTPS 服务器
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    # SSL 证书配置
    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 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    
    # 安全头
    add_header Strict-Transport-Security "max-age=63072000" always;
    
    # 你的应用配置 (如果是已有的网站这里可配置代理跳转)
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
    
    # 保留证书验证路径
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
}

2.4docker-compose.yml(服务编排)

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./cert:/etc/letsencrypt
      - certbot_www:/var/www/certbot
    restart: unless-stopped
    depends_on:
      - certbot

  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./cert:/etc/letsencrypt
      - certbot_www:/var/www/certbot
    command: >
      sh -c '
      # 首次运行获取证书
      if [ ! -f "/etc/letsencrypt/live/example.com/fullchain.pem" ]; then
        certbot certonly --webroot -w /var/www/certbot -d example.com -d www.example.com 
          --email your-email@example.com --agree-tos --noninteractive;
      fi;
      
      # 每12小时检查续期
      while :; do
        sleep 12h
        certbot renew
      done'
    restart: unless-stopped

volumes:
  certbot_www:

3. 部署流程

步骤1: 替换域名

将配置文件中的所有 example.com 替换为你的实际域名

步骤2: 启动服务

docker-compose up -d

步骤3: 验证部署

curl -I https://yourdomain.com
# 应返回 200 OK

4. 工作原理

证书生命周期管理

1.首次启动

  • Certbot 检测到没有证书
  • 自动通过 HTTP 验证获取证书
  • 证书保存在 ./cert 目录

2.自动续期

  • Certbot 每12小时检查证书
  • 到期前30天内自动续期
  • Nginx 自动使用新证书

请求流程

  • HTTP 请求到达 80 端口
  • 如果是证书验证请求 → 由 Certbot 处理
  • 其他请求 → 重定向到 HTTPS
  • HTTPS 请求使用有效证书提供服务

5. 常见问题解决

问题1: 首次启动证书获取失败

解决方案:重启服务

docker-compose down
docker-compose up -d

问题2: 需要更新配置

# 修改配置后
docker-compose down
docker-compose up -d --force-recreate

问题3: 检查证书状态

docker-compose exec nginx openssl x509 -in /etc/letsencrypt/live/yourdomain.com/fullchain.pem -noout -dates

6. 进阶调整

自定义证书参数

docker-compose.yml 中修改 Certbot 命令:

command: >
  sh -c '
  if [ ! -f "/etc/letsencrypt/live/example.com/fullchain.pem" ]; then
    certbot certonly --webroot -w /var/www/certbot -d example.com 
      --email your-email@example.com 
      --agree-tos 
      --noninteractive
      --rsa-key-size 4096; # 密钥大小
  fi;
  while :; do sleep 12h; certbot renew; done'

多域名支持

command: >
  sh -c '
  if [ ! -f "/etc/letsencrypt/live/example.com/fullchain.pem" ]; then
    certbot certonly --webroot -w /var/www/certbot 
      -d example.com 
      -d www.example.com 
      -d api.example.com; # 添加更多域名
  fi;
  while :; do sleep 12h; certbot renew; done'

测试环境使用

command: >
  sh -c '
  if [ ! -f "/etc/letsencrypt/live/example.com/fullchain.pem" ]; then
    certbot certonly --webroot -w /var/www/certbot -d example.com 
      --staging; # 使用测试环境
  fi;
  while :; do sleep 12h; certbot renew; done'

结语:极简 HTTPS 自动化

通过这个方案,你获得了:

  • 极简配置:仅需三个核心文件
  • 全自动化:证书获取、续期零干预
  • 易于维护:所有配置集中管理
  • 资源高效:轻量级容器方案

立即部署

  • 创建目录结构
  • 复制配置文件
  • 替换域名
  • 运行 docker-compose up -d

最佳实践

  • 定期执行 docker-compose pull 更新镜像
  • 监控 ./cert 目录的证书文件
  • 每季度检查一次部署状态

这种极简但功能完整的 HTTPS 解决方案,完美平衡了易用性和功能性,适合大多数 Web 应用场景。

到此这篇关于Docker Compose+Nginx+Certbot自动化部署HTTPS的详细指南的文章就介绍到这了,更多相关Docker Nginx自动化部署HTTPS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker部署golang http服务时端口无法访问的问题解决

    docker部署golang http服务时端口无法访问的问题解决

    本文主要介绍了docker部署golang http服务时端口无法访问的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • docker部署rabbitmq集群的实现方法

    docker部署rabbitmq集群的实现方法

    这篇文章主要介绍了docker部署rabbitmq集群的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • docker容器指定主机同网段方式

    docker容器指定主机同网段方式

    文章介绍了如何使用Docker的macvlan网络模式,让容器直接连接到物理网络,提高网络性能和稳定性,同时,也提供了创建、绑定、配置和解除容器网络的相关命令
    2025-12-12
  • docker inspect 操作详解

    docker inspect 操作详解

    docker inspect是docker客户端的原生命令,用于查看docker对象的底层基础信息。包括容器的id、创建时间、运行状态、启动参数、目录挂载、网路配置等等。另外,该命令也可以用来查看docker镜像的信息,这篇文章主要介绍了docker inspect 详解,需要的朋友可以参考下
    2023-01-01
  • Docker常用命令详解

    Docker常用命令详解

    这篇文章主要介绍了Docker常用命令详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 阿里云docker容器固定应用到到某一个节点记录

    阿里云docker容器固定应用到到某一个节点记录

    这篇文章主要介绍了阿里云docker容器固定应用到到某一个节点记录,需要的朋友可以参考下
    2018-05-05
  • Docker 教程之数据管理详细介绍

    Docker 教程之数据管理详细介绍

    这篇文章主要介绍了Docker 教程之数据管理详细介绍的相关资料,需要的朋友可以参考下
    2017-01-01
  • Docker 通过端口来连接一个容器的实现

    Docker 通过端口来连接一个容器的实现

    这篇文章主要介绍了Docker 通过端口来连接一个容器的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker bashrc文件的合理配置方案详解

    docker bashrc文件的合理配置方案详解

    本文给大家详细介绍docker bashrc文件的合理配置方案详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-10-10
  • 使用Docker部署前后端分离项目的完整步骤

    使用Docker部署前后端分离项目的完整步骤

    刚刚接触基础的运维工作,采用的是docker部署的方式,下面这篇文章主要给大家介绍了关于使用Docker部署前后端分离项目的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01

最新评论