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

Docker-Compose配置Apache+SSL+PHP+MySQL遇SSL证书识别故障求助

Apache SSL证书无法识别问题排查与修复(Docker环境)

问题概述

Docker-Compose部署的Apache+PHP+MySQL环境中,PHP功能正常,但Apache无法识别SSL证书,HTTPS服务无法正常运行,使用macOS Sonoma系统。

核心问题分析

  1. 构建阶段重启Apache无效:Dockerfile中RUN service apache2 restart在镜像构建阶段执行,不会影响容器运行时的服务状态,容器启动时使用apache2-foreground命令会重新加载配置,该命令完全多余。
  2. 证书权限配置缺失:容器内Apache运行用户(www-data)需要具备证书文件的读取权限,尤其是私钥文件需要严格的600权限,否则Apache无法加载。
  3. SSL模块重复加载与路径错误:servername.conf中手动添加LoadModule语句,但a2enmod ssl已经自动配置了模块加载,手动指定的模块路径可能与Debian系Apache的实际路径不匹配,导致加载异常。
  4. SSL会话缓存路径错误:全局配置中SSLSessionCache指定的/var/run/httpd/ssl_scache是RHEL系Apache的路径,Debian系(php:7.4-apache基于Debian)的运行目录为/var/run/apache2,路径不匹配会导致缓存初始化失败。
  5. 端口暴露不完整: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
    # ... 其他配置 ...

验证方法

  1. 重建Web服务镜像:
docker-compose build web
  1. 启动所有服务:
docker-compose up -d
  1. 查看Apache日志,确认无SSL相关错误:
docker-compose logs web
  1. 访问https://localhost:8443,检查浏览器是否识别证书(macOS已信任证书,应显示安全连接)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:13:13