php-fpm工作流程
php-fpm全名是PHP FastCGI程式管理器
php-fpm啟動後會先讀php.ini,然後再讀相應的conf配置檔案,conf配置可以覆蓋php.ini的配置。
啟動php-fpm之後,會建立一個master程式,監聽9000埠(可配置),master程式又會根據fpm.conf/www.conf去建立若干子程式,子程式用於處理實際的業務。
當有客戶端(比如nginx)來連線9000埠時,空閒子程式會自己去accept,如果子程式全部處於忙碌狀態,新進的待accept的連線會被master放進佇列裡,等待fpm子程式空閒;
這個存放待accept的半連線的佇列有多長,由 listen.backlog 配置。
php-fpm全域性配置說明
配置裡面的所有相對路徑,都是相對於php的安裝路徑。
除了有php-fpm.conf配置檔案外,通常還有其他的*.conf配置檔案(也可以不要,直接在php-fpm.conf配置)用於配置程式池,不同的程式池可以用不同的使用者執行,監聽不同的埠,處理不同的任務;多個程式池共用一個全域性配置。
include=/opt/remi/php56/root/etc/php-fpm.d/*.conf 載入其他的配置檔案。
[www] #程式池的名字;
user = www group = www #以什麼使用者什麼組的許可權來執行[www]這個程式池,使用者,必須要設定,使用者組,如果沒有設定,則預設使用者的組被使用; listen.backlog = 65535 #子程式未accept處理的客戶端請求佇列大小,-1 on FreeBSD and OpenBSD,其他平臺預設65535,高併發時重要,合理設定會及時處理排隊的請求;太大會積壓太多,處理完後nginx在前面都等超時斷開這個和fpm的socket連線了,就杯具了。不要用-1,建議1024以上,最好是2的冪值(注意:不同版本的預設值是不同的,php5多是128,php7多是511)。 #1:一個池共用一個backlog佇列,所有的池程式都去這個佇列裡accept連線; #2:最大數量受限於系統配置cat /proc/sys/net/core/somaxconn,系統配置修改:vim /etc/sysctl.conf,增加net.core.somaxconn =1024則最大為1024,然後php最大的backlog可以到1024。 listen = 127.0.0.1:9000 #程式池[www]的監聽埠,可用格式為:'ip:port','port','/path/to/unix/socket'。每個程式池都需要設定。如果nginx和php在不同的機器上,只能用機器真實ip+埠的格式,如果在同一臺機器上,還可以選擇unix soxket方式,這種理論上速度會提升31%,但高併發下不夠穩定。 listen.owner = www listen.group = www listen.mode = 0666 #unix socket設定選項,如果使用tcp方式訪問,這裡註釋即可。 listen.acl_users = www,php #當系統支援 POSIX ACL(Access Control Lists)時,可以設定使用此選項。 當設定了的時候,將會忽略 listen.owner 和 listen.group。值是逗號分割的使用者名稱列表。 PHP 5.6.5 起可用。 listen.acl_groups=web #參見 listen.acl_users。 值是逗號分割的使用者組名稱列表。 PHP 5.6.5 起可用。 listen.allowed_clients = 127.0.0.1 #允許訪問FastCGI程式的IP白名單,設定any為不限制IP,如果要設定其他主機的nginx也能訪問這臺FPM程式,listen處要設定成本地可被訪問的IP。每個地址是用逗號分隔。如果沒有設定或者為空,則允許任何伺服器請求連線。 process.priority = -19 #該池程式的許可權,同樣要master程式是root使用者才有效,和全域性那個一樣,不設定的話會繼承master程式的優先順序。 pm = dynamic #可選static,dynamic,ondemand,也就是說php-fpm有三種程式管理模式,預設dynamic。 #1:static,固定啟動若干(即pm.max_children)php程式,保持不變。 #有效配置:pm.max_children #2:ondemand,這種模式剛啟動時不會啟動任何php程式,只有php-fpm接收到請求時才會根據需求啟動php程式,最大為pm.max_children個,另外若php程式空閒時間達到pm.process_idle_timeout(單位s),就會kill掉該程式。 #有效配置:pm.max_children,pm.process_idle_timeout #3:dynamic,這種是最常用的,根據相關配置動態調整php程式個數;
#有效配置如下: #pm.max_children : 最大php程式數; #pm.min_spare_servers:最小的空閒php程式數,少與該值會啟動php程式(這裡的空閒並不是指完全空閒的php程式,可以直接理解為啟動的php程式就好了,把空閒二字去掉更貼切); #pm.max_spare_servers:最大的空閒php程式數,多餘的會被kill; #pm.start_servers : php-fpm啟動時的php程式數,它的值需要在min_spare_servers和max_spare_servers之間,預設值:min_spare_servers(max_spare_servers - min_spare_servers) / 2; #pm.max_requests ,預設為0(此時等於PHP_FCGI_MAX_REQUESTS)。為了便於描述,此處假設它的值是500,那麼這個引數的作用是一個php程式(即fpm的一個子程式)處理500個請求後會被kill,然後再啟動一個php程式,這樣可以防止因為記憶體洩漏導致的php程式佔用記憶體過高的問題。
access.log = var/log/php-fpm/$pool-access.log #訪問檔案日誌; access.format = "%R - %u %t “%m %r%Q%q” %s %f %{mili}d %{kilo}M %C%%" #設定訪問日誌的格式。 slowlog = /var/log/php-fpm/$pool-slow.log #慢請求日誌; request_slowlog_timeout #預設為0(不啟用),此處假設它的值是10,則超過10s未響應的請求就是慢請求,會被記錄到慢請求日誌中; request_terminate_timeout #預設為0(不啟用),此處假設它的值是20,則若某個請求超過20s未響應,相應的php程式會被kill掉,和php.ini中的max_execution_time效果類似。 php_value ,php_flag, php_admin_value , php_admin_flag #設定php.ini中的配置,後二者相比前兩者,不能被 PHP 程式碼中的 ini_set() 及相似函式覆蓋。 #最重要的就是pm相關的幾個配置了,還有一些配置採用預設就好,詳情見官網。 【全域性配置】 pid = run/php-fpm.pid #pid設定。 error_log = log/php-fpm.log #錯誤日誌。 log_level = notice #錯誤級別。上面的php-fpm.log紀錄的錯誤等級。可用級別為:alert(必須立即處理),error(錯誤情況),warning(警告情況),notice(一般重要資訊),debug(除錯資訊)。預設:notice。 syslog.facility = daemon #把日誌寫進系統log,linux還不夠熟悉,暫時不用理會。 syslog.ident = php-fpm #系統日誌標示(字首),如果跑了多個fpm程式池,需要用這個來區分日誌是誰的。 emergency_restart_threshold = 5 emergency_restart_interval = 60 #表示在60s內出現SIGSEGV或者SIGBUS錯誤的php-cgi程式數如果超過 emergency_restart_threshold個,php-fpm就會優雅重啟。這兩個選項一般保持預設值。0 表示‘關閉該功能’。預設值: 0 (關閉)。 process_control_timeout = 0 #設定子程式接受主程式複用訊號的超時時間。可用單位:s(秒),m(分),h(小時),或者 d(天) 預設單位: s(秒)。預設值: 0。 process.max = 128 #當動態管理子程式時,fpm最多能fork多少個程式,預設0表示無限制,這是所有程式池能啟動子程式的總和,謹慎使用。 process.priority = -19 #設定子程式的優先順序,在master程式以root使用者啟動時有效;如果沒有設定,子程式會繼承master程式的優先順序,值範圍-19(最高)到20(最低),預設不設定。 rlimit_files = 1024 #設定master程式最多能開啟的檔案,預設為系統的值。 rlimit_core = 0 #master程式核心rlimit限制值;可選unlimited或>=0的整數,預設為系統的值。 events.mechanism = epoll #事件處理機制,預設自動檢測,可選值: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會預設epoll,效果最好的IO方式。 systemd_interval = 10s #當fpm被設定為系統服務時,多久向伺服器報告一次狀態,單位有s,m,h。 daemonize = yes #作為守護程式執行php-fpm。預設值為yes。