如何在 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_module 和 mpm_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 proxy 與 sudo 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 Off 與 ServerTokens Prod 隱藏 Apache 版本資訊;並加入 X-Content-Type-Options: nosniff、X-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 的應用金鑰,以及基於版本的已知弱點。因此,只應在可控的非正式環境中使用,問題解決後務必立即刪除該檔案。
在正式環境中,可以遵循以下安全建議:
透過身分驗證或 IP 白名單限制存取,只允許授權人員查看
在 php.ini 中透過
disable_functions指令停用 phpinfo()稽核程式碼庫並移除所有 phpinfo() 呼叫
使用 Monolog 等結構化日誌工具,取代 phpinfo() 進行診斷
透過弱點掃描工具檢查是否存在相關資訊外洩
透過錯誤日誌進一步驗證
錯誤日誌為問題排查提供另一層線索,它可以記錄 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 運作正常。基於安全考量,測試完成後請刪除該檔案。
