首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Gentoo上使用Apache运行多个PHP版本

问在Gentoo上使用Apache运行多个PHP版本
EN

Unix & Linux用户
提问于 2019-03-13 00:06:27
回答 1查看 1.5K关注 0票数 3

我有一个Gentoo Linux web服务器,它使用Apache为一些基于PHP的web应用程序提供服务。大多数应用程序将在最新版本的PHP上运行(即7.2);然而,一个应用程序需要运行在一个非常旧的PHP版本(即5.6)上。How我可以在同一个web服务器上同时运行多个版本的PHP吗?

  • Gentoo (概况17)。
  • 是Apache2.4。
  • 需要运行PHP7.2和PHP5.6。
  • Apache目前被配置为通过mod_php为PHP7.2服务,但PHP5.6也已安装。
  • Gentoo被配置为使用eselect来更改Apache/mod_php使用哪个版本的PHP。
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-03-13 00:06:27

这个答案特别适用于配置文件17的Gentoo,它可能会与几个正负版本一起工作。我用Red的PHP配置提示页面作为灵感来源。同样的想法也适用于其他Linux发行版(当然,特定的命令会有所不同)。

解决方案是使用PHP (FastCGI流程管理器)。每个版本的PHP都有自己的PHP服务,可以监听套接字。Apache根据所需的PHP版本将PHP执行请求传递给特定的PHP服务。

您可以将mod_php用于PHP的一个版本,而PHP用于另一个版本(S),但我决定完全放弃mod_php。首先,我在某个地方读到可以通过禁用mod_php来节省一些内存开销。第二,由于PHP的所有版本都是以相同的方式处理,解决方案似乎更简洁一些。第三,从安全的角度来看,最好只安装最少的/只安装必要的软件。

  1. 将 Change USE flags用于 dev-lang/php to添加 fpm and remove apache2**。*当前的Gentoo约定是创建一个像/etc/portage/package.use/php这样的文件,并在这里指定USE标志。如果在文件中指定了确切的版本,请确保要使用的所有PHP版本都要选中这些USE标志。
  2. 安装/重新安装将要使用的PHP版本。
代码语言:javascript
复制
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
  1. Change您的 APACHE2_MODULES variable来构建 proxy 和 proxy_fcgi Apache模块。通过在/etc/portage/make.conf中添加/更新APACHE2_MODULES变量来指定Apache模块使用什么。与USE标志一样,Gentoo已经为您的配置文件设置了一些默认设置。与USE标志不同,您似乎需要显式地告诉Gentoo从缺省值开始,将$APACHE2_MODULES放在变量的前面:
代码语言:javascript
复制
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
  1. Reinstall Apache.
代码语言:javascript
复制
# emerge -av apache
  1. Install PHP.
代码语言:javascript
复制
# emerge -av php-fpm
  1. PHP安装为您在Apache.Create创建一个启动脚本(/etc/init.d/php-fpm),允许您选择使用eselect运行的PHP版本或更改脚本的文件名后缀(例如php-fpm-php5.6、php-fpm-php7.2等)。因为我们只想使用eselect,如果我们只想一次使用单一版本的PHP,或者如果我们想使用最多两个版本的mod_php (一个版本)和PHP版本(第二个版本),那么我们将使用后缀方法。我们不需要复制脚本,而是将其符号链接(有效后缀是来自ls -ld /usr/lib64/php*的目录名,例如php5.6、php7.2等):
代码语言:javascript
复制
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
  1. <#>Change的PHP配置,以便每个PHP版本的服务在不同的端口上运行。特定的文件名在不同版本之间有所不同,但是您希望在以下一般位置为每个PHP版本编辑一个配置文件:/etc/php/fpm-php*/*.conf,以便listen指令为每个版本都有一个不同的端口。
  2. 启动Configure PHP服务。
代码语言:javascript
复制
# 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
  1. Edit Apache启动配置,以启用代理模块。编辑/etc/conf.d/apache2以添加-D PROXY并从APACHE2_OPTS中删除-D PHP。
  2. Edit将特定的目录位置与PHP的特定实例绑定在一起。根据特定的Apache配置,有很多方法来处理这个问题。我决定编辑与我的web根目录相关联的条目,这样默认的PHP处理程序是Version7.2,方法是添加:
代码语言:javascript
复制
    SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.

在PHP5.6只被异常使用时,我为每个需要使用旧版本PHP的应用程序添加了指令:

代码语言:javascript
复制
        Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
  1. 添加 index.php as为有效的目录索引文件。在Gentoo /etc/apache2/modules.d/70_mod_php.conf中包含一个指令,以index.html通常的方式将index.php添加为目录索引文件。由于我们在步骤9中禁用了mod_php,因此70_mod_php.conf不再存在以设置此设置。要解决这个问题,请将DirectoryIndex index.php添加到Apache配置中。否则,如果您访问像/oldapp/这样的路径,您将得到一个403错误。
  2. Restart Apache.
代码语言:javascript
复制
# /etc/init.d/apache restart

其他备注

  • 如果您在php.ini文件中设置了特定的配置设置(例如,最大POST值、时区等),则需要在所有/etc/php/fpm-php*/php.ini文件中设置这些设置(针对每个版本)。
  • PHP默认以user=nobody / group=nobody的形式运行。您可能需要更改这些(在/etc/php/fpm-php*/php-fpm.conf中),以匹配您的web服务器正在运行的任何内容。
  • 要处理多个虚拟主机,请为每个虚拟主机执行步骤10和步骤11。
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/505980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档