Varidata 新聞資訊
知識庫 | 問答 | 最新技術 | IDC 行業新聞
Varidata 官方博客

如何在 Apache 中配置 PHP 環境

發布日期:2026-08-27
在 Apache 上配置 PHP 執行環境示意圖

你需要在 Windows、Ubuntu 或 CentOS 上,為 Apache 配置 PHP 環境,並部署在香港伺服器上。你的第一個決定將牽動後續一切:選擇 mod_php(嵌入式)還是 PHP-FPM(獨立程序)。根據 W3Techs 截至 2025 年初的數據,在所有已知使用伺服端語言的網站中,有 74.5% 使用 PHP。本文提供兩種方式的逐步指令與配置說明。

配置方案

每秒請求數

記憶體占用

Apache + mod_php

約 180 req/s

約 1.2 GB RAM

Nginx + PHP-FPM

約 310 req/s

約 380 MB RAM

這張表呈現了真實的取捨:mod_php 勝在簡單,PHP-FPM 則在效能與隔離性上更具優勢。在 Windows 上,你需要設定 PATH 變數並編輯 php.ini;在 Ubuntu 上,則可以透過 libapache2-mod-php 安裝。接下來就從選擇開始說起。

關鍵要點

  • 小型或簡單環境適合使用 mod_php,高併發與多版本情境更適合 PHP-FPM。

  • 在 Ubuntu 上透過 libapache2-mod-php 安裝 mod_php,在 Windows 上則透過設定 PATH 與 php.ini 完成配置。

  • 使用 PHP-FPM 可以同時執行多個 PHP 版本,並在高流量下提升穩定性。

  • 透過 phpinfo.php 測試配置,再查看錯誤日誌以快速鎖定問題。

  • 啟用 OPcache 並合理設定 memory_limit,可提升效能並支撐更多工作程序。

配置 PHP 環境:mod_php 與 PHP-FPM 對比

你在 mod_php 與 PHP-FPM 之間的選擇,將決定 Apache 處理 PHP 請求的方式。兩種方法各有適用情境。理解它們的取捨,有助於為你的專案選對基礎方案。

mod_php 概述

mod_php 會將 PHP 直譯器直接嵌入 Apache 程序中。當有請求到來時,Apache 會在內部執行 PHP 程式碼,而不需啟動獨立程式。這種方式的配置相對簡單:安裝一個模組、啟用它,然後重新啟動 Apache,整個伺服器就在同一程序中完成所有工作。

效能測試顯示,在中低訪問量下,mod_php 的表現並不遜色。在 10–100 併發請求時,Apache + mod_php 與 Apache + PHP-FPM 的效能幾乎相同,都能順利處理負載。不過,由於每個 Apache worker 都攜帶完整的 PHP 直譯器,mod_php 單一請求的記憶體占用較高,當流量增加時,可延展性會受到影響。

主要短板會在高負載下顯現:在 1,000 併發請求時,mod_php 只能維持基礎表現,而其他方案會明顯領先。對中小型網站來說,這通常不會成為致命問題;但對高流量應用而言,你可能需要選擇更容易擴展的方式。

PHP-FPM 概述

PHP-FPM(FastCGI Process Manager)會將 PHP 以獨立服務的形式執行,Apache 則透過代理與該服務通訊。這種分離帶來更好的隔離性:單一 PHP 程序崩潰不會拖垮整個 Web 伺服器;你也可以同時執行多個 PHP 版本,每個版本擁有獨立配置。

基準測試顯示了一些有趣的效能特徵:在低併發時,PHP-FPM 與 mod_php 的表現幾乎相同;而在高併發下,差距會逐漸拉開。Nginx + PHP-FPM 在 1,000 個併發連線時,處理的請求數約為 Apache 架構的兩倍。Apache + PHP-FPM 在原始吞吐量上接近 mod_php,但透過程序隔離取得更佳的穩定性。

連線方式同樣關鍵:在多數測試中,Unix socket 優於 TCP/IP。某次 500 連線的測試中,Unix socket 達到 2,613.18 req/s,而 TCP/IP 為 2,245.43 req/s,提升約 16.4%。在 60,000 使用者壓力下,Unix socket 仍能無錯誤運作,而 TCP/IP 在該級別發生失敗。不過在 5,000 併發時,TCP 反而更穩定,零錯誤,而 Unix socket 則出現 499 個錯誤。

當你為 Apache 配置 PHP 環境時,應搭配自身的流量模式來選擇方案。對較小規模部署而言,mod_php 提供更簡單的路徑;對成長中的應用,PHP-FPM 則提供更靈活且更安全的基礎。下表彙總了關鍵差異。

特性

mod_php

PHP-FPM

程序模型

嵌入 Apache

獨立服務

記憶體占用

單請求較高

