Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

php-fpm.conf 設定整理

緣由

最近因為幫公司架設了 Freescout,架設完畢後,主要網站偶爾會出現記憶體不足的警訊,導致網站當機。由於在 php-fpm 的記錄檔裡面看到 php-fpm 的子程序數量超過負荷,因此著手開始研究 php-fpm.conf 內的設定。中間踩了一些雷(新手層級),所以先記錄下來,避免未來再犯。

重新啟動 php-fpm 以前記得先測試組態檔

這個是以前踩到的雷,更新完組態檔以後,直接重啟 php-fpm,導致關閉 php-fpm 後無法開啟。蠻雷的。

$ php-fpm -t

視情況可能會需要 php-fpm7.0 等標註 PHP 版本。

組態屬性 pm 設定

[global]
#...略...#
[www]
#...上略...#
user = www
group = www
pm = dynamic
pm.max_children = 40
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 40
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
php_admin_value[error_log] = /usr/local/php/var/log/php_errors.log
php_admin_flag[log_errors] = on

PHP-FPM 的 pm 類型有三種:static、dynamic 與 ondemand。static 代表主機上 PHP-FPM 隨時佔用一定的記憶體資源,基本上用 VPS 的話就不需要考慮 static 了,因為你並不能確保主機商提供的記憶體跟價目表上的記憶體一樣。

dynamic 則會在 pm.min_spare_servers 與 pm.max_spare_servers 間,根據主機上全部網站的要求 (request) 狀態,決定啟用多少個 PHP-FPM 的執行程序。因此 pm.start_servers(起始的執行程序數量)不能小於 pm.min_spare_servers,而 pm.max_children 也不能大於 pm.max_spare_servers。

ondemand 是隨系統需求開啟、關閉 PHP-FPM 執行程序,如果記憶體小於 1GB 的話,建議就用這種方式就好。

2022-10-20 更新:
這次因為公司網站更新,把伺服器的 PHP 版本也更新後,發生了記憶體不足的問題,用 top -o %MEM 調查後,確認是 php-fpm 的問題。改成 ondemand 後狀況就有改善了,稍微記錄一下。

計算 pm.max_spare_servers 的方法

首先,需要先確定現有的 PHP-FPM 會佔用多少記憶體資源。

$ ps -ylC php-fpm --sort:rss

可以從 RSS 看到目前主機上,每個 PHP-FPM 執行程序需要佔用的記憶體容量,以目前公司網站為例,大概落在 120 MB 上下。

假設使用的主機提供 2GB (2048 MB) 的記憶體,那 PHP-FPM 的 pm.max_spare_servers 可以計算為:

2048/120 = 17

這次因為沒有先計算過,直接照本宣科,使用網路上教學的 2048/40 = 51 做設定,結果導致記憶體過載,算是這次踩到最大的新手雷。

影響個別 PHP-FPM 執行程序記憶體的可能原因

這裡的參考了一下其他大部分的文章,發現大多數文章提供範例時,PHP-FPM 執行程序的記憶體大約落在 30MB 到 60MB 之間。公司網站使用的記憶題資源較多,是因應 WPML 的系統最低需求所做的調整。可以透過修改 php.ini 的 memory_limit 組態值,或是在 php-fpm.conf 中加入 php_admin_value[memory_limit] = OOM 修改。

後記

由於公司的主機上面同時架設了多個網站,因此針對資源的切分還有需要加強的地方。接下來應該要研究一下如何分配不同程度的資源,給予不同的 vhost。

參考資料

Eric Chuang
Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料