如果你已經部署了一個LEMP(Linux、nginx、mysql/MariaDB和php)堆棧,那么你可能在nginx中使用FastCGI代理(作為http服務器)來處理php。php-FPM(FastCGI Process Manager的縮寫)是一個被廣泛使用的高性能的php FastCGI替代實現。
以下是在Linux服務器中設置LEMP Stack的有用指南。
最近,我們公司的一臺LEMP網站服務器上的所有php網站都變得很慢,并且最終在登錄服務器時停止響應,我們發現系統內存不足。php-FPM消耗了大部分的RAM,如下截圖所示(glances – 系統監控工具)。
在這篇文章中,我們將展示如何防止php-FPM在Linux中消耗過多或全部系統內存(RAM)。在本指南的最后,你將學會如何將php-FPM的內存消耗減少50%或更多。
減少php-FPM的內存使用
在互聯網上做了一些研究后,我們發現需要重新配置php-FPM進程管理器和它的某些方面,以減少php-FPM在池配置文件中的內存消耗。
默認的池是www,其配置文件位于/etc/php-fpm.d/www.conf(在centos/RHEL/Fedora上)或/etc/php/7.4/fpm/pool.d/www.conf(在Ubuntu/Debian/Mint上)。
$ sudo vim /etc/php-fpm.d/www.conf [在centos/RHEL/Fedora上] 。
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf [在Ubuntu/Debian/Mint上] 。
找到以下指令,并根據你的用例設置它們的值。對于被注釋出來的指令,你需要取消注釋。
pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200
我們來簡單解釋一下上述指令及其值。pm指令決定了進程管理器如何控制子進程的數量。默認的方法是動態的,也就是說子進程(子進程)的數量是根據其他一些指令動態設置的,包括pm.max_children,它定義了同一時間可以存活的子進程的最大數量。
理想的進程管理器是按需其中在啟動時沒有創建子進程,即在啟動時不創建子進程,而是按需生成。僅當新請求將基于pm.max_children和pm.process_idle_timeout連接時定義了子進程,子進程定義了秒數,在此秒數之后,空閑進程將被殺死。
最后,我們需要設置pm.max_requests參數,它定義了每個子進程在重新孵化之前應該執行的請求數。請注意,此參數也可以用作第三方庫中內存泄漏的解決方法。