單請求較低

隔離性

幾乎沒有

隔離良好

配置難度

簡單

中等

高併發表現

基礎水準

穩定性更好

在 Apache 上部署 mod_php

部署 mod_php 會將 PHP 直接嵌入 Apache 程序中,適合中小型網站,且配置簡單。Ubuntu 與 Windows 的具體步驟略有不同,但核心思路一致:安裝模組、配置 Apache、重啟服務。

Ubuntu/Debian 使用 libapache2-mod-php 安裝

首先安裝 mod_php 套件。在終端機中執行 sudo apt install libapache2-mod-php。此指令會同時安裝 PHP 模組與 Apache 模組。安裝完成後,透過 sudo a2enmod php8.x 啟用模組(將 8.x 替換為實際的 PHP 版本)。

接著配置 Apache 的多工處理模組(MPM)。mod_php 需要使用 prefork MPM。prefork 採用多程序、單執行緒模型,每個子程序同時只處理一個連線,這種方式比其他 MPM 更耗記憶體,但與 mod_php 相容。event MPM 在高併發下表現更佳,但無法與 mod_php 搭配使用。此外,prefork 不支援 HTTP/2,如果你打算使用現代 Web 通訊協定,這一限制需要特別留意。

開啟 Apache 設定檔。在 Ubuntu 中,該設定通常位於 /etc/apache2/mods-available/mpm_prefork.conf。取消載入 prefork 模組相關行的註解,接著找到 mpm_event_modulempm_worker_module 的設定行,將它們註解掉。儲存檔案並重新啟動 Apache。

完成上述步驟後,仍可能遇到一些常見錯誤。安裝或升級套件後,你可能會看到 500 伺服器錯誤,尤其是在先前使用 CGI 包裝的情境。一般解法是改用 mod_php 或安裝 PHP-FPM。如果日誌顯示缺少 mod_fcgid,可透過 sudo apt install libapache2-mod-fcgid 安裝並啟用,然後重新檢查配置。需要注意的是,mod_php 已逐漸被棄用,不建議用於共享主機環境,這種情況下更適合使用 PHP-FPM。

Windows 下透過 PATH 與 php.ini 配置

在 Windows 上的流程有所不同。首先從官方網站下載 PHP 壓縮包,選擇適用於 Apache + mod_php 的非執行緒安全版本,將壓縮包解壓縮到例如 C: 這樣的目錄中。

解壓後,需要配置 php.ini。在 PHP 目錄中找到 php.ini-development 檔案,將其重新命名為 php.ini,再用文字編輯器開啟。找到 extension_dir 設定,將其修改為正確路徑,例如 extension_dir = "C:"。將 date.timezone 設定為你的時區,例如 date.timezone = "America/New_York"。如有需要,可將 memory_limit 提高,例如設定為 memory_limit = 128M。這些設定可避免常見問題,如時區警告與記憶體限制錯誤。

Windows 環境中的常見錯誤包括因 PHP 錯誤被隱藏而導致的空白頁。你可以在 PHP 程式碼中加入 error_reporting(E_ALL)ini_set('display_errors', 1),或在 php.ini 中設定 error_log 以紀錄錯誤。若 PHP 完全無法載入,可透過 php --ini 指令檢查實際載入的設定檔路徑;必要時在登錄機碼 HKEY_LOCAL_MACHINE 底下設定 IniFilePath,指向包含 php.ini 的目錄。

接著,把 PHP 目錄加入系統 PATH。開啟系統內容,進入「環境變數」,找到 Path 變數,並加入 C:。如此一來,Apache 才能找到 PHP 執行檔。你可以在命令提示字元中執行 php -m 來驗證模組是否正確載入。

完成上述步驟後,重新啟動 Apache:在 Ubuntu 上使用 sudo systemctl restart apache2,在 Windows 則透過「服務」面板重新啟動 Apache 服務。透過這些步驟,你就能在不同平臺上為 Apache 配置好 PHP 環境。

在 Apache 上部署 PHP-FPM

PHP-FPM 透過獨立程序來處理 PHP 請求,在穩定性與可延展性方面更具優勢。當你需要更好的隔離,或計畫在同一台伺服器上執行多個 PHP 版本時,可以選擇此方式為 Apache 配置 PHP 環境。核心步驟包括安裝 PHP-FPM 服務,以及設定 Apache 與它通訊。

安裝 PHP-FPM 並配置服務

在 Ubuntu 上,先透過 sudo apt install php8.x-fpm 安裝 PHP-FPM(將 8.x 替換為實際版本)。套件管理工具會自動完成大部分基礎設定。你還需要安裝 libapache2-mod-fcgid 以啟用 FastCGI 支援,可透過 sudo apt install libapache2-mod-fcgid 完成。

