php-fpm配置


fpm工作流程

fpm全名是FastCGI進程管理器。

fpm啟動后會先讀php.ini,然后再讀相應的conf配置文件,conf配置可以覆蓋php.ini的配置。
啟動fpm之后,會創建一個master進程,監聽9000端口(可配置),master進程又會根據fpm.conf/www.conf去創建若干子進程,子進程用於處理實際的業務。
當有客戶端(比如nginx)來連接9000端口時,空閑子進程會自己去accept,如果子進程全部處於忙碌狀態,新進的待accept的連接會被master放進隊列里,等待fpm子進程空閑;這個存放待accept的半連接的隊列有多長,由listen.backlog配置。

fpm配置說明

進程池

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

include=/opt/remi/php56/root/etc/php-fpm.d/*.conf 載入其他的配置文件。

全局配置

1.0 pid = /opt/remi/php56/root/var/run/php-fpm/php-fpm.pid pid進程文件,默認為none。
2.0 error_log = /opt/remi/php56/root/var/log/php-fpm/error.log 錯誤日志位置,默認:安裝路徑 #INSTALL_PREFIX#/log/php-fpm.log。如果設置為syslog,log就會發送給syslogd服務而不會寫進文件里。
3.0 syslog.facility = daemon 把日志寫進系統log,linux還不夠熟悉,暫時不用理會。
3.1 syslog.ident = php-fpm 系統日志標示,如果跑了多個fpm進程,需要用這個來區分日志是誰的。
4.0 log_level = notice 日志等級,默認notice,可選:alert, error, warning, notice, debug
5.0 emergency_restart_threshold = 60 配合5.1用
5.1 emergency_restart_interval = 60s 如果在此參數設置的時間內,出現SIGSEGV或SIGBUS的子進程數超過5.0號參數設置的值,那么fpm就會優雅的重啟,值是0表示off這個功能,可用的單位有:s秒,m分,h時,d天。
6.0 process_control_timeout = 0 設置子進程接受主進程復用信號的超時時間。這個每天明白,是過了這個時間就不能復用了?
7.0 process.max = 128 當動態管理子進程時,fpm最多能fork多少個進程,0表示無限制,這是所有進程池能啟動子進程的總和,謹慎使用。
8.0 process.priority = -19 設置子進程的優先級,在master進程以root用戶啟動時有效;如果沒有設置,子進程會繼承master進程的優先級,值范圍-19(最高)到20(最低),默認不設置。
9.0 daemonize = yes 設置成no用於調試bug,默認為yes。
10.0 rlimit_files = 1024 設置master進程最多能打開的文件,默認為系統的值。
11.0 rlimit_core = 0 master進程核心rlimit限制值;可選unlimited或>=0的整數,默認為系統的值。
12.0 events.mechanism = epoll 事件處理機制,默認自動檢測,可選值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,port
13.0 systemd_interval = 10s 當fpm被設置為系統服務時,多久向服務器報告一次狀態,單位有s,m,h。

進程池配置pool Definitions:

在不同的監聽端口和不同的管理選項下可以跑任意數量的池,並沒有個數限制;

池的名字用於logs和stats。

1.0 user = nginx,group = nginx 以什么用戶什么組的權限來運行池fpm。

  1. apache可以像httpd服務一樣去訪問某些目錄

2.0 listen = 127.0.0.1:9000監聽的ip和端口,可以/path/to/unix/socket來監聽unix socket,性能更好。

3.0 listen.backlog = 65535 未accept處理的socket隊列大小,-1 on FreeBSD and OpenBSD,其他平台默認65535,高並發時重要,合理設置會及時處理排隊的請求;太大會積壓太多,處理完后nginx在前面都等超時斷開這個和fpm的socket連接了,就杯具了。不要用-1,建議1024以上,最好是2的冪值。

  1. 一個池共用一個backlog隊列,所有的池進程都去這個隊列里accept連接。
  2. 最大數量受限於系統配置cat /proc/sys/net/core/somaxconn,系統配置修改:vim /etc/sysctl.conf,增加net.core.somaxconn = 2000則最大為2000,然后php最大的backlog可以到2000

4.0 用socket連接方式時,指定擁有unix socket權限的用戶,默認和運行的用戶一樣;用tcp連接可以注釋掉

  1. listen.owner =apache
  2. listen.group =apache
  3. listen.mode = 0660

5.0 listen.allowed_clients = 127.0.0.1 設置允許連接fpm的地址,比如nginx就要來連,多個地址用逗號隔開,如果不配置,則默認任意地址都能來連。
6.0 process.priority = -19 池進程的權限,同樣要master進程是root用戶才有效,和全局那個一樣,不設置的話會繼承master進程的優先級。
7.0

  1. pm = dynamic 啟動時子進程管理方式,可選值:static(啟動時創建指定個數), dynamic(啟動時根據情況創建,至少有一個), ondemand(啟動時不創建子進程,有需求才創建)
  2. pm.max_children = 5 該池同時最多存在5個進程, 三種管理方式都要配置
  3. pm.start_servers = 2 fpm啟動時創建2個子進程,只適用動態dynamic管理方式
  4. pm.min_spare_servers = 2 服務器閑置時最少保持2個子進程,不夠這個數就會創建,只適用動態dynamic管理方式
  5. pm.max_spare_servers = 3 服務器閑置時最多要有幾個,多了會kill,只適用動態dynamic管理方式
  6. pm.process_idle_timeout = 10s; 子進程閑置10s后就會被殺掉。

8.0 pm.max_requests = 500 每個子進程最大處理500請求就被回收,可防止內存泄露。
9.0 有幾個設置,可以看fpm的status,和nginx的差不多。
10.0 access.log = var/log/$pool.access.log 訪問文件日志,沒啥用處,比如yii2每次都記錄訪問index.php,只是記錄真實的PHP文件。
11.0 slowlog = var/log/$pool.log.slow PHP文件執行過慢的日志,會准確的記錄具體哪一行代碼太慢,這個非常有用,在設置了時間時生效。
11.1 request_slowlog_timeout = 2s 超過這個運行時間就會寫慢日志
12.0 request_terminate_timeout = 3s 單個請求的超時時間,有時候php.ini設置的最大執行時間未生效,這個就會來干掉那個執行太久的請求。
13.0 rlimit_files = 1024 最大打開句柄數,默認為系統值。
14.0 rlimit_core = 0 最多的核心使用數,默認為系統分配。
15.0 chroot = /path 路徑必須是絕對路徑,改變子進程的跟目錄,可以把進程對文件系統的讀寫與實際的操作系統文件系統隔離,對安全有好處。
16.0 chdir = /var/www 改變當前工作目錄,可以用相對路徑,默認是當前目錄或者chroot。
17.0 catch_workers_output = yes 重定向標准輸出stdout和標准錯誤stderr到主錯誤日志,如果不設置,這兩個日志就會定向到/dev/null,在高負載情況下,這個配置會引起頁面延遲幾毫秒,默認不開啟。
18.0 clear_env = no 創建work進程時是否清除環境變量,如果是yes,那么該子進程getenv()就訪問不到$_ENV和$_SERVER了。
19.0 security.limit_extensions = .php .php3 .php4 .php5 為了安全,限制能執行的腳本后綴
20.0 為當前池指定另外的php.ini配置,比如指定當前池的錯誤日志寫在哪個地方

  1. php_value/php_flag 可以設置php.ini的內容,可以被ini_set覆蓋
  2. php_admin_value/php_admin_flag 這個同上,但是不會被ini_set覆蓋。
  3. 其中flag設置的,值只能是on, off, 1, 0, true, false, yes or no,其他類型的值需要用value
  4. php_flag[display_errors] = off
  5. php_admin_value[error_log] = /var/log/fpm-php.www.log
  6. php_admin_flag[log_errors] = on
  7. php_admin_value[memory_limit] = 32M
  8. 這種方法設置`disable_functions``disable_classes`時,不會覆蓋php.ini的設置,只會追加。

注意:PHP配置值通過 php_value 或者 php_flag 設置,並且會覆蓋以前的值。請注意 disable_functions 或者 disable_classes 在 php.ini 之中定義的值不會被覆蓋掉,但是會將新的設置附加在原有值的后面。
使用 php_admin_value 或者 php_admin_flag 定義的值,不能被 PHP 代碼中的 ini_set() 覆蓋。

自 5.3.3 起,也可以通過 web 服務器設置 PHP 的設定。

nginx通過unixsock與php-fpm通信:

適用場景:nginx和php-fpm在同一台服務器上,這時可以直接用unixsocket進程間通信,不走tcp端口通信,可以節約創建連接的時間,從而提高性能。

1,設置php-fpm的listen為/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock(可以用相對路徑),然后重啟fpm就會自動創建該php567-fpm.sock文件
2,nginx的fastcgi_pass參數修改為 unix:/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock;
通過php567-fpm.sock文件去和fpm通信
需要保證該php567-fpm.sock文件nginx有權限訪問。

總結:sock文件隨便創建到哪里都可以,只要fpm有權限在那個目錄里寫文件,nginx有權限去讀就可以。
tcp連接會更穩定,因為有tcp協議保證數據的正確性,但是sock有更少的數據拷貝和上下文切換,更少的資源占用。
不過只能在nginx和fpm在同一台機器上才能用sock。

fpm進程狀態監控

1,nginx配置:遇到status的請求,直接轉發給php

  1. location ~^/status$ {
  2. fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
  3. include fastcgi_params;
  4. fastcgi_pass 127.0.0.1:9000;
  5. }

2,fpm配置:pm.status_path = /status
3, 然后重新fpm和nginx,在瀏覽器里訪問就能看到了:
默認以text/plain展示結果,可以傳參數?json/html/xml分別得到json等格式的結果;參數full可以查看每個子進程的明細

  1. pool 進程池名稱
  2. process manager 進程管理方式
  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. 如果進程是閑置狀態,那這些信息記錄的就是上次請求的相關數據,否則就是當前本次請求的相關數據。

backlog配置問題

一個fpm子進程在同一時間只能處理一個請求,如果,
backlog設置得過大,nginx之類的客戶端發起的請求一直沒有fpm子進程進行accept,nginx就會直接斷掉這個連接,等fpm忙過來了再去accept的時候,就會發現斷開了,於是報錯。
backlog設置得過小,訪問量大時fpm子進程全部處於忙碌狀態,backlog也塞滿了,就會拒絕新的連接,此時nginx再請求,就會直接被拒。
所以需要合理的設置backlog參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM