?PHP-FPM(PHP FastCGI Process Manager)是一個(gè)用于管理PHP進(jìn)程的進(jìn)程管理器,主要用于處理Web服務(wù)器的請(qǐng)求。?
PHP-FPM是FastCGI的實(shí)現(xiàn),提供了進(jìn)程管理的功能。它包括一個(gè)主進(jìn)程(master)和多個(gè)工作進(jìn)程(worker)。主進(jìn)程負(fù)責(zé)監(jiān)聽端口,接收來(lái)自服務(wù)器的請(qǐng)求,而工作進(jìn)程則負(fù)責(zé)執(zhí)行PHP腳本。每個(gè)工作進(jìn)程內(nèi)部都會(huì)嵌入一個(gè)PHP解釋器,是代碼真正執(zhí)行的地方?12。
PHP-FPM的主要功能包括:
?進(jìn)程管理?:PHP-FPM可以創(chuàng)建和管理一個(gè)PHP進(jìn)程池,這些進(jìn)程池中的進(jìn)程負(fù)責(zé)處理PHP請(qǐng)求。主進(jìn)程負(fù)責(zé)動(dòng)態(tài)創(chuàng)建和銷毀工作進(jìn)程,以適應(yīng)不同的負(fù)載需求?12。
?資源管理?:PHP-FPM可以根據(jù)配置參數(shù)管理進(jìn)程的數(shù)量、生命周期和資源分配,提供高級(jí)功能如請(qǐng)求限制、超時(shí)控制、進(jìn)程重生和日志記錄等?2。
?通信方式?:PHP-FPM支持基于Unix域套接字或TCP/IP套接字的進(jìn)程間通信,以及基于文件和共享內(nèi)存的進(jìn)程管理?2。
通過(guò)使用PHP-FPM,可以有效地控制內(nèi)存和進(jìn)程,實(shí)現(xiàn)平滑的重載PHP配置,并且能夠更好地管理PHP進(jìn)程,提高系統(tǒng)的穩(wěn)定性和性能。
pm.max_children 表示 php-fpm 能啟動(dòng)的子進(jìn)程的最大數(shù)量。這個(gè)值原則上是越大越好,php-cgi的進(jìn)程多了就會(huì)處理的很快,排隊(duì)的請(qǐng)求就會(huì)很少。設(shè)置”max_children” 也需要根據(jù)服務(wù)器的性能進(jìn)行設(shè)定。一般來(lái)說(shuō)一臺(tái)服務(wù)器正常情況下每一個(gè)php-cgi所耗費(fèi)的內(nèi)存在20M~30M左右,因此根據(jù)服務(wù)器內(nèi)存大小來(lái)計(jì)算“max_children”的數(shù)量。例如,假設(shè)服務(wù)器內(nèi)存為2GB,那么“max_children”設(shè)置為40個(gè)比較合適,即20M * 40 = 800M,這在峰值時(shí)所有PHP-CGI所耗內(nèi)存在800M以內(nèi),低于服務(wù)器有效內(nèi)存。
請(qǐng)求執(zhí)行時(shí)間過(guò)長(zhǎng)會(huì)導(dǎo)致“504 Gateway Time-out”錯(cuò)誤,而“max_children”設(shè)置過(guò)小,比如5-10個(gè),php-cgi會(huì)“很累”,處理速度慢,占用的CPU也很高,可能引發(fā)“502 Bad gateway”錯(cuò)誤。
max_children較好的設(shè)置方式根據(jù)req/s(吞吐率,單位時(shí)間里服務(wù)器處理的最大請(qǐng)求數(shù))來(lái)設(shè)置,若程序是 100 req/s 的處理能力,那么設(shè)置為 100就比較合適,這是動(dòng)態(tài)來(lái)調(diào)整的。
request_terminate_timeout 多大合適?
如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有循環(huán)或BUG的話你可以直接將”request_terminate_timeout”設(shè)置成0s。0s的含義是讓PHP-CGI一直執(zhí)行下去而沒有時(shí)間限制。否則,給”request_terminate_timeout”賦一個(gè)值,根據(jù)服務(wù)器性能進(jìn)行設(shè)定,一般來(lái)說(shuō)性能越好你可以設(shè)置越高,20分鐘-30分鐘都可以。例如,我的服務(wù)器PHP腳本需要長(zhǎng)時(shí)間運(yùn)行,有的可能會(huì)超過(guò)10分鐘因此我設(shè)置了900秒,這樣不會(huì)導(dǎo)致PHP-CGI死掉而出現(xiàn)“502 Bad gateway”錯(cuò)誤。
pm.max_children = 300; 靜態(tài)方式下開啟的php-fpm進(jìn)程數(shù)量
pm.start_servers = 20; 動(dòng)態(tài)方式下的起始php-fpm進(jìn)程數(shù)量
pm.min_spare_servers = 5; 動(dòng)態(tài)方式下的最小php-fpm進(jìn)程數(shù)量
pm.max_spare_servers = 35; 動(dòng)態(tài)方式下的最大php-fpm進(jìn)程數(shù)量
數(shù)值設(shè)置,參考自己的實(shí)際硬件配置,可以參考“總內(nèi)存/30M”來(lái)計(jì)算。例如,對(duì)于8GB內(nèi)存的服務(wù)器,可以設(shè)置為100個(gè)進(jìn)程。
pm = dynamic; 表示使用哪種進(jìn)程數(shù)量管理方式
pm = static; 表示php-fpm進(jìn)程數(shù)是靜態(tài)的,進(jìn)程數(shù)自始至終都是pm.max_children指定的數(shù)量,不再增加或減少。
如何判斷我選擇“pm = dynamic”還是“pm = static”?
對(duì)于內(nèi)存大的服務(wù)器(比如8G以上)來(lái)說(shuō),用靜態(tài)的max_children實(shí)際上更為妥當(dāng),因?yàn)檫@樣不需要進(jìn)行額外的進(jìn)程數(shù)目控制,會(huì)提高效率。對(duì)于內(nèi)存稍微小點(diǎn)的服務(wù)器或VPS,動(dòng)態(tài)方式更合適,因?yàn)榭梢越Y(jié)束掉多余的進(jìn)程,回收釋放一些內(nèi)存。具體最大數(shù)量根據(jù)“總內(nèi)存/20M”得到。
配置php慢日志,用于監(jiān)控
request_slowlog_timeout = 10s
slowlog = log/$pool.log.slow
配置php-fpm進(jìn)程可打開的最大文件句柄數(shù)
rlimit_files = 1024
默認(rèn)1024,此值可以不需要配置
如果你使用的寶塔管理的服務(wù)器,可在php軟件中進(jìn)行相應(yīng)的性能設(shè)置,如下圖:
優(yōu)化后,服務(wù)器的負(fù)載會(huì)有所降低。但是其實(shí)質(zhì)問題應(yīng)該跟網(wǎng)站程序有很大的關(guān)系,除了對(duì)服務(wù)器進(jìn)行配置外,還應(yīng)檢查網(wǎng)站日志。