介紹 在Apache Web伺服器使用虛擬主機上的單個實例管理多個域。同樣,PHP-FPM使用守護進程在單個實例上管理多個 PHP 版本。您可以一起使用 Apache 和 PHP-FPM 來託管多個 PHP Web 應用程式,每個應用程式都使用不同版本的 PHP,都在同一伺服器上,並且都在同一時間。這很有用,因為不同的應用程式可能需要不同版本的 PHP,但某些伺服器堆疊,如定期配置的 LAMP 堆疊,只能管理一個。與將每個應用程式託管在自己的實例上相比,將 Apache 與 PHP-FPM 相結合也是一種更具成本效益的解決方案。 PHP-FPM也提供配置選項,stderr以及stdout日誌記錄,緊急重新開機和適應過程產卵,這是重載的網站是有用的。事實上,將 Apache 與 PHP-FPM 結合使用是託管 PHP 應用程式的最佳堆疊之一,尤其是在性能方面。 事實上,將 Apache 與 PHP-FPM 結合使用是託管 PHP 應用程式的最佳堆疊之一,尤其是在性能方面。PHP-FPM 不僅允許您同時運行多個 PHP 版本,它還提供了許多額外的功能,例如自我調整進程生成,這對於高負載網站非常有用。 在本教程中,您將在單個實例上設置兩個 PHP 網站。每個網站將使用自己的域,每個域將部署自己的 PHP 版本。第一個,site1.your_domain將部署 PHP 7.2。第二個,site2.your_domain將部署 PHP 7.3。 先決條件 • 按照 Ubuntu 20.04的初始伺服器設置(包括 sudo 非 root 用戶和防火牆)設置一台至少具有 1GB RAM 的 Ubuntu 20.04 伺服器。 • 按照如何在 Ubuntu 20.04 上安裝Apache Web 伺服器來設置和配置Apache Web 伺服器。 • 配置為指向您的 Ubuntu 20.04 伺服器的功能變數名稱。您可以按照如何從公共域註冊商指向 DigitalOcean 功能變數名稱伺服器瞭解如何將域指向 DigitalOcean Droplets 。出於本教程的目的,我們將使用兩個子域,每個子域都A在我們的 DNS 設置中指定了一條記錄:site1.your_domain和site2.your_domain. 步驟 1 — 使用 PHP-FPM 安裝 PHP 7.2 和 7.3 版 完成先決條件後,您現在將安裝 PHP 版本 7.2 和 7.3,以及 PHP-FPM 和幾個附加擴展。但要完成此操作,您首先需要將Ondrej PHP存儲庫添加到您的系統中。 執行apt-get命令安裝software-properties-common: • sudo apt-get install software-properties-common -y • 該software-properties-common包提供了apt-add-repository命令列實用程式,您將使用它來添加ondrej/phpPPA(個人包存檔)存儲庫。 現在將ondrej/php存儲庫添加到您的系統。該ondrej/phpPPA將有比官方Ubuntu軟體倉庫更高達最新版本的PHP,它也可以讓你安裝PHP的多個版本在同一個系統: • sudo add-apt-repository ppa:ondrej/php • 更新存儲庫: • sudo apt-get update -y • 接下來,安裝php7.2,php7.2-fpm,php7.2-mysql,libapache2-mod-php7.2,並libapache2-mod-fcgid用下麵的命令: • sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 libapache2-mod-fcgid -y • • php7.2 是用於運行 PHP 應用程式的元包。 • php7.2-fpm 提供作為守護進程運行並接收 Fast/CGI 請求的 Fast Process Manager 解譯器。 • php7.2-mysql 將 PHP 連接到 MySQL 資料庫。 • libapache2-mod-php7.2 為 Apache 網路服務器提供 PHP 模組。 • libapache2-mod-fcgid 包含一個 mod_fcgid,它啟動許多 CGI 程式實例來處理併發請求。 現在對 PHP 7.3 版重複此過程。安裝php7.3,php7.3-fpm,php7.3-mysql,和libapache2-mod-php7.3。 • sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y • 安裝兩個 PHP 版本後,啟動php7.2-fpm服務: • sudo systemctl start php7.2-fpm • 接下來,驗證php7.2-fpm服務的狀態: • sudo systemctl status php7.2-fpm • 您將看到以下輸出: Output • ● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager • • Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled) • • Active: active (running) since Fri 2020-06-05 11:25:07 UTC; 1min 38s ago • • Docs: man:php-fpm7.2(8) • • Main PID: 13703 (php-fpm7.2) • • Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" • • Tasks: 3 (limit: 2353) • • Memory: 6.2M • • CGroup: /system.slice/php7.2-fpm.service • • ├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) • • ├─13719 php-fpm: pool www • • └─13720 php-fpm: pool www • • • • Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager... • • Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager. • • • 重複這個過程,現在啟動php7.3-fpm服務: • sudo systemctl start php7.3-fpm • 接下來,驗證php7.3-fpm服務的狀態: • sudo systemctl status php7.3-fpm • 您將看到以下輸出: Output • ● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager • • Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled) • • Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago • • Docs: man:php-fpm7.3(8) • • Process: 23470 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.3/fpm/pool.d/www.conf 73 (code=ex> • • Main PID: 23452 (php-fpm7.3) • • Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" • • Tasks: 3 (limit: 2353) • • Memory: 7.1M • • CGroup: /system.slice/php7.3-fpm.service • • ├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf) • • ├─23468 php-fpm: pool www • • └─23469 php-fpm: pool www • • • • Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager... • • Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 FastCGI Process Manager. • • • 最後,您必須啟用多個模組,以便您的 Apache2 服務可以使用多個 PHP 版本: • sudo a2enmod actions fcgid alias proxy_fcgi • • actions 用於根據媒體類型或請求方法執行 CGI 腳本。 • fcgid 是 mod_cgi 的高性能替代方案,它啟動足夠數量的 CGI 程式實例來處理併發請求。 • alias 提供文檔樹中主機檔案系統不同部分的映射,以及 URL 重定向。 • proxy_fcgi 允許 Apache 將請求轉發到 PHP-FPM。 現在重新開機 Apache 服務以應用您的更改: • sudo systemctl restart apache2 • 此時,您已經在伺服器上安裝了兩個 PHP 版本。接下來,您將為要部署的每個網站創建一個目錄結構。 步驟 2 — 為兩個網站創建目錄結構 在本節中,您將為兩個網站中的每一個創建一個文檔根目錄和一個索引頁面。 首先,為site1.your_domain和創建文檔根目錄site2.your_domain: • sudo mkdir /var/www/site1.your_domain • • sudo mkdir /var/www/site2.your_domain • 預設情況下,Apache 網路服務器作為www-data使用者和www-data組運行。為確保您擁有網站根目錄的正確所有權和許可權,請執行以下命令: • sudo chown -R www-data:www-data /var/www/site1.your_domain • • sudo chown -R www-data:www-data /var/www/site2.your_domain • • sudo chmod -R 755 /var/www/site1.your_domain • • sudo chmod -R 755 /var/www/site2.your_domain • 接下來,您將info.php在每個網站根目錄中創建一個檔。這將顯示每個網站的 PHP 版本資訊。從site1開始: • sudo nano /var/www/site1.your_domain/info.php • 添加以下行: /var/www/site1.your_domain/info.php 保存並關閉文件。現在將您創建的 info.php 檔複製到site2: • sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php • 您的 Web 伺服器現在應該具有每個網站向訪問者提供資料所需的文檔根目錄。接下來,您將配置 Apache Web 伺服器以使用兩個不同的 PHP 版本。 第 3 步 – 為兩個網站配置 Apache 在本節中,您將創建兩個虛擬主機設定檔。這將使您的兩個網站能夠同時使用兩個不同的 PHP 版本。 為了讓 Apache 提供這些內容,有必要使用正確的指令創建一個虛擬主機檔。您無需修改位於 的默認設定檔/etc/apache2/sites-available/000-default.conf,而是在 目錄中創建兩個新設定檔/etc/apache2/sites-available/。 首先為網站site1.your_domain創建一個新的虛擬主機設定檔。在這裡,您將使用以下命令指示 Apache 呈現內容php7.2: • sudo nano /etc/apache2/sites-available/site1.your_domain.conf • 添加以下內容。確保網站目錄路徑、伺服器名稱和 PHP 版本與您的設置匹配: /etc/apache2/sites-available/site1.your_domain.conf ServerAdmin admin@site1.your_domain ServerName site1.your_domain DocumentRoot /var/www/site1.your_domain DirectoryIndex info.php Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all # From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost" ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined 在此檔中,您將DocumentRoot更新為新目錄,將ServerAdmin更新為your_domain網站管理員可以訪問的電子郵件。您還更新了ServerName,它為這個虛擬主機配置建立了基本域,並且您已經添加了一個SetHandler指令來將 PHP 作為 fastCGI 進程伺服器運行。 保存並關閉文件。 接下來,為網站site2.your_domain創建一個新的虛擬主機設定檔。您將指定此子域進行部署php7.3: • sudo nano /etc/apache2/sites-available/site2.your_domain.conf • 添加以下內容。再次確保網站目錄路徑、伺服器名稱和 PHP 版本與您的唯一資訊匹配: /etc/apache2/sites-available/site2.your_domain.conf ServerAdmin admin@site2.your_domain ServerName site2.your_domain DocumentRoot /var/www/site2.your_domain DirectoryIndex info.php Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all # 2.4.10+ can proxy to unix socket SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost" ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined 完成後保存並關閉檔。然後,檢查 Apache 設定檔是否有任何語法錯誤: • sudo apachectl configtest • 您將看到以下輸出: Output • Syntax OK • 接下來,使用以下命令啟用兩個虛擬主機設定檔: • sudo a2ensite site1.your_domain • • sudo a2ensite site2.your_domain • 現在禁用預設網站,因為您不需要它。: • sudo a2dissite 000-default.conf • 最後,重新開機 Apache 服務以實現您的更改: • sudo systemctl restart apache2 • 現在您已經配置了 Apache 來為每個網站提供服務,您將測試它們以確保正確的 PHP 版本正在運行。