php-fpm配置解說(shuō)(PHP-FPM參數(shù)優(yōu)調(diào))

[重要通告]如您遇疑難雜癥,本站支持知識(shí)付費(fèi)業(yè)務(wù),掃右邊二維碼加博主微信,可節(jié)省您寶貴時(shí)間哦!

最近處理一些PHP腳本的時(shí)候,要經(jīng)常用到php-fpm,這個(gè)東西真是費(fèi)腦殼,但也沒(méi)有啥好的辦法,該用還得用,不然也沒(méi)有其他啥好的辦法來(lái)替代品!

php-fpm解說(shuō)

php-fpm全名是PHP FastCGI進(jìn)程管理器

php-fpm啟動(dòng)后會(huì)先讀php.ini,然后再讀相應(yīng)的conf配置文件,conf配置可以覆蓋php.ini的配置。

啟動(dòng)php-fpm之后,會(huì)創(chuàng)建一個(gè)master進(jìn)程,監(jiān)聽9000端口(可配置),master進(jìn)程又會(huì)根據(jù)fpm.conf/www.conf去創(chuàng)建若干子進(jìn)程,子進(jìn)程用于處理實(shí)際的業(yè)務(wù)。

當(dāng)有客戶端(比如nginx)來(lái)連接9000端口時(shí),空閑子進(jìn)程會(huì)自己去accept,如果子進(jìn)程全部處于忙碌狀態(tài),新進(jìn)的待accept的連接會(huì)被master放進(jìn)隊(duì)列里,等待fpm子進(jìn)程空閑;

這個(gè)存放待accept的半連接的隊(duì)列有多長(zhǎng),由 listen.backlog 配置。

php-fpm配置與參數(shù)優(yōu)調(diào)

