配置多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
相关产品推荐
相关产品推荐

