PHP-FPM 配置說明

FPM工作流程

fpm 全名是FastCGI進(jìn)程管理器,可以參考關(guān)于FastCGI的說明:CGI、FastCGI、PHP-CGI和PHP-FPM 概念區(qū)分
fpm啟動后會先讀php.ini,然后再讀取相應(yīng)的conf配置文件,conf配置可以覆蓋php.ini的配置。啟動fpm之后,會創(chuàng)建一個master進(jìn)程,監(jiān)聽9000端口(可配置),master進(jìn)程又會根據(jù)fpm.conf/www.conf去創(chuàng)建若干子進(jìn)程,子進(jìn)程用于處理實(shí)際的業(yè)務(wù)。當(dāng)有客戶端(比如nginx)來連接9000端口時,空閑子進(jìn)程會自己去accept,如果子進(jìn)程全部處于忙碌狀態(tài),新進(jìn)的待accept的連接會被master放進(jìn)隊列里,等待fpm子進(jìn)程空閑;這個存放待accept的半連接的隊列有多長,由 listen.backlog 配置。

php-fpm的啟動參數(shù)

#測試php-fpm配置
/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t

#啟動php-fpm
/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf

#關(guān)閉php-fpm
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

#重啟php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm.conf重要參數(shù)詳解

pid = run/php-fpm.pid
#pid設(shè)置,默認(rèn)在安裝目錄中的var/run/php-fpm.pid,建議開啟

error_log = log/php-fpm.log
#錯誤日志,默認(rèn)在安裝目錄中的var/log/php-fpm.log 如果設(shè)置為syslog,log就會發(fā)送給syslogd服務(wù)而不會寫進(jìn)文件里。

syslog.facility = daemon 
# 把日志寫進(jìn)系統(tǒng)log,linux還不夠熟悉,暫時不用理會。

syslog.ident = php-fpm 
#系統(tǒng)日志標(biāo)示,如果跑了多個fpm進(jìn)程,需要用這個來區(qū)分日志是誰的。

log_level = notice
#錯誤級別. 可用級別為: alert(必須立即處理), error(錯誤情況), warning(警告情況), notice(一般重要信息), debug(調(diào)試信息). 默認(rèn): notice.

emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所設(shè)值內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯誤的php-cgi進(jìn)程數(shù)如果超過 emergency_restart_threshold個,php-fpm就會優(yōu)雅重啟。這兩個選項一般保持默認(rèn)值。

process_control_timeout = 0
#設(shè)置子進(jìn)程接受主進(jìn)程復(fù)用信號的超時時間. 可用單位: s(秒), m(分), h(小時), 或者 d(天) 默認(rèn)單位: s(秒). 默認(rèn)值: 0.

daemonize = yes
#后臺執(zhí)行fpm,默認(rèn)值為yes,如果為了調(diào)試可以改為no。在FPM中,可以使用不同的設(shè)置來運(yùn)行多個進(jìn)程池。 這些設(shè)置可以針對每個進(jìn)程池單獨(dú)設(shè)置。

listen = 127.0.0.1:9000
#fpm監(jiān)聽端口,即nginx中php處理的地址,一般默認(rèn)值即可??捎酶袷綖? 'ip:port', 'port', '/path/to/unix/socket'. 每個進(jìn)程池都需要設(shè)置.

listen.backlog = -1
#未accept處理的socket隊列大小,-1 on FreeBSD and OpenBSD,其他平臺默認(rèn)65535,高并發(fā)時重要,合理設(shè)置會及時處理排隊的請求;太大會積壓太多,處理完后nginx在前面都等超時斷開這個和fpm的socket連接了,就杯具了。不要用-1,建議1024以上,最好是2的冪值。
# 一個池共用一個backlog隊列,所有的池進(jìn)程都去這個隊列里accept連接。
# 最大數(shù)量受限于系統(tǒng)配置 cat /proc/sys/net/core/somaxconn,系統(tǒng)配置修改:vim /etc/sysctl.conf,增加 net.core.somaxconn = 2000 則最大為2000,然后php最大的backlog可以到2000。