配置文件位置一般在PHP目錄下的etc/php-fpm.d/*.conf

pm.max_children = 100
最大子進(jìn)程數(shù)量,越多越好,一般每個(gè)php-cgi所耗費(fèi)的內(nèi)存為20M左右
如果最大數(shù)量設(shè)置為100,則在峰值的時(shí)候php-cgi所耗內(nèi)存在2000M以內(nèi)
如果這個(gè)值設(shè)置的比較小,那么等待的請(qǐng)求時(shí)間會(huì)出現(xiàn)502超時(shí)
4G內(nèi)存服務(wù)器可以設(shè)置成200

pm.start_servers = 20
pm.start_servers:啟動(dòng)時(shí)創(chuàng)建的子進(jìn)程數(shù),10~20之間就可以,20個(gè)的話是400M內(nèi)存

pm.max_requests = 10240
為避免內(nèi)存泄露,php-fpm有這么一個(gè)機(jī)制,當(dāng)一個(gè)php-cgi進(jìn)程處理的請(qǐng)求數(shù)達(dá)到這個(gè)配置后,則會(huì)自動(dòng)重啟該進(jìn)程
所以在高并發(fā)中,經(jīng)常導(dǎo)致502錯(cuò)誤
解決方法就是把這個(gè)值設(shè)置大一些,減少進(jìn)程重啟次數(shù),減少高并發(fā)情況下502錯(cuò)誤。

request_terminate_timeout = 400
單個(gè)請(qǐng)求的超時(shí)中止時(shí)間,超時(shí)后會(huì)終止進(jìn)程,nginx發(fā)現(xiàn)信號(hào)斷了,就會(huì)給客戶端返回502錯(cuò)誤。
和php.ini的max_execution_time配置不沖突,誰(shuí)先達(dá)到時(shí)間誰(shuí)先起作用。
由于程序中有請(qǐng)求第三方接口等待,所以建議這個(gè)值設(shè)置為400秒,長(zhǎng)一點(diǎn)不會(huì)出現(xiàn)502錯(cuò)誤

pm.min_spare_servers = 10
保證空閑進(jìn)程數(shù)最小值,如果空閑進(jìn)程小于此值,則創(chuàng)建新的子進(jìn)程

pm.max_spare_servers = 30
保證空閑進(jìn)程數(shù)最大值,如果空閑進(jìn)程大于此值,此進(jìn)行清理

rlimit_files = xxx
設(shè)置文件打開描述符的rlimit限制,可使用 ulimit -n 查看

其他:pm.status_path = /status
可以用來(lái)查看php-fpm運(yùn)行情況,配置打開后再在nginx進(jìn)行代理轉(zhuǎn)發(fā),就可以在瀏覽器訪問(wèn)了

/status顯示的參數(shù)意義:

pool – fpm池子名稱,大多數(shù)為www
process manager – 進(jìn)程管理方式,值:static, dynamic or ondemand. dynamic
start time – 啟動(dòng)日期,如果reload了php-fpm,時(shí)間會(huì)更新
start since – 運(yùn)行時(shí)長(zhǎng)
accepted conn – 當(dāng)前池子接受的請(qǐng)求數(shù)
listen queue – 請(qǐng)求等待隊(duì)列,如果這個(gè)值不為0,那么要增加FPM的進(jìn)程數(shù)量
max listen queue – 請(qǐng)求等待隊(duì)列最高的數(shù)量
listen queue len – socket等待隊(duì)列長(zhǎng)度
idle processes – 空閑進(jìn)程數(shù)量
active processes – 活躍進(jìn)程數(shù)量
total processes – 總進(jìn)程數(shù)量
max active processes – 最大的活躍進(jìn)程數(shù)量(FPM啟動(dòng)開始算)
max children reached - 進(jìn)程最大數(shù)量限制的次數(shù),如果這個(gè)數(shù)量不為0,那說(shuō)明你的最大進(jìn)程數(shù)量太小了,請(qǐng)改大一點(diǎn)。
slow requests – 啟用了php-fpm slow-log,緩慢請(qǐng)求的數(shù)量

還可以在訪問(wèn)時(shí),在網(wǎng)址后面追加?full,可以查看更詳細(xì)的狀態(tài),參數(shù)值有:
pid – 進(jìn)程PID,可以單獨(dú)kill這個(gè)進(jìn)程.
state – 當(dāng)前進(jìn)程的狀態(tài) (Idle, Running, …)
start time – 進(jìn)程啟動(dòng)的日期
start since – 當(dāng)前進(jìn)程運(yùn)行時(shí)長(zhǎng)
requests – 當(dāng)前進(jìn)程處理了多少個(gè)請(qǐng)求
request duration – 請(qǐng)求時(shí)長(zhǎng)(微妙)
request method – 請(qǐng)求方法 (GET, POST, …)
request URI – 請(qǐng)求URI
content length – 請(qǐng)求內(nèi)容長(zhǎng)度 (僅用于 POST)
user – 用戶 (PHP_AUTH_USER) (or ‘-’ 如果沒(méi)設(shè)置)
script – PHP腳本 (or ‘-’ if not set)
last request cpu – 最后一個(gè)請(qǐng)求CPU使用率。
last request memorythe - 上一個(gè)請(qǐng)求使用的內(nèi)存

nginx轉(zhuǎn)發(fā)配置:

location /status {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

其他:ping.path = /ping
用于外部檢測(cè)FPM是否存活并且可以響應(yīng)請(qǐng)求

nginx轉(zhuǎn)發(fā)配置:

location /ping {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

注:macOS系統(tǒng)對(duì)進(jìn)程數(shù)、打開文件數(shù)等等有限制,為了方便操作,直接在Linux下測(cè)試。

修改配置后重載配置文件:

ps aux|grep php-fpm 得到Ss類型運(yùn)行的pid
kill -USR2 pid

php7以上版本的php-fpm參數(shù)配置

php-fpm的核心參數(shù)配置,默認(rèn)如下:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

只針對(duì)動(dòng)態(tài)方式dynamic說(shuō)明如下:

max_children:動(dòng)態(tài)方式下限定php-fpm的最大進(jìn)程數(shù)

start_servers:動(dòng)態(tài)方式下的起始php-fpm進(jìn)程數(shù)量

min_spare_servers :動(dòng)態(tài)方式空閑狀態(tài)下的最小php-fpm進(jìn)程數(shù)量

max_spare_servers :動(dòng)態(tài)方式空閑狀態(tài)下的最大php-fpm進(jìn)程數(shù)量

這些參數(shù)如果注意改錯(cuò)了參數(shù)會(huì)導(dǎo)致php-fpm啟動(dòng)不了,nginx也就無(wú)法訪問(wèn)php文件,可查看日志排查錯(cuò)誤:

/usr/local/php/var/log/php-fpm.log

規(guī)則匯總:

1.max_children 必須大于 min_spare_servers

2.max_children 必須大于 max_spare_servers

3.start_servers 必須大于 min_spare_servers

4.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) /

php-fpm全局配置說(shuō)明(PHP5.6載入)

配置里面的所有相對(duì)路徑,都是相對(duì)于php的安裝路徑。

除了有php-fpm.conf配置文件外,通常還有其他的*.conf配置文件(也可以不要,直接在php-fpm.conf配置)用于配置進(jìn)程池,不同的進(jìn)程池可以用不同的用戶執(zhí)行,監(jiān)聽不同的端口,處理不同的任務(wù);多個(gè)進(jìn)程池共用一個(gè)全局配置。

[www] #進(jìn)程池的名字;
user = www
group = www #以什么用戶什么組的權(quán)限來(lái)運(yùn)行[www]這個(gè)進(jìn)程池,用戶,必須要設(shè)置,用戶組,如果沒(méi)有設(shè)置,則默認(rèn)用戶的組被使用;
listen.backlog = 65535 #子進(jìn)程未accept處理的客戶端請(qǐng)求隊(duì)列大小,-1 on FreeBSD and OpenBSD,其他平臺(tái)默認(rèn)65535,高并發(fā)時(shí)重要,合理設(shè)置會(huì)及時(shí)處理排隊(duì)的請(qǐng)求;太大會(huì)積壓太多,處理完后nginx在前面都等超時(shí)斷開這個(gè)和fpm的socket連接了,就杯具了。不要用-1,建議1024以上,最好是2的冪值(注意:不同版本的默認(rèn)值是不同的,php5多是128,php7多是511)。
#1:一個(gè)池共用一個(gè)backlog隊(duì)列,所有的池進(jìn)程都去這個(gè)隊(duì)列里accept連接;
#2:最大數(shù)量受限于系統(tǒng)配置cat /proc/sys/net/core/somaxconn,系統(tǒng)配置修改:vim /etc/sysctl.conf,增加net.core.somaxconn =1024則最大為1024,然后php最大的backlog可以到1024。
listen = 127.0.0.1:9000 #進(jìn)程池[www]的監(jiān)聽端口,可用格式為:'ip:port','port','/path/to/unix/socket'。每個(gè)進(jìn)程池都需要設(shè)置。如果nginx和php在不同的機(jī)器上,只能用機(jī)器真實(shí)ip+端口的格式,如果在同一臺(tái)機(jī)器上,還可以選擇unix soxket方式,這種理論上速度會(huì)提升31%,但高并發(fā)下不夠穩(wěn)定。
listen.owner = www
listen.group = www
listen.mode = 0666 #unix socket設(shè)置選項(xiàng),如果使用tcp方式訪問(wèn),這里注釋即可。
listen.acl_users = www,php #當(dāng)系統(tǒng)支持 POSIX ACL(Access Control Lists)時(shí),可以設(shè)置使用此選項(xiàng)。 當(dāng)設(shè)置了的時(shí)候,將會(huì)忽略 listen.owner 和 listen.group。值是逗號(hào)分割的用戶名列表。 PHP 5.6.5 起可用。
listen.acl_groups=web #參見 listen.acl_users。 值是逗號(hào)分割的用戶組名稱列表。 PHP 5.6.5 起可用。
listen.allowed_clients = 127.0.0.1 #允許訪問(wèn)FastCGI進(jìn)程的IP白名單,設(shè)置any為不限制IP,如果要設(shè)置其他主機(jī)的nginx也能訪問(wèn)這臺(tái)FPM進(jìn)程,listen處要設(shè)置成本地可被訪問(wèn)的IP。每個(gè)地址是用逗號(hào)分隔。如果沒(méi)有設(shè)置或者為空,則允許任何服務(wù)器請(qǐng)求連接。
process.priority = -19 #該池進(jìn)程的權(quán)限,同樣要master進(jìn)程是root用戶才有效,和全局那個(gè)一樣,不設(shè)置的話會(huì)繼承master進(jìn)程的優(yōu)先級(jí)。
pm = dynamic #可選static,dynamic,ondemand,也就是說(shuō)php-fpm有三種進(jìn)程管理模式,默認(rèn)dynamic。
#1:static,固定啟動(dòng)若干(即pm.max_children)php進(jìn)程,保持不變。
#有效配置:pm.max_children
#2:ondemand,這種模式剛啟動(dòng)時(shí)不會(huì)啟動(dòng)任何php進(jìn)程,只有php-fpm接收到請(qǐng)求時(shí)才會(huì)根據(jù)需求啟動(dòng)php進(jìn)程,最大為pm.max_children個(gè),另外若php進(jìn)程空閑時(shí)間達(dá)到pm.process_idle_timeout(單位s),就會(huì)kill掉該進(jìn)程。
#有效配置:pm.max_children,pm.process_idle_timeout
#3:dynamic,這種是最常用的,根據(jù)相關(guān)配置動(dòng)態(tài)調(diào)整php進(jìn)程個(gè)數(shù);
#有效配置如下:
#pm.max_children : 最大php進(jìn)程數(shù);
#pm.min_spare_servers:最小的空閑php進(jìn)程數(shù),少與該值會(huì)啟動(dòng)php進(jìn)程(這里的空閑并不是指完全空閑的php進(jìn)程,可以直接理解為啟動(dòng)的php進(jìn)程就好了,把空閑二字去掉更貼切);
#pm.max_spare_servers:最大的空閑php進(jìn)程數(shù),多余的會(huì)被kill;
#pm.start_servers : php-fpm啟動(dòng)時(shí)的php進(jìn)程數(shù),它的值需要在min_spare_servers和max_spare_servers之間,默認(rèn)值:min_spare_servers(max_spare_servers - min_spare_servers) / 2;
#pm.max_requests ,默認(rèn)為0(此時(shí)等于PHP_FCGI_MAX_REQUESTS)。為了便于描述,此處假設(shè)它的值是500,那么這個(gè)參數(shù)的作用是一個(gè)php進(jìn)程(即fpm的一個(gè)子進(jìn)程)處理500個(gè)請(qǐng)求后會(huì)被kill,然后再啟動(dòng)一個(gè)php進(jìn)程,這樣可以防止因?yàn)閮?nèi)存泄漏導(dǎo)致的php進(jìn)程占用內(nèi)存過(guò)高的問(wèn)題。
access.log = var/log/php-fpm/$pool-access.log #訪問(wèn)文件日志;
access.format = "%R - %u %t “%m %r%Q%q” %s %f %{mili}d %{kilo}M %C%%" #設(shè)定訪問(wèn)日志的格式。
slowlog = /var/log/php-fpm/$pool-slow.log #慢請(qǐng)求日志;
request_slowlog_timeout #默認(rèn)為0(不啟用),此處假設(shè)它的值是10,則超過(guò)10s未響應(yīng)的請(qǐng)求就是慢請(qǐng)求,會(huì)被記錄到慢請(qǐng)求日志中;
request_terminate_timeout #默認(rèn)為0(不啟用),此處假設(shè)它的值是20,則若某個(gè)請(qǐng)求超過(guò)20s未響應(yīng),相應(yīng)的php進(jìn)程會(huì)被kill掉,和php.ini中的max_execution_time效果類似。
php_value ,php_flag, php_admin_value , php_admin_flag #設(shè)置php.ini中的配置,后二者相比前兩者,不能被 PHP 代碼中的 ini_set() 及相似函數(shù)覆蓋。

#最重要的就是pm相關(guān)的幾個(gè)配置了,還有一些配置采用默認(rèn)就好,詳情見官網(wǎng)。

【全局配置】
pid = run/php-fpm.pid #pid設(shè)置。
error_log = log/php-fpm.log #錯(cuò)誤日志。
log_level = notice #錯(cuò)誤級(jí)別。上面的php-fpm.log紀(jì)錄的錯(cuò)誤等級(jí)??捎眉?jí)別為:alert(必須立即處理),error(錯(cuò)誤情況),warning(警告情況),notice(一般重要信息),debug(調(diào)試信息)。默認(rèn):notice。
syslog.facility = daemon #把日志寫進(jìn)系統(tǒng)log,linux還不夠熟悉,暫時(shí)不用理會(huì)。
syslog.ident = php-fpm #系統(tǒng)日志標(biāo)示(前綴),如果跑了多個(gè)fpm進(jìn)程池,需要用這個(gè)來(lái)區(qū)分日志是誰(shuí)的。
emergency_restart_threshold = 5
emergency_restart_interval = 60 #表示在60s內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯(cuò)誤的php-cgi進(jìn)程數(shù)如果超過(guò) emergency_restart_threshold個(gè),php-fpm就會(huì)優(yōu)雅重啟。這兩個(gè)選項(xiàng)一般保持默認(rèn)值。0 表示‘關(guān)閉該功能’。默認(rèn)值: 0 (關(guān)閉)。
process_control_timeout = 0 #設(shè)置子進(jìn)程接受主進(jìn)程復(fù)用信號(hào)的超時(shí)時(shí)間??捎脝挝唬簊(秒),m(分),h(小時(shí)),或者 d(天) 默認(rèn)單位: s(秒)。默認(rèn)值: 0。
process.max = 128 #當(dāng)動(dòng)態(tài)管理子進(jìn)程時(shí),fpm最多能fork多少個(gè)進(jìn)程,默認(rèn)0表示無(wú)限制,這是所有進(jìn)程池能啟動(dòng)子進(jìn)程的總和,謹(jǐn)慎使用。
process.priority = -19 #設(shè)置子進(jìn)程的優(yōu)先級(jí),在master進(jìn)程以root用戶啟動(dòng)時(shí)有效;如果沒(méi)有設(shè)置,子進(jìn)程會(huì)繼承master進(jìn)程的優(yōu)先級(jí),值范圍-19(最高)到20(最低),默認(rèn)不設(shè)置。
rlimit_files = 1024 #設(shè)置master進(jìn)程最多能打開的文件,默認(rèn)為系統(tǒng)的值。
rlimit_core = 0 #master進(jìn)程核心rlimit限制值;可選unlimited或>=0的整數(shù),默認(rèn)為系統(tǒng)的值。
events.mechanism = epoll #事件處理機(jī)制,默認(rèn)自動(dòng)檢測(cè),可選值: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)。linux>=2.5.44會(huì)默認(rèn)epoll,效果最好的IO方式。
systemd_interval = 10s #當(dāng)fpm被設(shè)置為系統(tǒng)服務(wù)時(shí),多久向服務(wù)器報(bào)告一次狀態(tài),單位有s,m,h。
daemonize = yes #作為守護(hù)進(jìn)程運(yùn)行php-fpm。默認(rèn)值為yes。

問(wèn)題未解決?付費(fèi)解決問(wèn)題加Q或微信 2589053300 (即Q號(hào)又微信號(hào))右上方掃一掃可加博主微信

所寫所說(shuō),是心之所感,思之所悟,行之所得;文當(dāng)無(wú)敷衍,落筆求簡(jiǎn)潔。 以所舍,求所獲;有所依,方所成!

支付寶贊助
微信贊助

免責(zé)聲明,若由于商用引起版權(quán)糾紛,一切責(zé)任均由使用者承擔(dān)。

您必須遵守我們的協(xié)議,如您下載該資源,行為將被視為對(duì)《免責(zé)聲明》全部?jī)?nèi)容的認(rèn)可->聯(lián)系老梁投訴資源
LaoLiang.Net部分資源來(lái)自互聯(lián)網(wǎng)收集,僅供用于學(xué)習(xí)和交流,請(qǐng)勿用于商業(yè)用途。如有侵權(quán)、不妥之處,請(qǐng)聯(lián)系站長(zhǎng)并出示版權(quán)證明以便刪除。 敬請(qǐng)諒解! 侵權(quán)刪帖/違法舉報(bào)/投稿等事物聯(lián)系郵箱:service@laoliang.net
意在交流學(xué)習(xí),歡迎贊賞評(píng)論,如有謬誤,請(qǐng)聯(lián)系指正;轉(zhuǎn)載請(qǐng)注明出處: » php-fpm配置解說(shuō)(PHP-FPM參數(shù)優(yōu)調(diào))

發(fā)表回復(fù)

本站承接,網(wǎng)站推廣(SEM,SEO);軟件安裝與調(diào)試;服務(wù)器或網(wǎng)絡(luò)推薦及配置;APP開發(fā)與維護(hù);網(wǎng)站開發(fā)修改及維護(hù); 各財(cái)務(wù)軟件安裝調(diào)試及注冊(cè)服務(wù)(金蝶,用友,管家婆,速達(dá),星宇等);同時(shí)也有客戶管理系統(tǒng),人力資源,超市POS,醫(yī)藥管理等;

立即查看 了解詳情