2022年9月27日15:45:04
FastCGI(Fast Common Gateway Interface)快速通用網(wǎng)關接口,是 CGI 的增強版本,為了提升 CGI 的性能而生。
PHP-FPM(FastCGI Process Manager for PHP)PHP 的 FastCGI 進程管理器。FastCGI 只是一個協(xié)議規(guī)范,需要某個程序去具體實現(xiàn),而 PHP-FPM 就是這個具體實現(xiàn)。
ps -ef|grep php
root 2178 1 0 13:28 ? 00:00:00 php-fpm: master process (/usr/local/php80/etc/php-fpm.conf)
www 2179 2178 0 13:28 ? 00:00:00 php-fpm: pool www
www 2180 2178 0 13:28 ? 00:00:00 php-fpm: pool www
root 2248 1 0 13:29 ? 00:00:00 php-fpm: master process (/usr/local/php74/etc/php-fpm.conf)
www 2250 2248 0 13:29 ? 00:00:00 php-fpm: pool www
www 2251 2248 0 13:29 ? 00:00:00 php-fpm: pool www
這里可以看到fpm是一個常駐內(nèi)存的master -> worker的多進程工作模式
fpm是一個php的工作方式,請注意!
強調(diào)一下,工作模式和php語言本身實現(xiàn)任何功能基本毫無影響,以上都是通過通信協(xié)議互相通信而已
https://www.php.net/manual/zh/function.php-sapi-name.php
返回接口類型的小寫字符串, 或者在失敗時返回 false。
對應的fpm代碼的如下:
D:\SRC_CODE\20220824\PHP-SRC_1\SAPI
├─apache2handler
├─cgi
│ └─tests
├─cli
│ └─tests
├─embed
├─fpm
│ ├─fpm
│ │ └─events
│ └─tests
├─fuzzer
│ ├─corpus
│ │ ├─exif
│ │ ├─json
│ │ └─unserialize
│ └─dict
├─litespeed
└─phpdbg
└─tests
└─bug73615
fpm自身是什么呢?
PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events> ls
目錄: D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/9/28 14:04 5872 devpoll.c
-a---- 2022/9/28 14:04 1228 devpoll.h
-a---- 2022/9/28 14:04 5192 epoll.c
-a---- 2022/9/28 14:04 1220 epoll.h
-a---- 2022/9/28 14:04 4876 kqueue.c
-a---- 2022/9/28 14:04 1224 kqueue.h
-a---- 2022/9/28 14:04 6465 poll.c
-a---- 2022/9/28 14:04 1216 poll.h
-a---- 2022/9/28 14:04 4931 port.c
-a---- 2022/9/28 14:04 1216 port.h
-a---- 2022/9/28 14:04 4187 select.c
-a---- 2022/9/28 14:04 1224 select.h
PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm> ls
目錄: D:\src_code\20220824\php-src_1\sapi\fpm\fpm
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/9/28 14:04 events
-a---- 2022/9/28 14:04 2966 fpm.c
-a---- 2022/9/28 14:04 1160 fpm.h
-a---- 2022/9/28 14:04 1951 fpm_arrays.h
-a---- 2022/9/28 14:04 4127 fpm_atomic.h
-a---- 2022/9/28 14:04 12090 fpm_children.c
-a---- 2022/9/28 14:04 901 fpm_children.h
........省略
fpm是c實現(xiàn)了epoll kqueue poll select的event,的master worker的進程管理器,照理來說不會慢,才對
參考:http://m.wtbis.cn/doc/webman/others/performance.html
其實主要是因為composer的出現(xiàn),導致框架的vendor越來越龐大,一個簡單laravel web項目vendor
[root@ vendor]# ls -lR| grep "^-" | wc -l
7066
[root@ vendor]# du -sh
57M
每次啟動就需要加載57M大小的7K+的文件,消耗很多磁盤IO和創(chuàng)建框架實例,消耗巨大
就導致laravel這么“重”的框架,訪問速度就很慢
有什么解決辦法呢?
開啟opcache
ops性能提升至少5-10倍左右,可以看下你的php.ini是否開啟(api請求,混編的頁面性能提升更?。?br />
php -m
是否包含Zend OPcache
設置pm.max_requests=0,就是不歸還,你可以把這個設置成pm.max_requests=50,就請求了50個之后,就釋放內(nèi)存給系統(tǒng)
如果max_requests太小,就會不停的請求內(nèi)存,釋放內(nèi)存性能有影響
設置成0,就會不釋放內(nèi)存,造成系統(tǒng)工作內(nèi)存資源太小,導致系統(tǒng)越來越卡
如何設置合理的配置呢?
1,pm = dynamic,這樣由fpm自己調(diào)整
2,需要更高性能的ops,根據(jù)自己大小簡單計算一下,比如4核8G內(nèi)存,8G至少留1g給系統(tǒng),php單個變量大小是128M,以此為最大基準,(7*1024)/128 = 56,這里是純fpm的機器,不包含nginx redis等服務,如果在同一個服務器就扣除其他運行內(nèi)存
pm = static
pm.max_children = 56
pm.start_servers = 20
pm.max_requests = 200
這里全部是理論數(shù)值
cat /proc/1197/status
cat /proc/$(pid)/status
查看
VmPeak: 247844 kB
VmSize: 234784 kB ——進程占用的虛擬內(nèi)存大小
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 34296 kB
VmRSS: 21660 kB ——占用的物理內(nèi)存 約21M
通常一個fpm的工作內(nèi)存是幾十M,上訴的設置是很寬松的,但是設置過多的children數(shù)量會受cpu的影響,頻繁切換cpu上下文的去執(zhí)行會造成一些性能影響,可以通過觀察服務器的訪問量,服務器內(nèi)存和cpu的使用量去了解最適合你業(yè)務系統(tǒng)的配置,需要一個過程。
比如你的業(yè)務系統(tǒng)查詢多,或者計算多,或者業(yè)務系統(tǒng)不同會對fpm設置都會需要微調(diào)
那么避免上述的所有的問題,開發(fā)一個常駐內(nèi)存,不需要頻繁加載文件,一個master worker的和其他組件通信可以是常駐內(nèi)存連接
的框架,那么php的性能是不是可以有非常大的提升,答案是:完全可以
一個完全由php開發(fā)的常駐內(nèi)存的mvc框架 基于workerman的webman就是一個很強大的php高性能框架,完美的避開了fpm的缺點
nginx和fpm通信協(xié)議是FastCGI,fpm有兩種對接模式,端口和sock
location ~ \.php(.*)$ {
fastcgi_pass unix:/usr/local/php80/php-fpm.sock;
#fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
如果可以使用sock性能當然是更好的,但是nginx和fpm是分離的監(jiān)聽端口模式會更好一點,因為安全也是一個很大的因素
workerman也實現(xiàn)了FastCGI協(xié)議
php實現(xiàn)fastcgi
https://github.com/lisachenko/protocol-fcgi
nginx對接fastcgi
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
FastCGI協(xié)議標準
https://www.infoq.cn/article/vicwtitzvk7b4ynoej3e
https://www.mit.edu/~yandros/doc/specs/fcgi-spec.html
https://www.myway5.com/index.php/2018/07/19/fastcgi-%E8%A7%84%E8%8C%83%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91/
https://www.imooc.com/article/details/id/45163
源碼
https://github.com/php/php-src/blob/master/main/fastcgi.c
如果你想對fastcgi有更多的了解
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
你就會發(fā)現(xiàn),nginx想的配置文件 fastcgi.conf fastcgi_params里面參數(shù)的意思
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
剩下就是最重要的配置文件,下面是基于php8.0的中文翻譯版
php-fpm.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM 配置 ;
;;;;;;;;;;;;;;;;;;;;;
; 此配置文件中的所有相對路徑都是相對于 PHP 的安裝
; 前綴 (/usr/local/php80)。 這個前綴可以通過使用
; 命令行中的“-p”參數(shù)。
;;;;;;;;;;;;;;;;;;
; 全局 選項 ;
;;;;;;;;;;;;;;;;;;
[global]
; pid文件
; 注意:默認前綴是 /usr/local/php80/var
; 默認值:無
;pid = 運行/php-fpm.pid
pid = /usr/local/php80/php-fpm.pid
; 錯誤日志文件
; 如果它設置為“syslog”,日志將被發(fā)送到 syslogd 而不是被寫入
; 到本地文件中。
; 注意:默認前綴是 /usr/local/php80/var
; 默認值:log/php-fpm.log
;error_log = log/php-fpm.log
error_log = /data/log/php80/php-fpm.log
; syslog_facility 用于指定什么類型的程序正在記錄
; 信息。 這讓 syslogd 指定來自不同設施的消息
; 會以不同方式處理。
; 請參閱 syslog(3) 以獲取可能的值(例如 daemon equiv LOG_DAEMON)
; 默認值:daemon
;syslog.facility = daemon
; syslog_ident 附加在每條消息之前。 如果您有多個 FPM
; 在同一臺服務器上運行的實例,您可以更改默認值
; 這必須滿足共同的需求。
; 默認值:php-fpm
;syslog.ident = php-fpm
; 日志級別
; 可能的值:alert, error, warning, notice, debug
; 默認值: notice
;log_level = notice
; 單行中字符數(shù)的日志限制(日志條目)。 如果
; 行超過限制,它被包裹在多行上。 限制是為了
; 所有記錄的字符,包括消息前綴和后綴(如果存在)。 然而
; 換行符不計入其中,因為它僅在
; 記錄到文件描述符。 這意味著新行字符不存在
; 登錄到系統(tǒng)日志時。
; 默認值: 1024
;log_limit = 4096
; 日志緩沖指定日志行是否被緩沖,這意味著
; 行在單個寫入操作中寫入。 如果該值為 false,則
; 數(shù)據(jù)直接寫入文件描述符。 這是一個實驗
; 可以潛在地提高日志記錄性能和內(nèi)存使用的選項
; 對于一些繁重的日志記錄場景。 如果記錄到 syslog,則忽略此選項
; 因為它必須始終被緩沖。
; 默認值: yes
;log_buffering = no
; 如果此數(shù)量的子進程在此時間內(nèi)以 SIGSEGV 或 SIGBUS 退出
; 由 Emergency_restart_interval 設置的時間間隔,然后 FPM 將重新啟動。 一個值
; “0”表示“關閉”。
; 默認值: 0
;emergency_restart_threshold = 0
; Emergency_restart_interval 使用的時間間隔來確定何時
; 將啟動正常重啟。 這對于解決問題很有用
; 加速器共享內(nèi)存中的意外損壞。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)或 d(ays)
; 默認單位:秒
; 默認值: 0
;emergency_restart_interval = 0
; 子進程等待主進程對信號做出反應的時間限制。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)或 d(ays)
; 默認單位:秒
; 默認值:0
;process_control_timeout = 0
; FPM 將分叉的最大進程數(shù)。 這是為了控制
; 在許多池中使用動態(tài) PM 時的全局進程數(shù)。
; 謹慎使用。
; 注意:值為 0 表示沒有限制
; 默認值:0
; process.max = 128
; 指定 nice(2) 優(yōu)先級以應用于主進程(僅當設置時)
; 該值可以從 -19(最高優(yōu)先級)到 20(最低優(yōu)先級)變化
; 注意: - 僅當 FPM 主進程以 root 身份啟動時才有效
; - 池進程將繼承主進程優(yōu)先級
; 除非另有說明
; 默認值: no set
; process.priority = -19
; 將 FPM 發(fā)送到后臺。 設置為“否”以將 FPM 保持在前臺進行調(diào)試。
; 默認值: yes
;daemonize = yes
; 為主進程設置打開文件描述符 rlimit。
; 默認值: system defined value
;rlimit_files = 1024
; 為主進程設置最大核心大小 rlimit。
; 可能的值:“無限”或大于或等于 0 的整數(shù)
; 默認值: system defined value
;rlimit_core = 0
; 指定 FPM 將使用的事件機制。 以下是可用的:
; - select (any POSIX os)
; - poll (any POSIX os)
; - epoll (linux >= 2.5.44)
; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll (Solaris >= 7)
; - port (Solaris >= 10)
; Default Value: not set (auto detection)
;events.mechanism = epoll
; 當 FPM 使用 systemd 集成構(gòu)建時,指定間隔,
; 在幾秒鐘內(nèi),在向 systemd 的健康報告通知之間。
; 設置為 0 以禁用。
; 可用單位:s(秒)、m(整數(shù))、h(我們的)
; 默認單位:秒
; 默認值: 10
;systemd_interval = 10
;;;;;;;;;;;;;;;;;;;;
; 線程池定義 ;
;;;;;;;;;;;;;;;;;;;;
; 可以使用不同的偵聽方式啟動多個子進程池
; 端口和不同的管理選項。 池的名稱將是
; 用于日志和統(tǒng)計信息。 池的數(shù)量沒有限制
; FPM可以處理。 無論如何,您的系統(tǒng)會告訴您:)
; 包括一個或多個文件。 如果 glob(3) 存在,它用于包含一堆
; 來自 glob(3) 模式的文件。 該指令可以在任何地方使用
; 文件。
; 也可以使用相對路徑。 它們的前綴為:
; - 全局前綴(如果已設置)(-p 參數(shù))
; - /usr/local/php80 otherwise
include=/usr/local/php80/etc/php-fpm.d/*.conf
www.conf
; 啟動一個名為“www”的新池。
; 變量 $pool 可以在任何指令中使用,并將被替換為
; 池名稱(此處為“www”)
[www]
; 每個池前綴
; 它僅適用于以下指令:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; 如果未設置,則應用全局前綴(或 /usr/local/php80)。
; 注意:該指令也可以相對于全局前綴。
; 默認值: none
;prefix = /path/to/pools/$pool
; Unix 用戶/進程組
; 注意:用戶是強制性的。 如果未設置組,則默認用戶的組
; 將會被使用。
user = www
group = www
; 接受 FastCGI 請求的地址。
; 有效的語法是:
; 'ip.add.re.ss:port' - 在 TCP 套接字上偵聽特定 IPv4 地址
; 特定端口;
; '[ip:6:addr:ess]:port' - 在 TCP 套接字上監(jiān)聽特定 IPv6 地址
; 特定端口;
; 'port' - 在 TCP 套接字上偵聽所有地址
; (IPv6 和 IPv4 映射)在特定端口上;
; '/path/to/unix/socket' - 監(jiān)聽 unix 套接字。
; 注意:此值是強制性的。
;listen = 127.0.0.1:9000
listen = /usr/local/php80/php-fpm.sock
; 設置listen(2) 積壓的任務。
; 默認值:511(FreeBSD 和 OpenBSD 上為 -1)
;listen.backlog = 511
; 設置 unix 套接字的權限,如果使用的話。 在 Linux 中,讀/寫
; 必須設置權限才能允許來自 Web 服務器的連接。 許多
; BSD 派生系統(tǒng)允許連接而不管權限。 主人
; 和組可以通過名稱或它們的數(shù)字 ID 來指定。
; 默認值:用戶和組設置為運行用戶
; 模式設置為 0660
listen.owner = www
listen.group = www
listen.mode = 0660
; 當支持 POSIX 訪問控制列表時,您可以使用
; 在這些選項中,value 是用戶/組名稱的逗號分隔列表。
; 設置后,listen.owner 和 listen.group 將被忽略
;listen.acl_users =
;listen.acl_groups =
; 允許連接的 FastCGI 客戶端的地址列表(IPv4/IPv6)。
; 相當于原來的FCGI_WEB_SERVER_ADDRS環(huán)境變量
; PHP FCGI (5.2.2+)。 僅對 tcp 偵聽套接字才有意義。 每個地址
; 必須用逗號分隔。 如果此值留空,則連接將是
; 從任何 IP 地址接受。
; 默認值: any
;listen.allowed_clients = 127.0.0.1
; 指定 nice(2) 優(yōu)先級以應用于池進程(僅當設置時)
; 該值可以從 -19(最高優(yōu)先級)到 20(較低優(yōu)先級)變化
; 注意: - 僅當 FPM 主進程以 root 身份啟動時才有效
; - 池進程將繼承主進程優(yōu)先級
; 除非另有說明
; 默認值: no set
; process.priority = -19
; 設置進程可轉(zhuǎn)儲標志 (PR_SET_DUMPABLE prctl) 即使進程用戶
; 或組不同于主進程用戶。 它允許創(chuàng)建進程
; 池用戶的核心轉(zhuǎn)儲和 ptrace 進程。
; 默認值: no
; process.dumpable = yes
;選擇進程管理器將如何控制子進程的數(shù)量。
;可能的值:
; static - 固定數(shù)量(pm.max_children)的子進程;
; dynamic - 子進程的數(shù)量是根據(jù)以下指令動態(tài)設置的。 使用此流程管理,將始終至少有
; 1 個子進程。
; pm.max_children - 可以同時存活的子進程的最大數(shù)量
; pm.start_servers - 啟動子進程的數(shù)量.
; pm.min_spare_servers - 處于“空閑”狀態(tài)(等待處理)的最小孩子數(shù)。 ;
; 如果 “空閑”進程的數(shù)量少于此數(shù)量,則將創(chuàng)建一些子進程。
; pm.max_spare_servers - 處于“空閑”狀態(tài)的最大子節(jié)點數(shù)(等待處理)。
; 如果“空閑”進程的數(shù)量大于這個數(shù)量,那么一些子進程將被殺死。
; ondemand - 啟動時不創(chuàng)建子級。當新請求連接時,子進程才會被forked創(chuàng)建.使用以下參數(shù):
; pm.max_children - 可以同時活著的子進程的最大數(shù)量。
; pm.process_idle_timeout - 空閑進程將被終止的秒數(shù)。
;注意:此值是強制性的。
pm = dynamic
; 當 pm 設置為 'static' 和
; pm 設置為“動態(tài)”或“按需”時的最大子進程數(shù)。
; 此值設置將同時請求的數(shù)量限制
; 服務。 等效于帶有 mpm_prefork 的 ApacheMaxClients 指令。
; 等效于原始 PHP 中的 PHP_FCGI_CHILDREN 環(huán)境變量
; 電腦動畫。 以下默認值基于沒有太多資源的服務器。 別
; 忘記調(diào)整 pm.* 以滿足您的需求。
; 注意:當 pm 設置為“靜態(tài)”、“動態(tài)”或“按需”時使用
; 注意:此值是強制性的。
pm.max_children = 20
; 啟動時創(chuàng)建的子進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 默認值:(min_spare_servers + max_spare_servers) / 2
pm.start_servers = 2
; 所需的最小空閑服務器進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 注意:當 pm 設置為“動態(tài)”時為必填項
pm.min_spare_servers = 1
; 所需的最大空閑服務器進程數(shù)。
; 注意:僅在 pm 設置為“動態(tài)”時使用
; 注意:當 pm 設置為“動態(tài)”時為必填項
pm.max_spare_servers = 3
; 空閑進程將被殺死的秒數(shù)。
; 注意:僅在 pm 設置為 'ondemand' 時使用
; 默認值: 10s
;pm.process_idle_timeout = 10s;
; 每個子進程在重生之前應執(zhí)行的請求數(shù)。
; 這對于解決 3rd 方庫中的內(nèi)存泄漏問題很有用。 為了
; 無休止的請求處理指定“0”。 等效于 PHP_FCGI_MAX_REQUESTS。
; 默認值: 0
pm.max_requests = 200
; 查看 FPM 狀態(tài)頁面的 URI。 如果未設置此值,則不會有 URI
; 識別為狀態(tài)頁面。 它顯示以下信息:
; pool - 池的名稱
; process manager - static, dynamic or ondemand;
; start time - FPM 開始的日期和時間;
; start since - 自 FPM 開始以來的秒數(shù);
; accepted conn - 池接受的請求數(shù);
; listen queue - 待處理隊列中的請求數(shù) 連接(參見listen(2)中的積壓任務);
; max listen queue - 自 FPM 啟動以來,待處理連接隊列中的最大請求數(shù)
; listen queue len - 掛起連接的套接字隊列的大?。?; idle processes - 空閑進程的數(shù)量;
; active processes - 活動進程的數(shù)量;
; total processes - 空閑+活動進程的數(shù)量;
; max active processes - 自 FPM 啟動以來的最大活動進程數(shù);
; max children reached - 當 pm 嘗試啟動更多子進程時,已達到進程限制的次數(shù)(僅適用于
; pm 'dynamic' 和 'ondemand');
; 值實時更新。
; Example output:
; pool: www
; process manager: static
; start time: 01/Jul/2011:17:53:49 +0200
; start since: 62636
; accepted conn: 190460
; listen queue: 0
; max listen queue: 1
; listen queue len: 42
; idle processes: 4
; active processes: 11
; total processes: 15
; max active processes: 12
; max children reached: 0
;
; 默認情況下,狀態(tài)頁面輸出格式為 text/plain。 通過任一
; 查詢字符串中的'html'、'xml'或'json'會返回對應的
; output syntax. Example:
; http://www.foo.bar/status
; http://www.foo.bar/status?json
; http://www.foo.bar/status?html
; http://www.foo.bar/status?xml
;
; 默認情況下,狀態(tài)頁面只輸出簡短的狀態(tài)。 傳遞“完整”
; 查詢字符串還將返回每個池進程的狀態(tài)。
; Example:
; http://www.foo.bar/status?full
; http://www.foo.bar/status?json&full
; http://www.foo.bar/status?html&full
; http://www.foo.bar/status?xml&full
; 每個進程的完整狀態(tài)返回:
; pid - 進程的PID;
; state - 進程的狀態(tài)(空閑,運行,...);
; start time - 流程開始的日期和時間;
; start since - 自進程開始以來的秒數(shù);
; requests - 進程已處理的請求數(shù);
; request duration - 請求的持續(xù)時間(以 μs 為單位);
; request method - 請求方法(GET,POST,...);
; request URI - 帶有查詢字符串的請求 URI;
; content length - 請求的內(nèi)容長度(僅限 POST)
; user - 用戶(PHP_AUTH_USER)(如果未設置,則為“-”);
; script - 調(diào)用的主腳本(如果未設置,則為“-”);
; last request cpu - 如果進程未處于空閑狀態(tài),則最后一個請求消耗的 %cpu 始終為 0,
; 因為 CPU 計算是在請求處理終止時完成的;
; last request memory - 最后一個請求消耗的最大內(nèi)存量,如果進程不處于空閑狀態(tài),
; 則它始終為 0,因為在請求處理終止時完成了內(nèi)存計算;
; 如果進程處于空閑狀態(tài),則信息與
; 進程服務的最后一個請求。 否則信息與
; 當前正在處理的請求。
; Example output:
; ************************
; pid: 31330
; state: Running
; start time: 01/Jul/2011:17:53:49 +0200
; start since: 63087
; requests: 12808
; request duration: 1250261
; request method: GET
; request URI: /test_mem.php?N=10000
; content length: 0
; user: -
; script: /home/fat/web/docs/php/test_mem.php
; last request cpu: 0.00
; last request memory: 0
;
; 注意:有一個實時 FPM 狀態(tài)監(jiān)控示例網(wǎng)頁可用
; 它位于:/usr/local/php80/share/php/fpm/status.html
;
; 注意:該值必須以斜杠 (/) 開頭。 該值可以是
; 任何東西,但使用 .php 擴展名或它可能不是一個好主意
; 可能與真實的 PHP 文件沖突。
; 默認值: not set
;pm.status_path = /status
; 接受 FastCGI 狀態(tài)請求的地址。 這創(chuàng)造了一個新的
; 可以獨立處理請求的隱形池。 這很有用
; 如果主池忙于長時間運行的請求,因為它仍然可能
; 在完成長時間運行的請求之前獲取狀態(tài)。
;
; 有效的語法是:
; 'ip.add.re.ss:port' - 在 TCP 套接字上偵聽特定端口上的特定 IPv4 地址;
; '[ip:6:addr:ess]:port' - 在 TCP 套接字上偵聽特定端口上的特定 IPv6 地址;
; 'port' - 在 TCP 套接字上偵聽特定端口上的所有地址(IPv6和IPv4 映射);
; '/path/to/unix/socket' - 在 Unix 套接字上監(jiān)聽。
; 默認值: value of the listen option
;pm.status_listen = 127.0.0.1:9001
; 調(diào)用FPM監(jiān)控頁面的ping URI。 如果未設置此值,則否
; URI 將被識別為 ping 頁面。 這可以用來從外部測試
; FPM 是活躍的并且正在響應,或者
; - 創(chuàng)建 FPM 可用性圖表(rrd 等);
; - 如果服務器沒有響應(負載平衡),則從組中刪除它;
; - 為運營團隊觸發(fā)警報 (24/7)。
; 注意:該值必須以斜杠 (/) 開頭。 該值可以是
; 任何東西,但使用 .php 擴展名或它可能不是一個好主意
; 可能與真實的 PHP 文件沖突。
; 默認值: not set
;ping.path = /ping
; 該指令可用于自定義 ping 請求的響應。 這
; 響應格式為文本/純文本,響應代碼為 200。
; 默認值: pong
;ping.response = pong
; 訪問日志文件
; Default: not set
;access.log = log/$pool.access.log
; 訪問日志格式。
; 允許使用以下語法
; %%: the '%' character
; %C: %CPU used by the request
; it can accept the following format:
; - %{user}C for user CPU only
; - %{system}C for system CPU only
; - %{total}C for user + system CPU (default)
; %d: time taken to serve the request
; it can accept the following format:
; - %{seconds}d (default)
; - %{milliseconds}d
; - %{mili}d
; - %{microseconds}d
; - %{micro}d
; %e: an environment variable (same as $_ENV or $_SERVER)
; it must be associated with embraces to specify the name of the env
; variable. Some examples:
; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
; %f: script filename
; %l: content-length of the request (for POST request only)
; %m: request method
; %M: peak of memory allocated by PHP
; it can accept the following format:
; - %{bytes}M (default)
; - %{kilobytes}M
; - %{kilo}M
; - %{megabytes}M
; - %{mega}M
; %n: pool name
; %o: output header
; it must be associated with embraces to specify the name of the header:
; - %{Content-Type}o
; - %{X-Powered-By}o
; - %{Transfert-Encoding}o
; - ....
; %p: PID of the child that serviced the request
; %P: PID of the parent of the child that serviced the request
; %q: the query string
; %Q: the '?' character if query string exists
; %r: the request URI (without the query string, see %q and %Q)
; %R: remote IP address
; %s: status (response code)
; %t: server time the request was received
; it can accept a strftime(3) format:
; %d/%b/%Y:%H:%M:%S %z (default)
; The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
; %T: time the log has been written (the request has finished)
; it can accept a strftime(3) format:
; %d/%b/%Y:%H:%M:%S %z (default)
; The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
; %u: remote user
;
; Default: "%R - %u %t \"%m %r\" %s"
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
; 慢請求的日志文件
; 默認值:未設置
; 注意:如果設置了 request_slowlog_timeout,slowlog 是強制性的
;slowlog = log/$pool.log.slow
slowlog = /data/log/php80/slow.log
; 服務單個請求的超時時間,之后 PHP 回溯將是
; 轉(zhuǎn)儲到“慢日志”文件。 值“0s”表示“關閉”。
; 可用單位:s(econds)(默認)、m(inutes)、h(ours) 或 d(ays)
; 默認值: 0
;request_slowlog_timeout = 0
; 慢日志堆棧跟蹤的深度。
; 默認值: 20
;request_slowlog_trace_depth = 20
; 服務單個請求的超時時間,之后工作進程將
; 被殺。 當 'max_execution_time' ini 選項時應使用此選項
; 由于某種原因不會停止腳本執(zhí)行。 值“0”表示“關閉”。
; 可用單位:s(econds)(默認)、m(inutes)、h(ours) 或 d(ays)
; 默認值: 0
;request_terminate_timeout = 0
; 'request_terminate_timeout' ini 選項設置的超時后未使用
; 應用程序調(diào)用“fastcgi_finish_request”或應用程序完成時
; 正在調(diào)用關閉函數(shù)(通過 register_shutdown_function 注冊)。
; 此選項將啟用無條件應用超時限制
; 即使在這種情況下。
; 默認值: no
;request_terminate_timeout_track_finished = no
; 設置打開文件描述符 rlimit。
; 默認值: system defined value
;rlimit_files = 1024
; 設置最大核心尺寸 rlimit。
; 可能的值:“無限”或大于或等于 0 的整數(shù)
; 默認值: system defined value
;rlimit_core = 0
; chroot 到這個目錄開始。 該值必須定義為
; 絕對路徑。 如果未設置此值,則不使用 chroot。
; 注意:您可以使用 '$prefix' 作為前綴來 chroot 到池前綴或一個
; 的子目錄。 如果未設置池前綴,則使用全局前綴
; 將被使用。
; 注意:chrooting 是一個很好的安全功能,應該在任何時候使用
; 可能的。 但是,所有 PHP 路徑都將相對于 chroot
; (error_log,sessions.save_path,...)。
; 默認值: not set
;chroot =
; chdir 到這個目錄開始。
; 注意:可以使用相對路徑。
; 默認值: current directory or / when chroot
;chdir = /var/www
; 將工作人員標準輸出和標準錯誤重定向到主錯誤日志。 如果未設置,stdout 和
; 根據(jù) FastCGI 規(guī)范,stderr 將被重定向到 /dev/null。
; 注意:在高負載環(huán)境下,這可能會導致頁面延遲
; 處理時間(幾毫秒)。
; 默認值: no
;catch_workers_output = yes
; 使用包含有關信息的前綴和后綴裝飾工作人員輸出
; 寫入日志的孩子以及是否使用了 stdout 或 stderr
; 日志級別和時間。 僅當 catch_workers_output 為 yes 時才使用此選項。
; 設置為“no”將輸出寫入 stdout 或 stderr 的數(shù)據(jù)。
; 默認值: yes
;decorate_workers_output = no
; FPM 工作人員的清晰環(huán)境
; 防止任意環(huán)境變量到達 FPM 工作進程
; 通過在此指定的環(huán)境變量之前清除工作人員中的環(huán)境
; 添加池配置。
; 設置為“no”將使所有環(huán)境變量都可用于 PHP 代碼
; 通過 getenv()、$_ENV 和 $_SERVER。
; 默認值: yes
;clear_env = no
; 限制 FPM 允許解析的主腳本的擴展。 這個可以
; 防止Web服務器端的配置錯誤。 你應該只限制
; FPM轉(zhuǎn).php擴展名,防止惡意用戶使用其他擴展名
; 執(zhí)行php代碼。
; 注意:設置一個空值以允許所有擴展。
; 默認值: .php
;security.limit_extensions = .php .php3 .php4 .php5 .php7
; 傳遞環(huán)境變量,如 LD_LIBRARY_PATH。 所有 $VARIABLEs 都取自
; 當前環(huán)境。
; 默認值: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
; 附加的 php.ini 定義,特定于這個工人池。 這些設置
; 覆蓋之前在 php.ini 中定義的值。 這些指令是
; 與 PHP SAPI 相同:
; php_value/php_flag - 您可以設置可以從 PHP 調(diào)用 'ini_set' 覆蓋的經(jīng)典 ini 定義。
; php_admin_value/php_admin_flag - 這些指令不會被 PHP 調(diào)用 'ini_set' 覆蓋
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
; 定義“擴展”將加載相應的共享擴展
; 擴展目錄。 定義 'disable_functions' 或 'disable_classes' 不會
; 覆蓋以前定義的 php.ini 值,但會附加新值
; 反而。
; 注意:路徑 INI 選項可以是相對的,并且將使用前綴進行擴展
; (pool, global or /usr/local/php80)
; 默認值:除了 php.ini 和
; 在啟動時使用 -d 參數(shù)指定
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
最后談幾點關于配置fpm的線程池的問題:
本質(zhì)和webman基本一樣,但是workerman是基于php實現(xiàn)的,不需要在吧請求由fpm轉(zhuǎn)給php執(zhí)行,直接由nginx交給workerman
請問webman是什么原理呢?老大寫的比較籠統(tǒng)