listen.allowed_clients = 127.0.0.1
#允許訪問FastCGI進(jìn)程的IP,設(shè)置any為不限制IP,如果要設(shè)置其他主機(jī)的nginx也能訪問這臺FPM進(jìn)程,listen處要設(shè)置成本地可被訪問的IP。默認(rèn)值是any。每個地址是用逗號分隔. 如果沒有設(shè)置或者為空,則允許任何服務(wù)器請求連接

listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket設(shè)置選項,如果使用tcp方式訪問,這里注釋即可。

user = www
group = www
#啟動進(jìn)程的帳戶和組

pm = dynamic 
#對于專用服務(wù)器,pm可以設(shè)置為static。
#如何控制子進(jìn)程,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子進(jìn)程數(shù)。如果選擇dynamic,則由下開參數(shù)決定:
pm.max_children 
#,子進(jìn)程最大數(shù)
pm.start_servers 
#,啟動時的進(jìn)程數(shù)
pm.min_spare_servers 
#,保證空閑進(jìn)程數(shù)最小值,如果空閑進(jìn)程小于此值,則創(chuàng)建新的子進(jìn)程
pm.max_spare_servers 
#,保證空閑進(jìn)程數(shù)最大值,如果空閑進(jìn)程大于此值,此進(jìn)行清理

pm.max_requests = 1000
#設(shè)置每個子進(jìn)程重生之前服務(wù)的請求數(shù). 對于可能存在內(nèi)存泄漏的第三方模塊來說是非常有用的. 如果設(shè)置為 '0' 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認(rèn)值: 0.

pm.status_path = /status
#FPM狀態(tài)頁面的網(wǎng)址. 如果沒有設(shè)置, 則無法訪問狀態(tài)頁面. 默認(rèn)值: none. munin監(jiān)控會使用到

ping.path = /ping
#FPM監(jiān)控頁面的ping網(wǎng)址. 如果沒有設(shè)置, 則無法訪問ping頁面. 該頁面用于外部檢測FPM是否存活并且可以響應(yīng)請求. 請注意必須以斜線開頭 (/)。

ping.response = pong
#用于定義ping請求的返回相應(yīng). 返回為 HTTP 200 的 text/plain 格式文本. 默認(rèn)值: pong.

request_terminate_timeout = 0
#設(shè)置單個請求的超時中止時間. 該選項可能會對php.ini設(shè)置中的'max_execution_time'因?yàn)槟承┨厥庠驔]有中止運(yùn)行的腳本有用. 設(shè)置為 '0' 表示 'Off'.當(dāng)經(jīng)常出現(xiàn)502錯誤時可以嘗試更改此選項。

request_slowlog_timeout = 10s
#當(dāng)一個請求該設(shè)置的超時時間后,就會將對應(yīng)的PHP調(diào)用堆棧信息完整寫入到慢日志中. 設(shè)置為 '0' 表示 'Off'

slowlog = log/$pool.log.slow
#慢請求的記錄日志,配合request_slowlog_timeout使用

rlimit_files = 1024
#設(shè)置文件打開描述符的rlimit限制. 默認(rèn)值: 系統(tǒng)定義值默認(rèn)可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0
#設(shè)置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數(shù). 默認(rèn)值: 系統(tǒng)定義值.

chroot =
#啟動時的Chroot目錄. 所定義的目錄需要是絕對路徑. 如果沒有設(shè)置, 則chroot不被使用.

chdir =
#設(shè)置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認(rèn)值: 當(dāng)前目錄,或者/目錄(chroot時)

catch_workers_output = yes
#重定向運(yùn)行過程中的stdout和stderr到主要的錯誤日志文件中. 如果沒有設(shè)置, stdout 和 stderr 將會根據(jù)FastCGI的規(guī)則被重定向到 /dev/null . 默認(rèn)值: 空

