Linux 上的 PHP 應用效能調優 文章首圖

Linux 上的 PHP 應用效能調優

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

找到並修改以下關鍵參數:

  1. pm:設定為 dynamic 以啟用動態進程管理。
  2. pm.max_children:同時處理的最大子進程數。建議設定為:(伺服器可用記憶體 / 每個進程平均佔用記憶體)。一般預設值可能偏低,建議根據實際負載調整,例如設為 50100
  3. pm.start_servers:伺服器啟動時建立的初始進程數。建議設為 pm.min_spare_servers 的值,例如 10
  4. pm.max_requests:每個子進程處理完多少請求後重啟。這有助於釋放記憶體洩漏。建議設為 5001000

修改後,記得重啟服務以套用變更:

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:根據應用規模調整,通常 128 MB 對多數應用足夠。
  • 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 應用的回應速度與承載能力。這些設定並非一勞永逸,建議定期監控伺服器資源使用情況,並根據實際流量進行微調。掌握這些基礎調優技巧,將為你未來的伺服器管理打下堅實基礎。