一、名詞解釋
CGI是Common Gateway Interface(通用網管協議),用於讓交互程序和Web服務器通信的協議。負責處理URL的請求,啟動一個進程,將客戶端發送的數據作為輸入,有Web服務器收集程序的輸出並加上合適的頭部,再發送回客戶端。
FastCGI是基於CGI的增強版本的協議,不同於創建新的進程來服務請求,使用持續的進程和創建的子進程來處理連串的進程,這些進程由FastCGI服務器管理,開銷更小,效率更高。
PHP-FPM是PHP實現的FastCGI Process Manager(FastCGI進程管理器),用於替換PHP FastCGI的大部分功能,適用於高負載網站。支持的功能如:
1. 平滑停止/啟動的高級進程管理功能
2. 慢日志記錄腳本
3. 動態/靜態子進程產生
4. 基於php.ini的配置文件
二、PHP-FPM配置
PHP-FPM配置文件為php-fpm.conf (例如:php-fpm容器中的/usr/local/etc/php-fpm.d/xlaravel.pool.conf)。下面所有的子進程均指php-fpm進程,可以在終端通過 ps aux |grep php 查看到。
- 顯示 php-fpm: pool www 的代表work子進程(實際處理請求)
- 顯示 php-fpm: process master 的代表master主進程(負責管理work子進程)
user = www-data group = www-data #啟動進程的帳戶和組 listen = 0.0.0.0:9000 pm = dynamic #如何控制子進程,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子進程數。如果選擇dynamic,則由以下參數決定: pm.max_children = 20 #,子進程最大數 pm.start_servers = 45 #,啟動時的進程數 pm.min_spare_servers = 30 #,保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程 pm.max_spare_servers = 60 #,保證空閑進程數最大值,如果空閑進程大於此值,此進行清理 request_terminate_timeout = 300 #設置單個請求的超時中止時間. 該選項可能會對php.ini設置中的’max_execution_time’因為某些特殊原因沒有中止運行的腳本有用. 設置為 ’0′ 表示 ‘Off’.當經常出現502錯誤時可以嘗試更改此選項。 catch_workers_output = yes #重定向運行過程中的stdout和stderr到主要的錯誤日志文件中. 如果沒有設置, stdout 和 stderr 將會根據FastCGI的規則被重定向到 /dev/null . 默認值: 空.
php-fpm優化參數介紹 他們分別是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。 pm:表示使用那種方式,有兩個值可以選擇,就是static(靜態)或者dynamic(動態)。 下面4個參數的意思分別為: pm.max_children:靜態方式下開啟的php-fpm進程數量 pm.start_servers:動態方式下的起始php-fpm進程數量 pm.min_spare_servers:動態方式下的最小php-fpm進程數 pm.max_spare_servers:動態方式下的最大php-fpm進程數量 區別: 如果dm設置為 static,那么其實只有pm.max_children這個參數生效。系統會開啟設置數量的php-fpm進程。 如果dm設置為 dynamic,那么pm.max_children參數失效,后面3個參數生效。 系統會在php-fpm運行開始 的時候啟動pm.start_servers個php-fpm進程, 然后根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數
ps auxw|head -1;ps auxw|sort -rn -k4|head -40 # 查看消耗內存最多的前40個進程 ps -fe |grep "php-fpm"|grep "pool"|wc -l # 查看服務器上一共開了多少的 php-cgi 進程