fpm進(jìn)程狀態(tài)監(jiān)控

1、nginx配置:遇到 status 的請求,直接轉(zhuǎn)發(fā)給php

2、fpm配置:pm.status_path = /status

3、然后重新fpm和nginx,在瀏覽器里訪問就能看到了:

默認(rèn)以 text/plain 展示結(jié)果,可以傳參數(shù) ?json/html/xml 分別得到j(luò)son等格式的結(jié)果;參數(shù)full可以查看每個子進(jìn)程的明細(xì)

img
  1. pool 進(jìn)程池名稱
  2. process manager 進(jìn)程管理方式
  3. start time 進(jìn)程什么時候啟動的
  4. start since 進(jìn)程已經(jīng)運(yùn)行了多少秒
  5. accepted conn 該池總共accept了多少連接
  6. listen queue 等待accept的連接的數(shù)量
  7. max listen queue fpm啟動后,歷史最高等待accept的連接的數(shù)量
  8. listen queue len 配置的監(jiān)聽隊列最大長度 受限于listen.backlog和系統(tǒng)cat /proc/sys/net/core/somaxconn,兩者中取最小值
  9. idle processes 閑置的進(jìn)程數(shù)
  10. active process 正在工作的進(jìn)程數(shù)(加上限制的,就是總的子進(jìn)程數(shù))
  11. total processes 總的子進(jìn)程數(shù)量
  12. max active processes fpm啟動后,歷史最多同時工作的進(jìn)程數(shù)
  13. max children reached 進(jìn)程管理模式為 'dynamic'和 'ondemand'時,此數(shù)值是當(dāng)子進(jìn)程不夠用時,master創(chuàng)建更多子進(jìn)程的次數(shù)
  14. slow requests 慢請求個數(shù)
  15. full參數(shù)下
  16. pid 子進(jìn)程ID;
  17. state 子進(jìn)程狀態(tài)(Idle, Running, ...);
  18. start time 子進(jìn)程啟動的時間;
  19. start since 子進(jìn)程啟動后運(yùn)行了多少秒;
  20. requests 當(dāng)前子進(jìn)程一共處理了多少個請求;
  21. request duration 請求耗費(fèi)的納秒數(shù);
  22. request method 請求方法 (GET, POST, ...);
  23. request URI 請求參數(shù);
  24. content length POST請求時,請求的內(nèi)容長度;
  25. user - the user (PHP_AUTH_USER) (or '-' if not set);
  26. script 請求的哪個php文件;
  27. last request cpu 上次請求耗費(fèi)的cpu資源
  28. last request memory 上次請求耗費(fèi)的內(nèi)存峰值
  29. 如果進(jìn)程是閑置狀態(tài),那這些信息記錄的就是上次請求的相關(guān)數(shù)據(jù),否則就是當(dāng)前本次請求的相關(guān)數(shù)據(jù)。

參考:http://www.cnblogs.com/52php/p/6278265.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 原文github地址 1.PHP概述 1.1 PHP的歷史發(fā)展 1995年由Lerdorf創(chuàng)建PHP,高級腳本語言...
    10xjzheng閱讀 1,575評論 0 2
  • 轉(zhuǎn)自:http://www.jb51.net/article/42716.htm 一、約定幾個目錄 /usr/lo...
    Shaun_lan閱讀 2,825評論 1 4
  • php-fpm的啟動參數(shù) #測試php-fpm配置 /usr/local/php/sbin/php-fpm -t ...
    落櫻月千殤閱讀 1,173評論 0 2
  • 原創(chuàng)2017-02-25燕子燕子原創(chuàng) 很舒服的周末,有點(diǎn)喜歡這種心安理得的懶。唯獨(dú)就是似乎咳嗽加劇了,從開年到現(xiàn)在...
    龔曉燕閱讀 223評論 0 0

友情鏈接更多精彩內(nèi)容