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

配置多WordPress站点Docker-Compose文件时Certbot证书生成失败

多WordPress站点Docker部署:第二个Certbot容器无法生成SSL证书

当前环境

  • 1个MySQL 8.0.30数据库容器
  • 2个WordPress 6.0.2 + PHP7.4-FPM Alpine容器
  • 1个Nginx 1.23.1 Alpine容器
  • 2个Certbot容器(其中certbothc无法为hablamedecuba.com生成证书)

提供的docker-compose.yml配置

version: '3'

services:
  dbgb:
    image: mysql:8.0.30
    container_name: dbgb
    restart: unless-stopped
    env_file: .env
    environment:
      - MYSQL_ROOT_PASSWORD=Wordpress123
      - MYSQL_DATABASE=greatbytedb
      - MYSQL_USER=wordpressuser
      - MYSQL_PASSWORD=Wordpress321
    volumes:
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network

  wordpressgb:
    depends_on:
      - dbgb
    image: wordpress:6.0.2-php7.4-fpm-alpine
    container_name: wordpressgb
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=dbgb:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=greatbytedb
    volumes:
      - greatbyte:/var/www/html
    networks:
      - app-network

  wordpresshc:
    depends_on:
      - dbgb
    image: wordpress:6.0.2-php7.4-fpm-alpine
    container_name: wordpresshc
    restart: unless-stopped
    env_file: .env
    environment:
      - WORDPRESS_DB_HOST=dbgb:3306
      - WORDPRESS_DB_USER=$MYSQL_USER
      - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
      - WORDPRESS_DB_NAME=greatbytedb
    volumes:
      - hablamedecuba:/var/www/html/hablamedecuba
    networks:
      - app-network

  webservergb:
    depends_on:
      - wordpressgb
      - wordpresshc
    image: nginx:1.23.1-alpine
    container_name: webservergb
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - greatbyte:/var/www/html
      - hablamedecuba:/var/www/html/hablamedecuba
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - app-network
  
  certbotgb:
    depends_on:
      - webservergb
    image: certbot/certbot
    container_name: certbotgb
    volumes:
      - certbot-etc:/etc/letsencrypt
      - greatbyte:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email mariodamian1986@gmail.com --agree-tos --no-eff-email --force-renewal -d great-byte.com -d www.great-byte.com

  certbothc:
    depends_on:
      - webservergb
    image: certbot/certbot
    container_name: certbothc
    volumes:
      - certbot-etc:/etc/letsencrypt
      - hablamedecuba:/var/www/html/hablamedecuba
    command: certonly --webroot --webroot-path=/var/www/html/hablamedecuba --email mariodamian1986@gmail.com --agree-tos --no-eff-email --force-renewal -d hablamedecuba.com -d www.hablamedecuba.com

volumes:
  certbot-etc:
  greatbyte:
  hablamedecuba:
  dbdata:

networks:
  app-network:
    driver: bridge

问题诊断与解决步骤

1. 核心问题分析

第二个Certbot容器失败的主要原因是webroot验证失败:Let's Encrypt无法通过HTTP访问hablamedecuba.com/.well-known/acme-challenge/路径,无法完成域名所有权验证。诱因通常包括Nginx配置错误、路径挂载不匹配、目录权限不足。

2. 修正Nginx站点配置

确保./nginx-conf目录下的hablamedecuba.com.conf(对应配置文件)正确映射站点根目录,并包含Let's Encrypt验证规则:

server {
    listen 80;
    server_name hablamedecuba.com www.hablamedecuba.com;

    # 与Certbot的--webroot-path完全一致
    root /var/www/html/hablamedecuba;
    index index.php index.html index.htm;

    # 允许Let's Encrypt验证访问
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/html/hablamedecuba;
        allow all;
        try_files $uri =404;
    }

    # WordPress路由规则
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP-FPM转发配置,指向第二个WordPress容器名
    location ~ \.php$ {
        fastcgi_pass wordpresshc:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

3. 调整WordPress容器挂载路径

当前wordpresshc容器将卷挂载到/var/www/html/hablamedecuba,但WordPress官方镜像默认工作目录是/var/www/html,会导致站点文件路径混乱。修改为:

wordpresshc:
    # 其他配置不变
    volumes:
      - hablamedecuba:/var/www/html

Nginx容器的挂载配置保持不变(hablamedecuba:/var/www/html/hablamedecuba),确保Nginx能正确访问第二个站点文件。

4. 修复目录权限

Certbot需要写入.well-known/acme-challenge目录,执行以下命令设置正确权限:

# 给Nginx用户赋予站点目录权限
docker exec -it webservergb chown -R nginx:nginx /var/www/html/hablamedecuba
# 给Certbot用户赋予写入权限
docker exec -it certbothc chown -R www-data:www-data /var/www/html/hablamedecuba

5. 简化Certbot配置(可选但推荐)

无需使用两个Certbot容器,单个容器即可处理多个域名的证书申请,避免资源浪费和潜在冲突:
删除certbothc服务,修改certbotgb为:

certbotgb:
    depends_on:
      - webservergb
    image: certbot/certbot
    container_name: certbotgb
    volumes:
      - certbot-etc:/etc/letsencrypt
      - greatbyte:/var/www/html
      - hablamedecuba:/var/www/html/hablamedecuba
    command: certonly --webroot \
      --webroot-path=/var/www/html -d great-byte.com -d www.great-byte.com \
      --webroot-path=/var/www/html/hablamedecuba -d hablamedecuba.com -d www.hablamedecuba.com \
      --email mariodamian1986@gmail.com --agree-tos --no-eff-email --force-renewal

6. 重新部署验证

# 停止现有容器
docker-compose down
# 启动服务
docker-compose up -d
# 查看Certbot日志确认结果
docker logs certbotgb
# 查看Nginx日志排查访问问题(如果仍失败)
docker logs webservergb

内容的提问来源于stack exchange,提问作者Mario Damin Gonzlez Posada Fru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:15:47