You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Compose部署Nginx与Certbot时遇插件初始化错误

解决Docker Compose中Certbot Nginx插件缺失的问题

问题原因

官方certbot/certbot基础镜像默认未包含Nginx插件,导致执行certbot renew时提示插件未安装;同时,即使安装插件,Certbot容器也无法直接操作Nginx容器内的配置文件,这是容器隔离性导致的。

解决方案(推荐Webroot验证模式)

Webroot模式无需依赖Nginx插件,通过在Nginx中配置ACME验证路由即可完成证书续期,更适合容器环境。

1. 修改Nginx配置

在你的Nginx配置文件(./config/nginx/default.conf)中添加ACME验证的路由规则:

server {
    listen 80;
    server_name your-domain.com; # 替换为你的实际域名

    # ACME挑战验证路由
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    # 其他业务配置...
}

2. 更新Docker Compose配置

调整docker-compose.yml,给Nginx容器添加webroot目录挂载,并修改Certbot的续期命令为webroot模式:

version: "3"

services:
  nginx_server:
    image: nginx:1.23.2
    container_name: nginx_server
    restart: always
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./server/:/var/www/server
      - ./config/nginx:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/certbot:/var/www/certbot # 新增:挂载webroot目录,让Nginx能访问验证文件
    links:
      - server_server

  certbot_server:
    container_name: certbot_server
    # 修改entrypoint为webroot模式的续期命令
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 24h & wait $${!}; done;'"
    image: certbot/certbot
    restart: on-failure
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/certbot:/var/www/certbot

备选方案:使用带Nginx插件的Certbot镜像

如果坚持使用Nginx插件,需改用预装插件的certbot/certbot:nginx镜像,并挂载Nginx配置目录:

version: "3"

services:
  nginx_server:
    image: nginx:1.23.2
    container_name: nginx_server
    restart: always
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./server/:/var/www/server
      - ./config/nginx:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt
    links:
      - server_server

  certbot_server:
    container_name: certbot_server
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --nginx; sleep 24h & wait $${!}; done;'"
    image: certbot/certbot:nginx # 使用带Nginx插件的镜像
    restart: on-failure
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/certbot:/var/www/certbot
      - ./config/nginx:/etc/nginx/conf.d # 挂载Nginx配置目录供插件读取
      # 可选:挂载docker.sock以在续期后重载Nginx配置
      # - /var/run/docker.sock:/var/run/docker.sock

注:挂载docker.sock存在安全风险,若需续期后自动重载Nginx,可在Certbot命令后添加--post-hook "docker exec nginx_server nginx -s reload"。

验证

执行以下命令测试续期是否正常:

docker-compose run certbot_server certbot renew --dry-run

内容的提问来源于stack exchange,提问作者Kirill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:42:38