Docker-Compose配置Apache+SSL+PHP+MySQL遇SSL证书识别故障求助
Apache SSL证书无法识别问题排查与修复(Docker环境)
问题概述
Docker-Compose部署的Apache+PHP+MySQL环境中,PHP功能正常,但Apache无法识别SSL证书,HTTPS服务无法正常运行,使用macOS Sonoma系统。
核心问题分析
- 构建阶段重启Apache无效:Dockerfile中
RUN service apache2 restart在镜像构建阶段执行,不会影响容器运行时的服务状态,容器启动时使用apache2-foreground命令会重新加载配置,该命令完全多余。 - 证书权限配置缺失:容器内Apache运行用户(
www-data)需要具备证书文件的读取权限,尤其是私钥文件需要严格的600权限,否则Apache无法加载。 - SSL模块重复加载与路径错误:servername.conf中手动添加
LoadModule语句,但a2enmod ssl已经自动配置了模块加载,手动指定的模块路径可能与Debian系Apache的实际路径不匹配,导致加载异常。 - SSL会话缓存路径错误:全局配置中
SSLSessionCache指定的/var/run/httpd/ssl_scache是RHEL系Apache的路径,Debian系(php:7.4-apache基于Debian)的运行目录为/var/run/apache2,路径不匹配会导致缓存初始化失败。 - 端口暴露不完整:Dockerfile仅暴露了80端口,未声明443端口,虽然docker-compose做了端口映射,但容器内明确暴露端口有助于配置清晰性。
修复步骤
1. 修正Dockerfile
FROM php:7.4-apache RUN cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime RUN docker-php-ext-install pdo pdo_mysql bcmath RUN apt-get update && apt-get install -y \ libmagickwand-dev \ && rm -rf /var/lib/apt/lists/* RUN pecl install imagick RUN docker-php-ext-enable imagick RUN pecl install redis RUN docker-php-ext-enable redis RUN echo "session.save_handler = redis" >> /usr/local/etc/php/php.ini RUN echo "session.save_path = tcp://redis:6379" >> /usr/local/etc/php/php.ini COPY ./custom_hosts /etc/hosts RUN mkdir -p /etc/apache2/ssl COPY ./ssl/localhost.crt /etc/apache2/ssl/localhost.crt COPY ./ssl/localhost.key /etc/apache2/ssl/localhost.key # 设置证书文件权限,确保Apache用户可读 RUN chown www-data:www-data /etc/apache2/ssl/localhost.crt /etc/apache2/ssl/localhost.key \ && chmod 600 /etc/apache2/ssl/localhost.key RUN a2enmod rewrite && a2enmod ssl # 移除无效的Apache重启命令 # RUN service apache2 restart # 同时暴露80和443端口 EXPOSE 80 443 WORKDIR /var/www/html
额外修正:Redis连接地址改为
tcp://redis:6379,因为Docker Compose服务名可作为DNS解析,localhost在容器内指向自身,无法连接到Redis服务。
2. 修正servername.conf
ServerName localhost DocumentRoot /var/www/html <Directory /var/www/html> Options Indexes FollowSymLinks Multiviews AllowOverride All Require all granted </Directory> # 移除手动加载模块的语句,a2enmod已自动配置 # LoadModule socache_shmcb_module /usr/lib/apache2/modules/mod_socache_shmcb.so # LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so Listen 443 # 使用更安全的现代CipherSuite SSLCipherSuite 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 SSLProxyCipherSuite 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 SSLHonorCipherOrder on SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLPassPhraseDialog builtin # 修正Debian系Apache的会话缓存路径 SSLSessionCache "shmcb:/var/run/apache2/ssl_scache(512000)" SSLSessionCacheTimeout 300 <VirtualHost *:443> ServerName localhost DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /etc/apache2/ssl/localhost.crt SSLCertificateKeyFile /etc/apache2/ssl/localhost.key <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> </VirtualHost>
优化说明:移除了过时的
Order allow,deny和Allow from all,统一使用Require all granted;升级了SSL协议版本,禁用不安全的TLSv1/TLSv1.1;移除VirtualHost内重复的CipherSuite配置,继承全局安全配置。
3. 调整docker-compose.yml(可选)
如果希望通过Dockerfile管理证书,可移除证书挂载项,避免本地文件覆盖容器内配置:
services: web: # ... 其他配置 ... volumes: - ./../:/var/www/html/ # 移除以下两行,证书已通过Dockerfile复制到容器内 # - ./ssl/localhost.crt:/etc/apache2/ssl/localhost.crt # - ./ssl/localhost.key:/etc/apache2/ssl/localhost.key - ./servername.conf:/etc/apache2/sites-enabled/servername.conf # ... 其他配置 ...
验证方法
- 重建Web服务镜像:
docker-compose build web
- 启动所有服务:
docker-compose up -d
- 查看Apache日志,确认无SSL相关错误:
docker-compose logs web
- 访问
https://localhost:8443,检查浏览器是否识别证书(macOS已信任证书,应显示安全连接)。
内容的提问来源于stack exchange,提问作者Claytinho
相关产品推荐
相关产品推荐

