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

在DDEV Web容器中并行运行多版本PHP-FPM的问题

在DDEV中为Apache多虚拟主机配置不同PHP版本的解决方案

一、先排查你的配置失效原因

你当前操作后Apache仍用PHP7.4,大概率是这几个环节没做对:

  • 对应PHP版本的FPM服务没启动:DDEV默认只启动config.yaml指定版本的FPM,你需要手动启用并启动PHP8.0-FPM:
    systemctl enable --now php8.0-fpm
    
    用ps aux | grep php-fpm确认进程存在。
  • Apache虚拟主机没指定正确的FPM sock路径:全局的php-fpm.conf可能还是指向PHP7.4的sock,必须在每个虚拟主机配置里单独写FilesMatch规则,指定对应版本的sock:
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
    </FilesMatch>
    
  • FPM池配置的权限或路径冲突:检查/etc/php/8.0/fpm/pool.d/www.conf里的listen参数是不是/run/php/php8.0-fpm.sock,同时确保listen.mode = 0660,所属用户组是www-data,否则Apache没法访问这个sock文件。
  • 重启/重载顺序不对:先重启对应FPM服务,再重载Apache:
    systemctl restart php8.0-fpm && systemctl reload apache2
    

二、在DDEV中持久化配置的正确姿势

1. 自定义Apache虚拟主机配置

不用修改容器内的apache-site.conf,直接在项目的.ddev/apache/sites目录下创建每个虚拟主机的独立配置文件(比如site1.conf、site2.conf),分别指定不同的PHP-FPM sock:
示例PHP7.4的虚拟主机配置:

<VirtualHost *:80>
    ServerName site1.ddev.site
    DocumentRoot /var/www/html/site1
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ErrorLog ${APACHE_LOG_DIR}/site1-error.log
    CustomLog ${APACHE_LOG_DIR}/site1-access.log combined
</VirtualHost>

示例PHP8.0的虚拟主机配置:

<VirtualHost *:80>
    ServerName site2.ddev.site
    DocumentRoot /var/www/html/site2
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ErrorLog ${APACHE_LOG_DIR}/site2-error.log
    CustomLog ${APACHE_LOG_DIR}/site2-access.log combined
</VirtualHost>

DDEV会自动加载这个目录下的配置,无需手动操作容器内文件。

2. 让多版本FPM自动启动

不要在Dockerfile里启动服务(构建阶段的启动命令在容器运行时会失效),用DDEV的hooks或者自定义命令来实现:

  • 方法一:在.ddev/config.yaml里加启动hook,容器启动时自动执行:
    hooks:
      post-start:
        - exec-web: "systemctl enable --now php7.4-fpm php8.0-fpm && systemctl reload apache2"
    
  • 方法二:创建自定义web命令,手动触发(可选):
    在.ddev/commands/web/start-multiphp里写:
    #!/bin/bash
    set -e
    systemctl enable --now php7.4-fpm php8.0-fpm
    systemctl reload apache2
    
    然后给脚本加执行权限:chmod +x .ddev/commands/web/start-multiphp,之后可以用ddev start-multiphp执行。

3. Dockerfile的正确用法(仅做镜像层面的预配置)

如果需要预先修改FPM池配置这类镜像级别的操作,可以在.ddev/web-build/Dockerfile里写:

# 复制自定义的PHP8.0 FPM池配置到镜像
COPY ./www-8.0.conf /etc/php/8.0/fpm/pool.d/www.conf
# 确保sock目录权限正确
RUN mkdir -p /run/php && chown www-data:www-data /run/php

注意:Dockerfile里不要写systemctl start之类的命令,这类操作必须放在容器启动阶段执行。

三、验证配置

启动DDEV后,分别在每个虚拟主机的根目录创建phpinfo.php,访问后查看PHP Version字段,确认版本是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:18:19