Apache-Httpd

在 Gentoo 上使用 Apache 執行多個版本的 PHP

  • March 13, 2019

我有一個 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 版本。

這個答案專門針對帶有 Profile 17 的 Gentoo。它可能適用於幾個加減版本。我使用Red Hat 的 PHP Configuration Tips頁面來獲得靈感。同樣的想法應該適用於其他 Linux 發行版(當然具體的命令會有所不同)。

解決方案是使用 PHP-FPM (FastCGI Process Manager)。每個版本的 PHP 都有自己的偵聽套接字的 PHP-FPM 服務。Apache 將 PHP 執行請求傳遞給特定的 PHP-FPM 服務,具體取決於所需的 PHP 版本。

您可以將 mod_php 用於一個 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/etc/portage/make.conf. 像USE標誌一樣,Gentoo 已經為您的個人資料設置了一些預設值。與USE標誌不同,您似乎需要通過添加$APACHE2_MODULES到變數前面來明確告訴 Gentoo 從預設值開始:

APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
  1. 重新安裝 Apache。
# emerge -av apache
  1. 安裝 PHP-FPM。
# emerge -av php-fpm
  1. 為與 Apache 一起使用的每個 PHP 版本創建 PHP-FPM 啟動腳本。

/etc/init.d/php-fpmPHP- FPM安裝會創建一個啟動eselect腳本php-fpm-php5.6php-fpm-php7.2因為我們只想eselect使用一次只使用一個版本的 PHP,或者如果我們想使用不超過兩個版本,其中一個是 mod_php,第二個是 PHP-FPM,我們將使用 suffix 方法. 我們不想複製腳本,而是對它進行符號連結(有效的後綴是來自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
  1. 更改 PHP-FPM 配置,以便每個 PHP 版本的服務在不同的埠上執行。

具體文件名因版本而異,但您希望在這些一般位置為每個 PHP 版本編輯配置文件:/etc/php/fpm-php*/*.conf以便該listen指令對每個版本都有不同的埠。 8. 配置 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 PHPAPACHE2_OPTS 10. 編輯 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 錯誤。 12. 重啟阿帕奇。

# /etc/init.d/apache restart

其他注意事項

  • 如果您在php.ini文件中設置了特定的配置設置(例如最大 POST 值、時區等),則需要在所有/etc/php/fpm-php*/php.ini文件中設置這些設置(針對每個版本)。
  • PHP-FPM 預設以user=nobody/執行group=nobody。您可能需要更改這些 (in /etc/php/fpm-php*/php-fpm.conf) 以匹配您的 Web 伺服器正在執行的任何內容。
  • 要處理多個虛擬主機,請分別執行步驟 10 和 11。

引用自:https://unix.stackexchange.com/questions/505980