如何在RHEL 8的Apache环境下同时运行多版本PHP?
解决RHEL 8 Apache环境下PHP 8.1与8.2并行运行问题
一、修复安装冲突:改用Remi并行安装包
DNF模块无法同时启用多个PHP版本,这是安装冲突的核心原因。需卸载现有模块安装的PHP,改用Remi仓库的并行安装包:
- 卸载已安装的PHP模块:
sudo dnf module remove php:8.1 php:8.2 sudo dnf reset php - 安装并启用Remi仓库(未安装时执行):
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y sudo dnf config-manager --set-enabled remi - 并行安装PHP 8.1和8.2的FPM及常用扩展:
这类包采用# 安装PHP 8.1 FPM及扩展 sudo dnf install php81-php-fpm php81-php-cli php81-php-mysqlnd php81-php-gd php81-php-xml -y # 安装PHP 8.2 FPM及扩展 sudo dnf install php82-php-fpm php82-php-cli php82-php-mysqlnd php82-php-gd php82-php-xml -yphpXX-php-*命名格式,各版本文件独立存储在/opt/remi/phpXX/目录,不会产生冲突。
二、配置Apache虚拟主机使用不同PHP版本
mod_php仅支持单版本运行,必须通过PHP-FPM配合Apache的proxy_fcgi模块实现多版本隔离:
- 启用Apache必需模块:
sudo dnf install httpd mod_proxy mod_proxy_fcgi -y sudo systemctl enable --now httpd - 配置并启动PHP-FPM服务:
- 确认两个版本的FPM监听套接字(默认路径如下,可通过配置文件验证):
cat /etc/opt/remi/php81/php-fpm.d/www.conf | grep listen cat /etc/opt/remi/php82/php-fpm.d/www.conf | grep listen - 启动并设置开机自启:
sudo systemctl enable --now php81-php-fpm sudo systemctl enable --now php82-php-fpm
- 确认两个版本的FPM监听套接字(默认路径如下,可通过配置文件验证):
- 创建虚拟主机配置文件:
- PHP 8.1站点配置(
/etc/httpd/conf.d/php81-site.conf):<VirtualHost *:80> ServerName php81.example.com DocumentRoot /var/www/php81-site <Directory /var/www/php81-site> AllowOverride All Require all granted </Directory> # 将PHP请求转发至PHP 8.1 FPM <FilesMatch \.php$> SetHandler "proxy:unix:/run/php81-php-fpm.sock|fcgi://localhost" </FilesMatch> ErrorLog /var/log/httpd/php81-site-error.log CustomLog /var/log/httpd/php81-site-access.log combined </VirtualHost> - PHP 8.2站点配置(
/etc/httpd/conf.d/php82-site.conf):<VirtualHost *:80> ServerName php82.example.com DocumentRoot /var/www/php82-site <Directory /var/www/php82-site> AllowOverride All Require all granted </Directory> # 将PHP请求转发至PHP 8.2 FPM <FilesMatch \.php$> SetHandler "proxy:unix:/run/php82-php-fpm.sock|fcgi://localhost" </FilesMatch> ErrorLog /var/log/httpd/php82-site-error.log CustomLog /var/log/httpd/php82-site-access.log combined </VirtualHost>
- PHP 8.1站点配置(
- 创建站点目录并生成测试文件:
# PHP 8.1站点 sudo mkdir -p /var/www/php81-site echo "<?php phpinfo(); ?>" | sudo tee /var/www/php81-site/info.php sudo chown -R apache:apache /var/www/php81-site # PHP 8.2站点 sudo mkdir -p /var/www/php82-site echo "<?php phpinfo(); ?>" | sudo tee /var/www/php82-site/info.php sudo chown -R apache:apache /var/www/php82-site - 重启Apache使配置生效:
sudo systemctl restart httpd
三、独立管理CLI版本(与Apache互不干扰)
并行安装的PHP CLI版本分别位于/opt/remi/php81/bin/php和/opt/remi/php82/bin/php,可通过以下方式管理:
- 使用alternatives设置默认CLI版本(可选):
sudo alternatives --install /usr/bin/php php /opt/remi/php81/bin/php 1 sudo alternatives --install /usr/bin/php php /opt/remi/php82/bin/php 2 # 切换默认版本 sudo alternatives --config php - 直接使用绝对路径调用指定版本:
# 调用PHP 8.1 CLI /opt/remi/php81/bin/php script.php # 调用PHP 8.2 CLI /opt/remi/php82/bin/php script.php - 为常用版本创建别名(可选,编辑
~/.bashrc或~/.zshrc):
执行alias php81='/opt/remi/php81/bin/php' alias php82='/opt/remi/php82/bin/php'source ~/.bashrc使别名生效。
四、最佳实践
- 禁用mod_php:mod_php会将PHP嵌入Apache进程,仅支持单版本,多版本场景必须使用PHP-FPM。
- 定期更新:通过
dnf update更新PHP包时,并行安装的版本会各自独立更新,互不影响。 - 权限检查:确保PHP-FPM运行用户(默认
apache)对站点目录拥有读写权限,避免文件访问错误。 - 日志排查:若虚拟主机无法解析PHP,优先检查Apache错误日志(
/var/log/httpd/目录下对应文件)和PHP-FPM日志(/var/log/opt/remi/phpXX/php-fpm/目录)。
内容的提问来源于stack exchange,提问作者Root
相关产品推荐
相关产品推荐