Windows 使用者則需走另一條路徑:同樣從官方網站下載安裝包並解壓縮至例如 C: 的目錄。壓縮包中包含 php-cgi.exe,它會作為 FastCGI 程序使用。Windows 不需要獨立的 FPM 執行檔,而是透過配置 Apache,在收到 PHP 請求時啟動 CGI 程序。

安裝完成後,需配置 PHP-FPM 的程序池(pool)參數。在 Ubuntu 中,該設定檔通常位於 /etc/php/8.x/fpm/pool.d/www.conf(將 8.x 替換為實際版本)。它決定有多少 worker 程序處理請求。對高流量網站,可將 pm.max_children 設為至少 25,將 pm.max_requests 設為至少 10000,以便 worker 週期性重啟。將模式設為 ondemand,可在真正有請求時才啟動 worker,閒置時節省記憶體。

你也可以啟用狀態頁作為監控依據。該端點會顯示活躍程序數、請求時間與佇列長度。當活躍 worker 超過 max_children 的 80% 時,應觸發告警。啟用支援 JIT 的 OPcache,可減少單一 worker 的記憶體占用,讓你在總記憶體不變下,提高 max_children 的上限。

安全性同樣重要。為每個網站分別建立 Linux 使用者,例如透過 sudo useradd -m user1 建立帳號,再透過 sudo usermod -a -G user1 www-data 將 Web 伺服器使用者加入對應群組。確認家目錄權限為 drwxr-x---,確保只有對應使用者及其群組可存取。刪除或停用預設網站,以免對外暴露預設頁面。

Apache 透過代理連接 PHP-FPM

Apache 需透過代理模組與 PHP-FPM 溝通。先啟用代理模組:執行 sudo a2enmod proxysudo a2enmod proxy_fcgi。若需要傳遞 Authorization 標頭,可選擇啟用 setenvif。接著透過 sudo systemctl reload apache2 重新載入設定,並使用 apache2ctl -M | grep proxy_fcgi 檢查模組是否啟用。

同時需要將 Apache 切換為 event MPM。PHP-FPM 可以配合 event MPM 使用,而 event MPM 在高併發場景下比 prefork 更省資源、效能更佳。你需要在 Apache 設定中停用 mpm_prefork_module,啟用 mpm_event_module,藉此利用 event MPM 更有效率地處理連線。

在虛擬主機設定中新增 ProxyPassMatch 指令,讓 Apache 將 PHP 請求轉發至 FPM 服務。範例如下:ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/your-site/$1,將路徑替換為實際網站根目錄。若部署在同一台伺服器上,建議使用 Unix socket 而非 TCP/IP,以降低額外開銷。

你也應透過額外指令加強安全性設定。例如使用 Options -Indexes 禁用目錄瀏覽;禁止存取 .htaccess.env.log 等敏感檔案;限制 HTTP 方法僅允許應用實際使用的動詞;在不需要 .htaccess 的目錄中設定 AllowOverride None;禁止在上傳目錄中執行 PHP 檔案;透過 ServerSignature OffServerTokens Prod 隱藏 Apache 版本資訊;並加入 X-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGIN 等安全標頭。

透過套件管理工具安裝簡單便利;從原始碼編譯則能獲得更高的版本掌控與客製化彈性。多數正式環境更適合採用套件管理的方式,因為可方便自動取得安全更新。你可依照對「掌控度」與「便利性」的需求,選擇合適的方式。

測試 PHP 配置

建立 phpinfo 檔案

phpinfo() 函數會輸出目前執行環境的完整快照,包括 PHP 版本、編譯選項、已載入擴充套件、全域與區域設定值等。透過它,你可以快速確認線上環境中實際生效的設定,而非依賴猜測或某個單獨設定檔。這比「推測設定是否生效」要可靠得多。

在 Web 根目錄中建立一個測試檔案,命名為 phpinfo.php,內容只需一行:<?php phpinfo(); ?>。接著在瀏覽器中存取 http://your-server/phpinfo.php,你應該會看到顯示所有 PHP 設定的詳細頁面。

該輸出對檢查下列關鍵資訊特別有幫助:

  • 編譯選項與擴充套件——用來辨識缺失或衝突的模組

  • PHP 版本與作業系統版本——用於對照已知相容性問題

  • 全域與區域設定值——協助確認設定是在何處被覆寫

  • 路徑資訊——包含 include_path、extension_dir 等目錄設定

  • HTTP 標頭與 EGPCS 資料——顯示伺服器變數、環境變數、GET、POST、Cookie 與 Session 資料

須注意,phpinfo() 雖然在除錯時非常好用,卻也會暴露環境變數與版本資訊,甚至可能洩露類似 APP_KEY 的應用金鑰,以及基於版本的已知弱點。因此,只應在可控的非正式環境中使用,問題解決後務必立即刪除該檔案。

