如何在Ubuntu16.04+Apache2.4.29的不同虚拟主机同时运行php7.0-fpm与php5.6-fpm?
没问题,我帮你搞定这个不同虚拟主机对应不同PHP版本的需求,Ubuntu 16.04下这套流程我折腾过好几次,稳得很。咱们一步步来:
Ubuntu 16.04的默认软件源里没有PHP 5.6,得先添加第三方PPA源,推荐用Ondřej Surý的源——这是PHP官方维护者的源,靠谱得很:
- 先安装软件源管理工具(如果没装的话):
apt install software-properties-common - 添加PHP PPA源:
add-apt-repository ppa:ondrej/php - 更新软件源缓存:
apt update - 安装PHP 5.6-FPM:
apt install php5.6-fpm
安装完成后,检查服务是否正常运行:
systemctl status php5.6-fpm
看到active (running)就说明没问题了。
你之前已经配置过Apache的HTTP/2和PHP 7.0-FPM,现在只需要给旧站点的虚拟主机单独设置PHP 5.6的FastCGI代理即可。
先确认Apache已启用必要模块
确保proxy_fcgi和setenvif模块已经启用(之前配置PHP 7.0时应该已经开了,但再确认下):
a2enmod proxy_fcgi setenvif systemctl restart apache2
修改旧站点的虚拟主机配置
找到你旧站点的虚拟主机配置文件,比如/etc/apache2/sites-available/old-site.conf,编辑它:
nano /etc/apache2/sites-available/old-site.conf
在<VirtualHost *:443>(因为你用了HTTP/2,肯定是HTTPS)块里,添加以下配置,替换掉原来的PHP 7.0相关配置:
# 启用HTTP/2(如果你之前没加的话,确保加上) Protocols h2 http/1.1 # 配置PHP 5.6-FPM代理 <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost/" </FilesMatch> # 修复HTTP_AUTHORIZATION变量丢失的问题 SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
而你的新站点(用PHP 7.0的)的虚拟主机配置里,保持原来的PHP 7.0-FPM配置即可:
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/" </FilesMatch>
测试并重启Apache
配置完后,先检查配置文件有没有语法错误:
apache2ctl configtest
如果输出Syntax OK,就重启Apache生效:
systemctl restart apache2
分别在旧站点和新站点的根目录下创建一个phpinfo.php文件,内容如下:
<?php phpinfo(); ?>
访问旧站点的http(s)://你的旧域名/phpinfo.php,查看页面顶部的PHP Version,应该显示5.6.x;访问新站点的对应页面,应该显示7.0.x。如果都正常,就说明配置成功了。
- 权限问题:确保PHP-FPM的运行用户(默认是
www-data)对两个站点的文件目录有读写权限,避免出现权限错误。 - 扩展需求:如果旧站点需要PHP 5.6的特定扩展,可以用
apt install php5.6-xxx来安装,比如php5.6-mysql、php5.6-gd等。 - 清理无用配置:如果之前尝试配置PHP 5.6时加了一些无效的配置,记得删掉,避免冲突。
内容的提问来源于stack exchange,提问作者peppy

