在 Gentoo 上使用 Apache 執行多個版本的 PHP
我有一個 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 都以相同的方式處理。第三,從安全形度來看,安裝最少/只安裝必要的軟體總是更好。
- 更改您的
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
- 更改您的
APACHE2_MODULES
變數以建構proxy
和proxy_fcgi
Apache 模組。您可以通過
APACHE2_MODULES
在/etc/portage/make.conf
. 像USE
標誌一樣,Gentoo 已經為您的個人資料設置了一些預設值。與USE
標誌不同,您似乎需要通過添加$APACHE2_MODULES
到變數前面來明確告訴 Gentoo 從預設值開始:APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- 重新安裝 Apache。
# emerge -av apache
- 安裝 PHP-FPM。
# emerge -av php-fpm
- 為與 Apache 一起使用的每個 PHP 版本創建 PHP-FPM 啟動腳本。
/etc/init.d/php-fpm
PHP- FPM安裝會創建一個啟動eselect
腳本php-fpm-php5.6
(php-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
- 更改 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
- 編輯 Apache 啟動配置以啟用代理模組。
編輯以
/etc/conf.d/apache2
添加-D PROXY
和刪除-D PHP
。APACHE2_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>
- 添加
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。