在正式環境中,可以遵循以下安全建議:

  1. 透過身分驗證或 IP 白名單限制存取,只允許授權人員查看

  2. 在 php.ini 中透過 disable_functions 指令停用 phpinfo()

  3. 稽核程式碼庫並移除所有 phpinfo() 呼叫

  4. 使用 Monolog 等結構化日誌工具,取代 phpinfo() 進行診斷

  5. 透過弱點掃描工具檢查是否存在相關資訊外洩

透過錯誤日誌進一步驗證

錯誤日誌為問題排查提供另一層線索,它可以記錄 phpinfo() 無法呈現的細節。你可以從多個日誌欄位中分析與追蹤配置問題。

日誌組成部分

診斷價值

錯誤類型與嚴重程度

區分致命錯誤、警告或提示

檔案路徑與行號

精確定位至特定設定檔或腳本行

時間戳記

將錯誤與最近的配置變更對應起來

堆疊追蹤

顯示觸發錯誤的設定指令或呼叫鏈

記憶體使用情況

協助發現與 memory_limit 相關的問題

錯誤日誌位置

確認 log_errors 與 error_log 設定是否生效

請依照環境設定合理的錯誤等級。在開發與測試環境中,通常應使用 E_ALL 捕捉所有問題;對含有大量舊程式碼的正式環境,可考慮使用 E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED,以隱藏棄用特性相關的提示。可在 php.ini 中透過 error_reporting = E_ALL 設定,也可在執行階段透過 error_reporting(E_ALL); 動態調整。

常見陷阱包括:Ubuntu 上缺少 mpm_prefork、Windows 上 PATH 設定錯誤、擴充模組載入失敗等。當你遇到空白頁或 500 錯誤時,第一步應先檢查錯誤日誌,它通常能指出問題根源。

整體而言,mod_php 為小型專案提供極為簡單的路徑,而 PHP-FPM 則為成長型應用帶來更好的延展性。無論選擇哪種方式,每次修改 PHP 配置後,都必須重新啟動 Apache 才能生效。

在配置 PHP 環境時,建議啟用 OPcache 以提升效能。此優化可讓任務處理速度提升約 30–40%,對複雜任務尤為明顯。請合理設定 memory_limit,讓其同時符合應用需求與可用記憶體。

例如,將限制調整為 64 MB 往往相對安全,同時相較於預設設定,可支援約兩倍數量的 worker 程序。

使用 phpinfo() 來檢查你的設定是否生效;若需更進階情境,如在同一台伺服器執行多個 PHP 版本,可參考官方 PHP 文件。先選定適合你專案的方案,再依照上述步驟進行部署與驗證。

常見問題(FAQ)

小型個人網站應該選擇哪種方式?

對個人站或小型網站而言,mod_php 通常更為合適。你只需安裝一個模組、啟用並重啟 Apache,即可完成部署。在低至中等流量下,此種嵌入式方式足以應付,而 PHP-FPM 帶來的額外彈性在此類專案中未必必要。

為什麼修改 PHP 配置後一定要重啟 Apache?

Apache 在啟動時會載入 PHP 模組與相關設定。對 php.ini 或模組設定檔所做的變更,必須在伺服器重新啟動後才會重新載入並生效。在 Ubuntu 上可使用 sudo systemctl restart apache2,在 Windows 則透過服務管理面板重啟 Apache。

能否在同一台伺服器上執行多個 PHP 版本?

可以。若要達成此目的,通常應採用 PHP-FPM。每個 PHP 版本以獨立服務方式執行,Apache 則透過 ProxyPassMatch 等指令,將不同網站或目錄的請求轉發至對應的 PHP 版本。mod_php 一次只能載入一個版本。

配置完成後出現空白頁或 500 錯誤通常是什麼原因?

在 Ubuntu 上,常見原因包括缺少 mpm_prefork;在 Windows 上則多半與 PATH 設定錯誤有關。第一步應先查看錯誤日誌;同時可在 PHP 檔案中加入 error_reporting(E_ALL) 以顯示隱藏錯誤,並確認是否載入正確的模組。

如何確認 PHP 在配置完成後運作正常?

在 Web 根目錄建立一個名為 phpinfo.php 的檔案,內容為 <?php phpinfo(); ?>,然後在瀏覽器中開啟該檔案。若你看到顯示 PHP 版本、擴充套件與設定值的詳細頁面,即表示 PHP 運作正常。基於安全考量,測試完成後請刪除該檔案。

您的免費試用從這裡開始!
聯繫我們的團隊申請實體主機服務!
註冊成為會員,尊享專屬禮遇!
您的免費試用從這裡開始!
聯繫我們的團隊申請實體主機服務!
註冊成為會員,尊享專屬禮遇!
Telegram Teams