其他注意事项

其他注意事项

我有一个 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 都以相同的方式处理。第三,从安全角度来看,安装最少数量/仅安装必要的软件总是更好。

  1. 更改您的USE标记以dev-lang/php添加fpm和删除apache2

    当前的 Gentoo 惯例是创建一个类似的文件/etc/portage/package.use/php并在此处指定USE标志。如果您在文件中指定确切的版本,请确保您要使用的所有 PHP 版本都选择这些USE标志。

  2. 安装/重新安装您将要使用的 PHP 版本。

# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
  1. 更改APACHE2_MODULES变量以构建proxyproxy_fcgiApache 模块。

    APACHE2_MODULES您可以通过添加/更新中的变量来指定 Apache 模块使用的内容/etc/portage/make.conf。与USE标志一样,Gentoo 已经为您的配置文件设置了一些默认值。与标志不同USE,您似乎需要通过$APACHE2_MODULES在变量前面添加来明确告诉 Gentoo 以默认值开始:

APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
  1. 重新安装阿帕奇。
# emerge -av apache
  1. 安装 PHP-FPM。
# emerge -av php-fpm
  1. 为您与 Apache 一起使用的每个 PHP 版本创建 PHP-FPM 启动脚本。

    PHP-FPM 安装会创建一个启动脚本 ( ),允许您使用或更改脚本的文件名后缀(例如、等)/etc/init.d/php-fpm来选择要运行的 PHP 版本。由于我们只想在一次只想使用单个版本的 PHP 时使用,或者如果我们想使用不超过两个版本(其中一个为 mod_php,第二个为 PHP-FPM),因此我们将使用后缀方法。我们不想复制脚本,而是对其进行符号链接(有效后缀是来自例如、等的目录名称):eselectphp-fpm-php5.6php-fpm-php7.2eselectls -ld /usr/lib64/php*php5.6php7.2

# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
  1. 更改 PHP-FPM 配置,以便每个 PHP 版本的服务在不同的端口上运行。

    具体文件名因版本而异,但您希望在这些常规位置编辑每个 PHP 版本的配置文件:/etc/php/fpm-php*/*.conf以便listen每个指令都有不同的端口。

  2. 配置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
  1. 编辑 Apache 启动配置以启用代理模块。

    编辑/etc/conf.d/apache2以添加-D PROXY-D PHP删除APACHE2_OPTS

  2. 编辑 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>
  1. 添加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 错误。

  2. 重新启动阿帕奇。

# /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。

相关内容