在DDEV Web容器中并行运行多版本PHP-FPM的问题
在DDEV中为Apache多虚拟主机配置不同PHP版本的解决方案
一、先排查你的配置失效原因
你当前操作后Apache仍用PHP7.4,大概率是这几个环节没做对:
- 对应PHP版本的FPM服务没启动:DDEV默认只启动
config.yaml指定版本的FPM,你需要手动启用并启动PHP8.0-FPM:
用systemctl enable --now php8.0-fpmps 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 apache2chmod +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
相关产品推荐
相关产品推荐

