我有一个 Gentoo Linux Web 服务器,它使用 Apache 为一些基于 PHP 的 Web 应用程序提供服务。大多数应用程序将在最新版本的 PHP(即 7.2)上运行;然而,一个应用程序需要在非常旧的 PHP 版本(即 5.6)上运行。如何在同一个 Web 服务器上同时运行多个版本的 PHP?
- Gentoo(配置文件 17)。
- Web服务器是Apache 2.4。
- 需要运行 PHP 7.2 和 PHP 5.6。
- Apache 当前配置为通过 mod_php 提供 PHP 7.2 服务,但也安装了 PHP 5.6。
- Gentoo 配置为用于
eselect
更改 Apache/mod_php 使用的 PHP 版本。
答案1
这个答案是专门针对具有 Profile 17 的 Gentoo 的。它可能适用于一些正负版本。我用了Red Hat 的 PHP 配置技巧页面寻找灵感。同样的想法应该适用于其他 Linux 发行版(当然具体命令会有所不同)。
解决方案是使用PHP-FPM(FastCGI进程管理器)。每个版本的 PHP 都有自己的 PHP-FPM 服务,用于侦听套接字。 Apache 根据需要的 PHP 版本将 PHP 执行请求传递到特定的 PHP-FPM 服务。
您可以对 PHP 的一个版本使用 mod_php,对其他版本使用 PHP-FPM,但我决定完全放弃 mod_php。首先,我在某处读到,可以通过禁用 mod_php 来节省一些内存开销。其次,该解决方案看起来更干净一些,所有版本的 PHP 都以相同的方式处理。第三,从安全角度来看,安装最少数量/仅安装必要的软件总是更好。
更改您的
USE
标记以dev-lang/php
添加fpm
和删除apache2
。当前的 Gentoo 惯例是创建一个类似的文件
/etc/portage/package.use/php
并在此处指定USE
标志。如果您在文件中指定确切的版本,请确保您要使用的所有 PHP 版本都选择这些USE
标志。安装/重新安装您将要使用的 PHP 版本。
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
更改
APACHE2_MODULES
变量以构建proxy
和proxy_fcgi
Apache 模块。APACHE2_MODULES
您可以通过添加/更新中的变量来指定 Apache 模块使用的内容/etc/portage/make.conf
。与USE
标志一样,Gentoo 已经为您的配置文件设置了一些默认值。与标志不同USE
,您似乎需要通过$APACHE2_MODULES
在变量前面添加来明确告诉 Gentoo 以默认值开始:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- 重新安装阿帕奇。
# emerge -av apache
- 安装 PHP-FPM。
# emerge -av php-fpm
为您与 Apache 一起使用的每个 PHP 版本创建 PHP-FPM 启动脚本。
PHP-FPM 安装会创建一个启动脚本 ( ),允许您使用或更改脚本的文件名后缀(例如、等)
/etc/init.d/php-fpm
来选择要运行的 PHP 版本。由于我们只想在一次只想使用单个版本的 PHP 时使用,或者如果我们想使用不超过两个版本(其中一个为 mod_php,第二个为 PHP-FPM),因此我们将使用后缀方法。我们不想复制脚本,而是对其进行符号链接(有效后缀是来自例如、等的目录名称):eselect
php-fpm-php5.6
php-fpm-php7.2
eselect
ls -ld /usr/lib64/php*
php5.6
php7.2
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
更改 PHP-FPM 配置,以便每个 PHP 版本的服务在不同的端口上运行。
具体文件名因版本而异,但您希望在这些常规位置编辑每个 PHP 版本的配置文件:
/etc/php/fpm-php*/*.conf
以便listen
每个指令都有不同的端口。配置PHP-FPM服务启动。
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
编辑 Apache 启动配置以启用代理模块。
编辑
/etc/conf.d/apache2
以添加-D PROXY
和-D PHP
删除APACHE2_OPTS
。编辑 Apache 配置以将特定目录位置绑定到 PHP-FPM 的特定实例。
有很多方法可以处理这个问题,具体取决于您的特定 Apache 配置。我决定编辑
<Directory>
与我的 Web 根目录关联的条目,以便通过添加以下内容使默认 PHP 处理程序为版本 7.2:
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
由于 PHP 5.6 仅在例外情况下使用,我<Directory>
为每个需要使用旧版本 PHP 的应用程序添加了指令:
<Directory /var/www/oldapp>
<FilesMatch \.php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
添加
index.php
为有效的目录索引文件。在 Gentoo 中包含一个指令,以与通常相同的方式
/etc/apache2/modules.d/70_mod_php.conf
添加index.php
为目录索引文件。index.html
由于我们在第 9 步中禁用了 mod_php,因此70_mod_php.conf
不再需要进行此设置。要解决此问题,请添加DirectoryIndex index.php
到 Apache 配置。否则,如果您访问这样的路径,/oldapp/
将会收到 403 错误。重新启动阿帕奇。
# /etc/init.d/apache restart
其他注意事项
- 如果您在文件中设置了特定的配置设置
php.ini
(例如最大 POST 值、时区等),则需要在所有/etc/php/fpm-php*/php.ini
文件中(对于每个版本)进行这些设置。 - PHP-FPM 默认以
user=nobody
/运行group=nobody
。您可能需要更改这些(在/etc/php/fpm-php*/php-fpm.conf
)以匹配您正在运行的 Web 服务器。 - 要处理多个虚拟主机,请为每个虚拟主机执行步骤 10 和 11。