PHP配置優化:php-fpm配置解讀


PHP-FPM是一個PHP FastCGI管理器,php-fpm.conf配置文件用於控制PHP-FPM管理進程的相關參數,比如工作子進程的數量、運行權限、監聽端口、慢請求等等。
我們在編譯安裝PHP的時,在./configure的時候帶 –enable-fpm參數即可開啟PHP-FPM。PHP-FPM配置文件為 php-fpm.conf,其語法類似 php.ini 。一般我們可以在安裝目錄中找到:/usr/local/php/etc/php-fpm.conf,如果沒有的話,那就可能在/usr/local/php/etc/php-fpm.d/.conf*。

全局配置

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

pid:設置PID文件的位置。

error_log:錯誤日志的位置

log_level:錯誤級別。可用級別為:alert(必須立即處理),error(錯誤情況),warning(警告情況),notice(一般重要信息),debug(調試信息)。默認:notice。

進程池配置

在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置,在默認的php-fpm進程池的配置文件中,開頭是[www]。

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 51
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 40
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

listen:設置接受 FastCGI 請求的地址。可用格式為:'ip:port','port','/path/to/unix/socket'。我們這里配置/tmp/php-cgi.sock,使用Unix域Socket因為不走網絡,可以提高Nginx和php-fpm通信的性能,但在高並發的情況下可能不穩定,這時我們需要設置下一個參數backlog。當然你也可以設置為127.0.0.1:9000,但我不建議使用。據nginx.conf中的配置fastcgi_pass unix:/tmp/php-cgi.sock;設置PHP監聽,:讓Nginx支持PHP。

listen.backlog:設置 listen 的半連接隊列長度,-1表示無限制,由操作系統決定。

listen.allowed_clients:允許訪問FastCGI進程的IP白名單,設置any為不限制IP,如果要設置其他主機的nginx也能訪問這台FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每個地址是用逗號分隔. 如果沒有設置或者為空,則允許任何服務器請求連接。我把它設置為127.0.0.1,即只有當前設備能把請求轉發給php-fpm進程池。

listen.owner:運行所使用的用戶和組,我們這里設置為www用戶組,權限為 0666。

listen.group:同上,設置為www。

listen.mode:同上,設置為0666。

user:FPM 進程運行的系統用戶。必須設置,這里我們設置為www,即非root用戶。

group:FPM 進程運行的系統用戶組。如果沒有設置,則默認用戶的組被使用。

pm:設置進程管理器如何管理子進程。可用值:static,ondemand,dynamic。dynamic表示php-fpm進程數是動態的,最開始是pm.start_servers指定的數量,如果請求較多,則會自動增加,保證空閑的進程數不小於pm.min_spare_servers,如果進程數較多,也會進行相應清理,保證多余的進程數不多於pm.max_spare_servers。static表示php-fpm進程數是靜態的, 進程數自始至終都是pm.max_children指定的數量,不再增加或減少。

pm.max_children:靜態方式下開啟的php-fpm進程數量,這個設置沒有絕對正確的值。一般應用的PHP進程需要消耗10~30MB內存,假設我們使用的服務器設備為這個PHP-FPM進程池分配1024M內存,那么我們可以將這個值設置為(1024MB內存)/(每個進程使用20M)= 51個進程。

pm.start_servers:動態方式下的起始php-fpm進程數量,即當PHP-FPM啟動時,PHP-FPM進程池中立即可用的進程數,我一般設置這個值為10。

pm.min_spare_servers:動態方式下的最小php-fpm進程數量,如果PHP空閑時,PHP-FPM進程池中科院存在進程數量的最小值。這個值一般與pm.start_servers設置的值一樣,所以我這里也設置為10。

pm.max_spare_servers:動態方式下的最大php-fpm進程數量,如果空閑進程大於此值,則進行清理。這個值設置的要比pm.start_servers大。

對於內存大的服務器(比如8G以上)來說,建議指定靜態的max_children值,因為這樣不需要進行額外的進程數目控制,會提高效率。因為頻繁開關php-fpm進程也會有時滯,所以內存夠大的情況下開靜態效果會更好。數量也可以根據 內存/30M 得到,比如8GB內存可以設置為100,那么php-fpm耗費的內存就能控制在 2G-3G的樣子。如果內存稍微小點,比如1G,那么指定靜態的進程數量更加有利於服務器的穩定。這樣可以保證php-fpm只獲取夠用的內存,將不多的內存分配給其他應用去使用,會使系統的運行更加暢通。

request_terminate_timeout:最大執行時間, 在php.ini中也可以進行配置(max_execution_time),這個是用來處理因為PHP執行時間超長而報502錯誤的解決。

request_slowlog_timeout:當一個請求超過該設置的超時時間后,就會將對應的PHP調用堆棧信息完整寫入到慢日志中。 設置為 '0' 表示 'Off',正常生產環境中我們把它設置為0。

slowlog:慢請求的記錄日志。

我們有時候會經常飽受500,502問題困擾。當nginx收到如上錯誤碼時,可以確定后端php-fpm解析php出了某種問題,比如,執行錯誤,執行超時。這個時候,我們是可以開啟慢日志功能的。比如設置request_slowlog_timeout:10s,當一個請求時長超過該設置的超時時間10秒后,就會將對應的PHP調用堆棧信息完整寫入到慢日志中。 php-fpm慢日志會記錄下進程號,腳本名稱,具體哪個文件哪行代碼的哪個函數執行時間過長等信息。

設置好后,執行以下命令重啟PHP-FPM主進程使配置生效。

/etc/init.d/php-fpm restart


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM