PHP-FPM 配置說明

FPM工做流程

fpm 全名是FastCGI進程管理器,能夠參考關於FastCGI的說明:CGI、FastCGI、PHP-CGI和PHP-FPM 概念區分
fpm啓動後會先讀php.ini,而後再讀取相應的conf配置文件,conf配置能夠覆蓋php.ini的配置。啓動fpm以後,會建立一個master進程,監聽9000端口(可配置),master進程又會根據fpm.conf/www.conf去建立若干子進程,子進程用於處理實際的業務。當有客戶端(好比nginx)來鏈接9000端口時,空閒子進程會本身去accept,若是子進程所有處於忙碌狀態,新進的待accept的鏈接會被master放進隊列裏,等待fpm子進程空閒;這個存放待accept的半鏈接的隊列有多長,由 listen.backlog 配置。php

php-fpm的啓動參數

#測試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

#關閉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重要參數詳解

pid = run/php-fpm.pid
#pid設置,默認在安裝目錄中的var/run/php-fpm.pid,建議開啓

error_log = log/php-fpm.log
#錯誤日誌,默認在安裝目錄中的var/log/php-fpm.log 若是設置爲syslog,log就會發送給syslogd服務而不會寫進文件裏。

syslog.facility = daemon 
# 把日誌寫進系統log,linux還不夠熟悉,暫時不用理會。

syslog.ident = php-fpm 
#系統日誌標示,若是跑了多個fpm進程,須要用這個來區分日誌是誰的。

log_level = notice
#錯誤級別. 可用級別爲: alert(必須當即處理), error(錯誤狀況), warning(警告狀況), notice(通常重要信息), debug(調試信息). 默認: notice.

emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所設值內出現SIGSEGV或者SIGBUS錯誤的php-cgi進程數若是超過 emergency_restart_threshold個,php-fpm就會優雅重啓。這兩個選項通常保持默認值。

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

daemonize = yes
#後臺執行fpm,默認值爲yes,若是爲了調試能夠改成no。在FPM中,可使用不一樣的設置來運行多個進程池。 這些設置能夠針對每一個進程池單獨設置。

listen = 127.0.0.1:9000
#fpm監聽端口,即nginx中php處理的地址,通常默認值便可。可用格式爲: 'ip:port', 'port', '/path/to/unix/socket'. 每一個進程池都須要設置.

listen.backlog = -1
#未accept處理的socket隊列大小,-1 on FreeBSD and OpenBSD,其餘平臺默認65535,高併發時重要,合理設置會及時處理排隊的請求;太大會積壓太多,處理完後nginx在前面都等超時斷開這個和fpm的socket鏈接了,就杯具了。不要用-1,建議1024以上,最好是2的冪值。
# 一個池共用一個backlog隊列,全部的池進程都去這個隊列裏accept鏈接。
# 最大數量受限於系統配置 cat /proc/sys/net/core/somaxconn,系統配置修改:vim /etc/sysctl.conf,增長 net.core.somaxconn = 2000 則最大爲2000,而後php最大的backlog能夠到2000。

listen.allowed_clients = 127.0.0.1
#容許訪問FastCGI進程的IP,設置any爲不限制IP,若是要設置其餘主機的nginx也能訪問這臺FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每一個地址是用逗號分隔. 若是沒有設置或者爲空,則容許任何服務器請求鏈接

listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket設置選項,若是使用tcp方式訪問,這裏註釋便可。

user = www
group = www
#啓動進程的賬戶和組

pm = dynamic 
#對於專用服務器,pm能夠設置爲static。
#如何控制子進程,選項有static和dynamic。若是選擇static,則由pm.max_children指定固定的子進程數。若是選擇dynamic,則由下開參數決定:
pm.max_children 
#,子進程最大數
pm.start_servers 
#,啓動時的進程數
pm.min_spare_servers 
#,保證空閒進程數最小值,若是空閒進程小於此值,則建立新的子進程
pm.max_spare_servers 
#,保證空閒進程數最大值,若是空閒進程大於此值,此進行清理

pm.max_requests = 1000
#設置每一個子進程重生以前服務的請求數. 對於可能存在內存泄漏的第三方模塊來講是很是有用的. 若是設置爲 '0' 則一直接受請求. 等同於 PHP_FCGI_MAX_REQUESTS 環境變量. 默認值: 0.

pm.status_path = /status
#FPM狀態頁面的網址. 若是沒有設置, 則沒法訪問狀態頁面. 默認值: none. munin監控會使用到

ping.path = /ping
#FPM監控頁面的ping網址. 若是沒有設置, 則沒法訪問ping頁面. 該頁面用於外部檢測FPM是否存活而且能夠響應請求. 請注意必須以斜線開頭 (/)。

ping.response = pong
#用於定義ping請求的返回相應. 返回爲 HTTP 200 的 text/plain 格式文本. 默認值: pong.

request_terminate_timeout = 0
#設置單個請求的超時停止時間. 該選項可能會對php.ini設置中的'max_execution_time'由於某些特殊緣由沒有停止運行的腳本有用. 設置爲 '0' 表示 'Off'.當常常出現502錯誤時能夠嘗試更改此選項。

request_slowlog_timeout = 10s
#當一個請求該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中. 設置爲 '0' 表示 'Off'

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

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

rlimit_core = 0
#設置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數. 默認值: 系統定義值.

chroot =
#啓動時的Chroot目錄. 所定義的目錄須要是絕對路徑. 若是沒有設置, 則chroot不被使用.

chdir =
#設置啓動目錄,啓動時會自動Chdir到該目錄. 所定義的目錄須要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)

catch_workers_output = yes
#重定向運行過程當中的stdout和stderr到主要的錯誤日誌文件中. 若是沒有設置, stdout 和 stderr 將會根據FastCGI的規則被重定向到 /dev/null . 默認值: 空

fpm進程狀態監控

一、nginx配置:遇到 status 的請求,直接轉發給phphtml

二、fpm配置:pm.status_path = /statuslinux

三、而後從新fpm和nginx,在瀏覽器裏訪問就能看到了:nginx

默認以 text/plain 展現結果,能夠傳參數 ?json/html/xml 分別獲得json等格式的結果;參數full能夠查看每一個子進程的明細shell

img

  1. pool 進程池名稱json

  2. process manager 進程管理方式vim

  3. start time 進程何時啓動的瀏覽器

  4. start since 進程已經運行了多少秒服務器

  5. accepted conn 該池總共accept了多少鏈接併發

  6. listen queue 等待accept的鏈接的數量

  7. max listen queue fpm啓動後,歷史最高等待accept的鏈接的數量

  8. listen queue len 配置的監聽隊列最大長度 受限於listen.backlog和系統cat /proc/sys/net/core/somaxconn,二者中取最小值

  9. idle processes 閒置的進程數

  10. active process 正在工做的進程數(加上限制的,就是總的子進程數)

  11. total processes 總的子進程數量

  12. max active processes fpm啓動後,歷史最多同時工做的進程數

  13. max children reached 進程管理模式爲 'dynamic'和 'ondemand'時,此數值是當子進程不夠用時,master建立更多子進程的次數

  14. slow requests 慢請求個數

  15. full參數下

  16. pid 子進程ID;

  17. state 子進程狀態(Idle, Running, ...);

  18. start time 子進程啓動的時間;

  19. start since 子進程啓動後運行了多少秒;

  20. requests 當前子進程一共處理了多少個請求;

  21. request duration 請求耗費的納秒數;

  22. request method 請求方法 (GET, POST, ...);

  23. request URI 請求參數;

  24. content length POST請求時,請求的內容長度;

  25. user - the user (PHP_AUTH_USER) (or '-' if not set);

  26. script 請求的哪一個php文件;

  27. last request cpu 上次請求耗費的cpu資源

  28. last request memory 上次請求耗費的內存峯值

  29. 若是進程是閒置狀態,那這些信息記錄的就是上次請求的相關數據,不然就是當前本次請求的相關數據。

參考:http://www.cnblogs.com/52php/...

相關文章
相關標籤/搜索