【Docker】使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

docker使用certbot与acme生成SSL证书 阅读详情

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx + Certbot 为示例,基于 Docker 容器来搭建一个可以自动申请、自动续期的 SSL 证书服务,帮助你更轻松地管理多域名的 HTTPS。


一、方案简介

在这个方案中,我们使用官方 Nginx 镜像作为基础镜像,并在其中安装 Python3、Certbot 及阿里云 DNS 插件。通过以下几个关键脚本来实现自动部署及管理:

  1. start.sh:容器启动时执行,初始化阿里云 DNS 配置并启动 Nginx。
  2. add-domain.sh:添加新域名并为其申请证书,自动生成 Nginx 配置文件,最后重载 Nginx。
  3. deploy-certbot.sh:读取域名列表,一键申请或续期证书。
  4. domains.txt:存放所有需要申请 SSL 证书的域名列表。

同时,通过挂载相应目录,可以将证书、日志、Nginx 配置文件全部持久化到宿主机,不会因为容器的更新或重启而丢失。


二、准备工作

  1. 服务器已经安装 Docker(版本建议 >= 19.03)。

  2. 你拥有阿里云账号,并且已经开通了 AliyunDNSFullAccess 权限的 Access Key:

    • ALIYUN_ACCESS_KEY_ID
    • ALIYUN_ACCESS_KEY_SECRET
  3. 确保服务器安全组或本地防火墙已允许 HTTP(80) 和 HTTPS(443)。


三、获取配置文件

以下操作假设我们把部署目录统一放在 /data/nginx-certbot 下。

# 1. 创建部署目录
mkdir -p /data/nginx-certbot
cd /data/nginx-certbot

# 2. 通过临时容器获取镜像内的 Nginx 配置
docker run -d --name nginx_conf -it registry.cn-hangzhou.aliyuncs.com/hbteck/nginx-certbot:1.20.2

# 3. 拷贝 Nginx 配置文件到本地 conf 目录
docker cp nginx_conf:/etc/nginx/ ./conf

# 4. 删除临时容器
docker rm -f nginx_conf

此时,/data/nginx-certbot/conf 目录下已包含镜像内的默认 Nginx 配置文件(包括 nginx.conf、vhost 目录等),可根据需求进行调整和定制。


四、主要文件和脚本说明

