php-fpm 配置詳解

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章