Linux 上的 PHP 應用效能調優
在現代 Web 開發中,PHP 依然是驅動無數網站的核心引擎。然而,隨著流量增長或業務邏輯複雜化,預設的 PHP 設定往往無法發揮最佳效能,導致伺服器響應遲緩或資源耗盡。對於中階 Linux 使用者而言,理解並調整 PHP 的關鍵參數,是提升應用程式穩定性與速度的必要技能。本文將以 Ubuntu 22.04 / Debian 12 為基礎,帶領你逐步優化 PHP-FPM 與系統層級的設定。
前置作業與環境確認
在進行任何修改之前,請確保你的伺服器已安裝 PHP 7.4 以上版本(建議 8.1 或 8.2)。我們主要調整的是 PHP-FPM(FastCGI Process Manager),因為它透過進程管理來處理請求,效能遠優於傳統的 mod_php。
首先,確認當前 PHP 版本及 FPM 狀態:
php -v
sudo systemctl status php8.2-fpm
若服務未運行,請使用 sudo systemctl start php8.2-fpm 啟動。接下來,我們將針對 PHP-FPM 的進程池設定、OPcache 快取以及系統資源限制進行優化。
優化 PHP-FPM 進程池設定
PHP-FPM 透過 pm 參數管理子進程。對於大多數虛擬主機或中小型應用,ondemand 模式能顯著節省記憶體;若為高併發場景,則建議使用 dynamic。
編輯你的 FPM 池設定檔,通常位於 /etc/php/8.2/fpm/pool.d/www.conf:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
找到並修改以下關鍵參數:
- pm:設定為
dynamic以啟用動態進程管理。 - pm.max_children:同時處理的最大子進程數。建議設定為:
(伺服器可用記憶體 / 每個進程平均佔用記憶體)。一般預設值可能偏低,建議根據實際負載調整,例如設為50至100。 - pm.start_servers:伺服器啟動時建立的初始進程數。建議設為
pm.min_spare_servers的值,例如10。 - pm.max_requests:每個子進程處理完多少請求後重啟。這有助於釋放記憶體洩漏。建議設為
500或1000。
修改後,記得重啟服務以套用變更:
sudo systemctl restart php8.2-fpm
啟用並調優 OPcache
OPcache 是 PHP 效能提升的關鍵,它將編譯後的腳本碼快取在記憶體中,避免重複編譯。預設情況下,OPcache 可能未完全啟用或配置不當。
編輯主設定檔 /etc/php/8.2/fpm/php.ini 和 /etc/php/8.2/cli/php.ini:
sudo nano /etc/php/8.2/fpm/php.ini
找到 opcache 相關區段,確保以下設定正確:
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.revalidate_freq=60
- opcache.memory_consumption:根據應用規模調整,通常
128MB 對多數應用足夠。 - opcache.validate_timestamps:開發環境設為
1以便即時更新,生產環境務必設為0並配合revalidate_freq,以避免每次請求都檢查檔案修改時間。
修改完畢後,同時重啟 FPM 與 Web 伺服器(如 Nginx 或 Apache):
sudo systemctl restart php8.2-fpm
sudo systemctl restart nginx
系統層級優化:檔案描述符與核心參數
當併發量增加時,系統可能因檔案描述符不足而拒絕新連線。Ubuntu 預設限制較低,需手動調高。
編輯 /etc/security/limits.conf:
sudo nano /etc/security/limits.conf
加入以下行,確保 PHP-FPM 使用者有足夠的檔案描述符:
www-data soft nofile 65535
www-data hard nofile 65535
此外,調整核心網路參數以優化 TCP 連線處理。編輯 /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
加入或修改以下參數:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
套用核心設定:
sudo sysctl -p
常見問題與解決
1. 優化後 PHP-FPM 無法啟動或報錯?
這通常發生在設定檔語法錯誤或記憶體分配過大。請檢查 journalctl -u php8.2-fpm 的錯誤日誌。若顯示 pm.max_children 導致記憶體不足,請降低該數值或增加伺服器 RAM。確保所有修改後的 .conf 或 .ini 檔案語法無誤,特別是括號與等號兩側的空格。
2. 修改設定後,OPcache 未生效?
請使用 php -i | grep opcache 確認 CLI 環境的設定,並透過 phpinfo() 頁面確認 Web 環境的設定。若 validate_timestamps 設為 0,請確保在部署新程式碼時手動重啟 FPM,否則修改的程式碼不會立即反映,直到 revalidate_freq 時間到期或進程重啟。
小結
透過調整 PHP-FPM 的進程管理、啟用 OPcache 快取以及優化系統核心參數,我們能顯著提升 Linux 伺服器上 PHP 應用的回應速度與承載能力。這些設定並非一勞永逸,建議定期監控伺服器資源使用情況,並根據實際流量進行微調。掌握這些基礎調優技巧,將為你未來的伺服器管理打下堅實基礎。