下面列举一些在本方案中常见或关键的文件结构与作用,仅供参考:

  1. Dockerfile
    这是我们自定义镜像的核心文件。可自行修改或参考原始镜像中的配置。示例:

    # 使用官方nginx镜像作为基础镜像
    FROM nginx:stable
    
    # 替换为国内源
    RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && \
        sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    
    # 安装必要的软件包
    RUN apt-get update && \
        apt-get install -y \
        python3 \
        python3-pip \
        cron \
        && rm -rf /var/lib/apt/lists/*
    
    # 配置pip国内源
    RUN pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
        pip3 config set install.trusted-host mirrors.aliyun.com
    
    # 安装certbot和阿里云DNS插件
    RUN pip3 install certbot certbot-dns-aliyun
    
    # 创建必要的目录
    RUN mkdir -p /etc/nginx/conf.d && \
        mkdir -p /etc/letsencrypt && \
        mkdir -p /etc/nginx/vhost && \
        mkdir -p /var/log/certbot
    
    # 复制配置文件
    COPY ./nginx.conf /etc/nginx/nginx.conf
    COPY ./deploy-certbot.sh /usr/local/bin/deploy-certbot.sh
    COPY ./add-domain.sh /usr/local/bin/add-domain.sh
    COPY ./start.sh /usr/local/bin/start.sh
    COPY ./domains.txt /etc/letsencrypt/domains.txt
    
    # 设置脚本权限
    RUN chmod +x /usr/local/bin/deploy-certbot.sh && \
        chmod +x /usr/local/bin/start.sh && \
        chmod +x /usr/local/bin/add-domain.sh
    
    # 设置环境变量默认值
    ENV RENEW_CRON_SCHEDULE="0 0 1 * * ?"
    ENV CERTBOT_EMAIL="admin@example.com"
    ENV DNS_PROPAGATION_SECONDS=60
    
    VOLUME ["/etc/letsencrypt", "/var/log/certbot"]
    
    CMD ["/usr/local/bin/start.sh"]
    
    
  2. add-domain.sh
    在容器内用于添加新域名并申请证书的核心脚本:

    #!/bin/bash
    
    new_domain=$1
    backend_url=${2:-"http://localhost:8080"}  # 默认后端地址
    local_ip=$3  # 第三参数: 本地IP地址
    
    # 检查参数
    if [ -z "$new_domain" ]; then
        echo "用法: add-domain.sh <domain> [backend_url] [local_ip]"
        echo "示例: add-domain.sh example.com http://localhost:8080 192.168.1.1"
        exit 1
    fi
    
    # 验证域名格式
    if ! echo "$new_domain" | grep -P '(?=^.{4,253}$)(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$)' > /dev/null; then
        echo "错误: 无效的域名格式"
        exit 1
    fi
    
    # 检查域名是否已存在
    if grep -q "^${new_domain}$" /etc/letsencrypt/domains.txt; then
        echo "域名 ${new_domain} 已存在"
        exit 0
    fi
    
    # 添加新域名
    echo "$new_domain" >> /etc/letsencrypt/domains.txt
    echo "已添加域名: $new_domain"
    
    # 为新域名获取证书
    if ! /usr/local/bin/deploy-certbot.sh; then
        echo "证书获取失败,移除域名配置"
        sed -i "\|^${new_domain}$|d" /etc/letsencrypt/domains.txt
        exit 1
    fi
    
    # 创建nginx配置
    if [ -z "$local_ip" ]; then
        cat <<EOT > /etc/nginx/vhost/${new_domain}.conf
    # upstream配置
    upstream ${new_domain}_backend {
        server ${backend_url#http://};
        keepalive 32;
    }
    
    server {
        listen 443 ssl http2;
        server_name ${new_domain};
    
        ssl_certificate /etc/letsencrypt/live/${new_domain}/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/${new_domain}/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/${new_domain}/chain.pem;
    
        # SSL配置
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
    
        # HSTS配置
        add_header Strict-Transport-Security "max-age=63072000" always;
    
        location / {
            proxy_pass ${backend_url};
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
            proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto \$scheme;
        }
    }
    
    server {
        listen 80;
        server_name ${new_domain};
        return 301 https://\$server_name\$request_uri;
    }
    EOT
    else
        cat <<EOT > /etc/nginx/vhost/${new_domain}.conf
    server {
        listen 443 ssl http2;
        server_name ${new_domain};
    
        ssl_certificate /etc/letsencrypt/live/${new_domain}/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/${new_domain}/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/${new_domain}/chain.pem;
    
        # SSL配置
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
    
        # HSTS配置
        add_header Strict-Transport-Security "max-age=63072000" always;
    
        location / {
            proxy_pass ${backend_url};
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
            proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto \$scheme;
        }
    
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
        
        location /api/ {
             proxy_pass http://${local_ip}:18500/;
             proxy_set_header Host \$http_host;
             proxy_set_header X-Real-IP \$remote_addr;
             proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto \$scheme;
             proxy_set_header X-NginX-Proxy true;
             # 传递所有原始请求头信息
             proxy_pass_request_headers on;
        }
        location /nacos/ {
             proxy_pass http://${local_ip}:8848/nacos/;
             proxy_set_header Host \$http_host;
             proxy_set_header X-Real-IP \$remote_addr;
             proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto \$scheme;
             proxy_set_header X-NginX-Proxy true;
        }
        location /kafka/ {
             proxy_pass http://${local_ip}:9000/kafka/;
             proxy_set_header Host \$http_host;
             proxy_set_header X-Real-IP \$remote_addr;
             proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto \$scheme;
             proxy_set_header X-NginX-Proxy true;
        }
    }
    
    server {
        listen 80;
        server_name ${new_domain};
        return 301 https://\$server_name\$request_uri;
    }
    EOT
    fi
    
    # 检查nginx配置
    if ! nginx -t; then
        echo "Nginx配置检查失败,移除配置文件"
        rm -f /etc/nginx/vhost/${new_domain}.conf
        sed -i "\|^${new_domain}$|d" /etc/letsencrypt/domains.txt
        exit 1
    fi
    
    # 重新加载nginx配置
    nginx -s reload
    
    echo "域名 ${new_domain} 配置完成"
    
    
  3. deploy-certbot.sh
    该脚本读取 /etc/letsencrypt/domains.txt 里的域名,通过 DNS-01 方式批量申请或更新证书。

    #!/bin/bash
    
    # 检查aliyun配置文件
    if [ ! -f "/etc/letsencrypt/aliyun.ini" ]; then
        echo "错误: 未找到阿里云DNS凭证文件"
        exit 1
    fi
    
    # 检查domains.txt是否存在且不为空
    if [ ! -s "/etc/letsencrypt/domains.txt" ]; then
        echo "警告: domains.txt为空或不存在"
        exit 0
    fi
    
    # 设置默认值
    : ${DNS_PROPAGATION_SECONDS:="60"}
    : ${CERTBOT_EMAIL:="admin@example.com"}
    
    # 处理每个域名
    while IFS= read -r domain || [ -n "$domain" ]; do
        # 跳过空行和注释
        [[ -z "$domain" || "${domain:0:1}" == "#" ]] && continue
        
        echo "正在处理域名: $domain"
        certbot certonly \
            --authenticator dns-aliyun \
            --dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
            --dns-aliyun-propagation-seconds "$DNS_PROPAGATION_SECONDS" \
            --non-interactive \
            --agree-tos \
            --email "$CERTBOT_EMAIL" \
            -d "$domain" \
            --expand \
            --keep-until-expiring \
            --preferred-challenges dns-01 \
            --config-dir /etc/letsencrypt \
            --logs-dir /var/log/certbot \
            --work-dir /var/lib/certbot
    
        if [ $? -eq 0 ]; then
            echo "成功为 $domain 获取/更新证书"
        else
            echo "为 $domain 获取/更新证书失败"
            # 如果获取证书失败,则退出脚本
            exit 1
        fi
    done < "/etc/letsencrypt/domains.txt"
    
    # 检查nginx配置并重新加载
    nginx -t && nginx -s reload
    
    
  4. start.sh
    容器启动时自动执行的脚本:

    #!/bin/bash
    
    # 检查必要的环境变量
    if [ -z "$ALIYUN_ACCESS_KEY_ID" ] || [ -z "$ALIYUN_ACCESS_KEY_SECRET" ]; then
        echo "错误: 未设置阿里云访问密钥环境变量"
        exit 1
    fi
    
    # 创建 Aliyun 配置文件
    mkdir -p /etc/letsencrypt
    cat <<EOT > /etc/letsencrypt/aliyun.ini
    dns_aliyun_access_key = $ALIYUN_ACCESS_KEY_ID
    dns_aliyun_access_key_secret = $ALIYUN_ACCESS_KEY_SECRET
    EOT
    
    # 设置严格的权限
    chmod 600 /etc/letsencrypt/aliyun.ini
    
    # 设置默认值
    : ${RENEW_CRON_SCHEDULE:="0 0 1 * *"}
    : ${CERTBOT_EMAIL:="admin@example.com"}
    : ${DNS_PROPAGATION_SECONDS:="60"}
    
    # 确保domains.txt存在
    touch /etc/letsencrypt/domains.txt
    
    # 初始获取或更新 SSL 证书
    /usr/local/bin/deploy-certbot.sh
    
    # 配置证书自动续期
    echo "$RENEW_CRON_SCHEDULE /usr/local/bin/deploy-certbot.sh >> /var/log/certbot/renew.log 2>&1" > /etc/cron.d/certbot-renew
    chmod 0644 /etc/cron.d/certbot-renew
    
    # 创建日志目录
    mkdir -p /var/log/certbot
    touch /var/log/certbot/renew.log
    
    # 启动 cron 服务
    service cron start
    
    # 启动 nginx
    exec nginx -g "daemon off;"
    
  5. /etc/nginx/

    • nginx.conf:Nginx 的主配置文件

      	
      #=============================================start 全局块==================================================================
       #运行用户
      #user  nobody;
      #worker进程数量,通常设置为cpu核数相等
      worker_processes  4;
      
      #全局错误文件
      #error_log  logs/error.log;
      #error_log  logs/error.log  notice;
      #error_log  logs/error.log  info;
      #pid位置
      #pid        logs/nginx.pid;
      #=============================================end 全局块=====================================================================
      
      
      #=============================================start events块================================================================
      events {
          # 单个worker进程最大并发连接数
          worker_connections  1024;
      }
      #=============================================end events块==================================================================
      
      
      #=============================================start http块==================================================================
      
      http {
          #引入mime类型的定义文件
          include       mime.types;
          default_type  application/octet-stream;
      
          #设置日志格式
          #log_format  main  ' -  [] "" '
          #                  '  "" '
          #                  '"" ""';
      
          #access_log  logs/access.log  main;
      
          sendfile        on;
          #tcp_nopush     on;
      
          #连接超时时间
          #keepalive_timeout  0;
          keepalive_timeout  65;
      
          #开启gzip压缩
          #gzip  on;
          
          #上传大小限制
          client_max_body_size 512m;
          
          #自定义变量 $connection_upgrade
          map $http_upgrade $connection_upgrade {
              default          keep-alive;  #默认为keep-alive 可以支持 一般http请求
              'websocket'      upgrade;     #如果为websocket 则为 upgrade 可升级的。
           #default upgrade;
              #''      close;
          }
      
          #引入配置文件
          include  vhost/*.conf;
      }
      
      #=============================================end http块=================================================================
      
    • vhost 目录:根据域名生成的各子配置文件

  6. domains.txt

    • 存放所有需要申请证书的域名,每行一个。

五、运行容器

准备就绪后,可以执行以下命令来启动容器:

docker run -d \
  -p 80:80 \
  -p 443:443 \
  --name nginx-certbot \
  -e ALIYUN_ACCESS_KEY_ID=<你的阿里云AccessKeyId> \
  -e ALIYUN_ACCESS_KEY_SECRET=<你的阿里云AccessKeySecret> \
  -e CERTBOT_EMAIL=<你的邮箱> \
  -e RENEW_CRON_SCHEDULE="0 0 1 * *" \
  -v /data/nginx-certbot/certs:/etc/letsencrypt \
  -v /data/nginx-certbot/log-certbot:/var/log/certbot \
  -v /data/nginx-certbot/log:/var/log/nginx \
  -v /data/nginx-certbot/conf:/etc/nginx \
  -v /data/nginx-certbot/html:/usr/share/nginx/html \
  registry.cn-hangzhou.aliyuncs.com/hbteck/nginx-certbot:1.20.2

参数说明:

  1. -p 80:80 和 -p 443:443:将宿主机的 80/443 端口映射给容器,用于 HTTP/HTTPS。
  2. -e ALIYUN_ACCESS_KEY_ID / ALIYUN_ACCESS_KEY_SECRET:阿里云 DNS 插件需要的密钥。
  3. -e CERTBOT_EMAIL:用于跟证书签发相关的提示信息接收。
  4. -e RENEW_CRON_SCHEDULE:设置证书自动续期的 cron 表达式(默认为每月1日00:00 点执行 certbot renew)。
  5. -v /data/nginx-certbot/conf:/etc/nginx:持久化 Nginx 配置文件,方便宿主机直接修改。
  6. -v /data/nginx-certbot/certs:/etc/letsencrypt:持久化证书文件,让重启或更新不会丢失证书。
  7. 其他挂载可根据自身需求调整。

成功运行后,容器会自动加载已有 Nginx 配置并尝试运行部署脚本(如果 domains.txt 里已有域名)。


六、添加域名及证书

当容器正常运行后,通过以下命令添加新域名并生成对应的 HTTPS 配置:

docker exec nginx-certbot /usr/local/bin/add-domain.sh <domain> [backend_url] [local_ip]

示例:

docker exec nginx-certbot /usr/local/bin/add-domain.sh hbteck.com \
  http://172.19.160.13:17111/ 172.19.160.13
  • :必填,目标域名。
  • [backend_url]:可选,域名后端服务的转发地址,默认 http://localhost:8080。
  • [local_ip]:可选,用于特定场景自动生成更多配置规则。

该脚本会完成以下操作:

  1. 将新域名写入 /etc/letsencrypt/domains.txt。
  2. 调用 /usr/local/bin/deploy-certbot.sh 进行 DNS-01 方式的证书申请。
  3. 成功后在 /etc/nginx/vhost/ 下写入对应的 vhost 配置文件,再重载 Nginx。

如果一切正常,可以在浏览器访问 https://hbteck.com 测试效果。


七、查看与管理证书

  1. 查看证书详情:

    docker exec nginx-certbot certbot certificates
    

    如果成功,会列出每个域名证书所在路径及过期时间。

  2. 手动重载 Nginx 配置:

    docker exec -it nginx-certbot /usr/sbin/nginx -s reload
    
  3. 手动执行续期:

    docker exec -it nginx-certbot certbot renew --deploy-hook 'nginx -s reload'
    

    一般不需要手动运行,脚本中已经配置了 cron 任务每天检查并每月1日00:00自动续期。


八、常见问题及解决方案

  1. 申请证书失败:

    • 请确认域名的 DNS 解析在阿里云上,并且 AccessKey 拥有 AliyunDNSFullAccess 权限。
    • 检查是不是填写了错误的 Access Key 信息。
    • 域名是否在 /etc/letsencrypt/domains.txt 中已存在,如果有问题可删除后重试。
  2. 80 和 443 端口冲突:

    • 如果宿主机已占用 80/443 端口,可修改映射端口,如 -p 8080:80 -p 8443:443,但需要相应修改 nginx.conf。
  3. 自定义 Nginx 配置:

    • 直接修改宿主机 /data/nginx-certbot/conf/nginx.conf 或 vhost/文件,完成后执行 docker exec nginx-certbot nginx -s reload。
  4. 脚本执行权限:

    • 如果提示权限不足,可在宿主机手动 chmod +x /data/nginx-certbot/conf/*.sh 等路径,或在 Dockerfile 中确保脚本均可执行。

九、总结

通过在 Docker 中整合 Nginx + Certbot + 阿里云 DNS 插件,我们可以轻松实现多域名自动化申请及续期 SSL 证书的流程。该方案具有以下优点:

  • DNS-01 验证方式无需对外暴露除 80/443 以外的端口,也不影响原有服务。
  • 对多域名、多环境非常灵活,可以快速添加新域名。
  • 证书续期完全自动化,无需人工干预。

只要按照上述步骤,下载配置,将 Access Key 写入环境变量,启动容器并执行 add-domain.sh 脚本,即可轻松接入新的 HTTPS 域名。祝你在实际生产环境中使用顺利,助力网站与应用更安全、稳定地运行!

使用Docker创建Let‘s Encrypt SSL证书 如果你的网站还在非https下裸奔,那你肯定out了,过去SSL证书价格昂贵,但今天我们很幸运Let‘s Encrypt为我们提供了免费的证书服务,本文主要介绍如何利用docker-compose运行certbot免污染主机环境的申请SSL证书、Nginx下证书的安装以及证书更新。 阅读详情

相关推荐

Nginx+Docker用户必看:Certbot证书自动同步到容器的3种方案

本文针对Nginx+Docker环境中Certbot自动续签的SSL证书无法同步至容器的问题,深入剖析了容器隔离性与证书生命周期的核心矛盾,并详细对比了三种主流解决方案:Volume挂载、容器内安装Certbot以及主机脚本同步。文章结合docker-compose配置与可复用脚本,为不同复杂度的生产环境提供了清晰的选型建议与实施指南,确保HTTPS服务在证书更新后无缝切换。

weixin_29279101的博客 495

Docker 容器中运行Certbot获取和管理 SSL 证书

如果你在 Docker 容器中运行 Nginx 并希望使用 Certbot 获取和管理 SSL 证书,可以使用 Certbot 的官方 Docker 镜像来完成这项工作。

别忘了微笑 3159

免费SSL证书自动化部署指南:Let‘s Encrypt与Certbot实战

SSL/TLS证书是保障网站数据传输安全的核心技术,它通过非对称加密和数字签名建立可信的加密通道。其工作原理基于公钥基础设施(PKI),由受信任的证书颁发机构(CA)验证域名所有权后签发。免费SSL证书的价值在于大幅降低了HTTPS部署门槛,尤其适用于个人博客、小型项目及初创公司。通过自动化工具如Certbot,结合Let's Encrypt的ACME协议,可以实现证书的自动申请、部署与续期,构建可持续的零成本安全方案。本文以Nginx为例,详细解析了从环境准备、证书申请到自动化续期的完整流程,并针对多域名

weixin_34008805的博客 491

使用docker+nginx+certbot获取和更新免费的ssl证书

docker+nginx+certbot获取和更新免费的ssl证书

wyhhQAQ的博客 3044

Ubuntu下用Certbot Standalone模式获取Let‘s Encrypt SSL证书

SSL证书是HTTPS安全通信的基础,其自动化管理依赖ACME协议与客户端工具协同实现。Certbot作为主流ACME客户端,在Ubuntu系统中通过Standalone模式提供了一种不侵入Web服务器配置、零修改业务环境的证书获取机制。该模式本质是临时启动轻量HTTP服务响应http-01挑战,具备高隔离性与强可脚本化特性,特别适用于Docker微服务、CI/CD流水线及无Nginx/Apache的轻量API场景。结合Ubuntu原生systemd、AppArmor与UFW支持,Standalone模式在

weixin_33739646的博客 415

Nginx多域名配置与SSL证书管理实战指南

反向代理是现代Web架构的核心组件,Nginx作为高性能的HTTP服务器,通过Server Block机制实现多域名托管。其工作原理基于配置继承体系,主配置文件的http块参数会被所有server块继承。这种架构在资源共享、运维简化和成本优化方面具有显著优势,特别适合企业官网与后台系统共存、多语言站点部署等场景。SSL/TLS证书配置是保障HTTPS安全的关键环节,通过规范的证书存放目录结构和权限设置,配合安全加固措施如OCSP装订、会话复用等,能有效提升服务性能与安全性。本文以Nginx多证书配置为例,详

weixin_32247165的博客 291

nginx-certbot完全解析:如何用Docker自动化SSL证书管理

nginx-certbot是一个基于Docker Compose的解决方案,能够帮助开发者快速搭建带有Let's Encrypt SSL证书的Nginx服务器环境。它通过自动化流程处理证书的申请、配置和续期,让普通用户也能轻松实现网站的HTTPS加密访问。 ## 为什么选择nginx-certbot? 在当今的网络环境中,网站启用HTTPS已经成为基本要求。然而,SSL证书的申请、配置和定期续

gitblog_00424的博客 666

Certbot自动续期Let‘s Encrypt证书:Nginx配置避坑指南(CentOS8实战)

本文详细介绍了在CentOS 8系统上,使用Certbot为Nginx配置Let's Encrypt SSL证书并实现自动续期的实战指南。文章重点解析了HTTP与DNS两种验证方式的适用场景与配置要点,提供了Nginx深度集成、SSL参数优化及常见配置陷阱的解决方案,并指导如何通过Cron任务与监控脚本构建可靠的自动化续期体系,确保HTTPS服务长期稳定运行。

weixin_29261711的博客 417

【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书

Certbot 是一个免费的开源工具,用于自动化管理和获取 SSL/TLS 证书,主要用于与 Let’s Encrypt 证书颁发机构交互。

HEX9CF的技术博客 876

Nginx配置SSL证书链不完整?手把手教你修复Python requests报错CERTIFICATE_VERIFY_FAILED

本文详细解析了Nginx配置SSL证书链不完整导致的Python requests报错`CERTIFICATE_VERIFY_FAILED`问题,提供了从诊断到修复的完整方案。通过OpenSSL命令行验证、Python代码检测及SSL Labs在线工具,帮助开发者快速定位证书链问题,并给出Nginx配置最佳实践和Python端的兼容性解决方案,确保HTTPS通信安全可靠。

weixin_29325515的博客 173

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 364

nginx-certbot高级配置技巧:自定义域名与多站点管理终极指南

在Docker环境中快速搭建Nginx反向代理并自动获取Let's Encrypt SSL证书,nginx-certbot是开发者的最佳选择!这个强大的工具让HTTPS配置变得简单高效,支持自定义域名和多站点管理,为您的Web应用提供专业级的安全保障。🚀 ## 为什么选择nginx-certbot进行SSL证书管理? nginx-certbot是一个基于Docker Compose的样板配置

gitblog_01052的博客 427

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 435

申请Let‘s Encrypt永久免费SSL证书

Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。 Let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let's Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览

明阳 2万+

8卡H20运行DeepSeek-V3-0324性能和推理实测

最近在一台 8卡H20 机器上,先后部署了 DeepSeek-R1-AWQ (671B)和最新的 DeepSeek-V3-0324 (685B) ,测试了下性能和数学问题跑分。服务器由火山引擎提供。

weixin_53138109的博客 3349

Python实战:ERA5风场数据区域提取与风向合成可视化全流程解析

本文详细解析了使用Python处理ERA5风场数据的完整流程,包括NC文件读取、特定区域数据提取、u/v分量合成风向风速的计算,以及利用Matplotlib进行风场时空演变可视化。内容涵盖从环境搭建、数据获取到高级绘图与性能优化的实战经验,为气象数据分析、风能评估及气候研究提供了一套清晰、可操作的技术指南。

swift5iosmith的博客 296

证书机器人

certbot/certbot: Certbot is EFF's tool to obtain certs from Let's Encrypt and (optionally) auto-enable HTTPS on your server. It can also act as a client for any other CA that uses the ACME protocol. (github.com)https://github.com/certbot/certbot 获取 Certb.

学长的猫的博客 4264

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2496

Certbot自动化SSL证书管理:从原理到Nginx实战部署

SSL/TLS证书是实现HTTPS加密通信的基础,它通过在客户端与服务器之间建立加密通道,保障数据传输的机密性与完整性。其核心原理基于非对称加密与CA(证书颁发机构)信任链,确保通信双方身份可信。自动化证书管理技术解决了传统手动申请、部署与续期带来的运维负担,大幅降低了HTTPS的部署门槛与维护成本。该技术广泛应用于Web服务、API接口、微服务架构等场景,是现代互联网安全架构的基石。以Certbot为代表的工具,通过集成ACME协议与自动化验证机制,实现了证书生命周期的全托管。本文将以Nginx服务器为例

weixin_29323365的博客 282

3.2 直流无刷电机(BLDC):状态空间模型与传递函数

状态空间模型和传递函数是分析BLDC电机动态特性的重要工具。状态空间模型通过微分方程描述系统内部状态与输入输出关系,适用于多变量系统分析;传递函数则在频域表征系统特性,便于控制器设计。本文详细推导了三相坐标系和dq坐标系下的BLDC电机状态空间模型,讨论了线性化方法,并介绍了从状态空间模型到传递函数的转换过程。这些模型为BLDC电机的控制系统设计提供了理论基础。

技术工作者 230

OpenDataLab 大模型训练数据集下载记录

大模型 训练数据集

u013558123的博客 3330

LinuxServer Docker Let‘s Encrypt 常见问题解决方案

LinuxServer Docker Let's Encrypt 是一个开源项目,旨在通过Docker容器简化Let's Encrypt证书的申请和自动续期过程。该项目提供了一个基于Nginx的Web服务器和反向代理,支持PHP,并内置了Certbot客户端来自动化SSL证书的生成和更新。主要编程语言为Shell脚本,用于编写Dockerfile和自动化流程。 ## 2. 新手常见问题及解决步骤

gitblog_00805的博客 507

网口通信实战(C#完整版):基于TCP协议的工业仪表数据采集系统开发

工业现场中80%的智能仪表(压力/温度/液位/流量/数显仪表)、采集模块、测控终端均支持TCP网口通信,这类设备的TCP通信有鲜明的工业特性:基于字节流的自定义二进制协议、一问一答的主从通信模式、对数据完整性/稳定性要求极高。本次实战是纯工业级落地项目,基于C# WinForm + .NET Framework 4.8(工业上位机标配)✅纯原生无依赖:零第三方类库/控件,仅用C#原生,源码可100%复用、无引用冲突、工控机完美兼容;✅双采集模式完美适配:同时实现「单次手动采集」+「连续自动采集」

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1796

nginx-certbot性能优化终极指南:提升SSL证书管理的效率与稳定性

nginx-certbot是一个基于Docker Compose的自动化SSL证书管理解决方案,专为需要快速部署HTTPS服务的开发者设计。这个工具集成了nginx反向代理和Let's Encrypt的Certbot,提供了一键式的SSL证书获取和自动续期功能。通过精心设计的配置文件和脚本,nginx-certbot大大简化了HTTPS部署的复杂性,让开发者能够专注于核心业务开发而不是SSL证书管

gitblog_00274的博客 402

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

推荐使用SWAG:一站式安全Web服务器与网关解决方案

SWAG,全称Secure Web-server And Gateway,是由LinuxServer.io团队开发的一款开源项目。它提供了一个集成的Nginx Web服务器和反向代理,支持PHP,并内置了一个Certbot客户端,能够自动化生成和更新免费的SSL服务器证书。此外,SWAG还包含了fail2ban,用于入侵防御。 ## 项目技术分析 SWAG项目基于Docker容器技术,支持多种

gitblog_00807的博客 3579

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Debian 12.0 + Nginx + Let’s Encrypt:5分钟搞定HTTPS配置(含自动续期)

本文详细介绍了在Debian 12系统上使用Nginx和Let's Encrypt快速配置HTTPS的完整流程,包括证书申请、自动化续期、安全强化和性能调优。通过Certbot工具,开发者可以在5分钟内实现零成本、全自动的SSL/TLS证书部署,确保网站安全并提升SEO排名。

weixin_30872157的博客 384

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【AI】使用Cursor和AI编程生成的VUE前端框架
下一篇: 【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南
清欢渡hb
博客等级 码龄11年 66粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值