作用
PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 程序管理器,用于管理PHP 程序池的軟體,用于接受web伺服器的請求。
PHP-FPM提供了更好的PHP程序管理方式,可以有效控制記憶體和程序、可以平滑重載PHP配置。
(1). 為什麼會出現php-fpm
fpm的出現全部因為php-fastcgi出現。為了很好的管理php-fastcgi而實作的一個程式
(2). 什麼是php-fastcgi
php-fastcgi 隻是一個cgi程式,隻會解析php請求,并且傳回結果,不會管理(是以才出現的php-fpm)。
(3)為什麼不叫php-cgi
其實在php-fastcgi出現之前是有一個php-cgi存在的,隻是它的執行效率低下,是以被php-fastcgi取代。
(4)那fastcgi和cgi有什麼差別呢?
親們,這差別就大了,當一個服務web-server(nginx)分發過來請求的時候,通過比對字尾知道該請求是個動态的php請求,會把這個請求轉給php。
在cgi的年代,思想比較保守,總是一個請求過來後,去讀取php.ini裡的基礎配置資訊,初始化執行環境,每次都要不停的去建立一個程序,讀取配置,初始化環境,傳回資料,退出程序,久而久之,啟動程序的工作變的乏味無趣特别累。
當php來到了5的時代,大家對這種工作方式特别反感,想偷懶的人就拼命的想,我可不可以讓cgi一次啟動一個主程序(master),讓他隻讀取一次配置,然後在啟動多個工作程序(worker),當一個請求來的時候,通過master傳遞給worker這樣就可以避免重複勞動了。于是就産生了fastcgi。
(5)fastcgi這麼好,啟動的worker用完怎麼辦?
當worker不夠的時候,master會通過配置裡的資訊,動态啟動worker,等空閑的時候可以收回worker
(6)到現在還是沒明白php-fpm 是個什麼東西?
就是來管理啟動一個master程序和多個worker程序的程式.PHP-FPM 會建立一個主程序,控制何時以及如何将HTTP請求轉發給一個或多個子程序處理。
PHP-FPM主程序還控制着什麼時候建立(處理Web應用更多的流量)和銷毀(子程序運作時間太久或不再需要了)PHP子程序。PHP-FPM程序池中的每個程序存在的時間都比單個HTTP請求長,可以處
理10、50、100、500或更多的HTTP請求。
安裝
PHP在 5.3.3 之後已經把php-fpm并入到php的核心代碼中了。 是以php-fpm不需要單獨的下載下傳安裝。
要想php支援php-fpm,隻需要在編譯php源碼的時候帶上 --enable-fpm 就可以了。
全局配置
在Centos中,PHP-FPM 的主配置檔案是 /etc/php7/php-fpm.conf。
指定一段時間内有指定個子程序失效了,PHP-FPM重新開機:
#在指定的一段時間内,如果失效的PHP-FPM子程序數超過這個值,PHP-FPM主程序将優雅重新開機。
emergency_restart_threshold = 10
#設定emergency_restart_interval 設定采用的時間跨度。
emergency_restart_interval = 1m
配置程序池
PHP-FPM配置檔案其餘的内容是一個名為Pool Defintions的區域。這個區域裡的配置使用者設定每個PHP-FPM程序池。PHP-FPM程序池中是一系列相關的PHP子程序。
通常一個PHP應用有自己一個程序池
Centos在PHP-FPM主配置檔案的頂部引入程序池定義檔案:
include=/etc/php7/php-fpm.d/*.conf
www.conf 是PHP-FPM程序池的預設配置檔案。
user= nobody
#擁有這個 PHP-FPM程序池中子程序的系統使用者。要把這個設定的值設用的非根使用者的使用者名。
group = nobody
#擁有這個 PHP-FPM程序池中子程序的系統使用者組。要把這個設定的值設應用的非根使用者所屬的使用者組名。
listen=[::]]:9000
#PHP-FPM程序池監聽的IP位址和端口号,讓 PHP-FPM 隻接受 nginx從這裡傳入的請求。 listen. allowed clients =127.0.0.1 #可以向這個 PHP-FPM程序池發送請求的IP位址(一個或多個)。 pm.max children =51 #這個設定設定任何時間點 PHP-FPM程序池中最多能有多少個程序。這個設定沒有絕對正确的值,你應該測試你的PHP應用,确定每個PHP程序需要使用多少記憶體,然後把這個設定設為裝置可用記憶體能容納的PHP程序總數。對大多數中小型PHP應用來說,每個PHP程序要使用5~15MB記憶體(具體用量可能有差異)。 假設我們使用裝置為這個PHP-FPM程序池配置設定了512MB可用記憶體,那麼可以把這個設定設為(512MB總記憶體)/(每個程序使用10MB) = 51個程序。 ...
編輯儲存,重新開機PHP-FPM主程序:
sudo systemctl restart php-fpm.service
PHP-FPM程序池的配置詳情參見 http://php.net/manual/install.fpm.configuration.php
參考Company開發環境
測試環境的配置如下:
[www]
user = nobody #程序的發起使用者和使用者組,使用者user是必須設定,group不是 nobody 任意使用者
group = nobody
listen = [::]:9000 #監聽ip和端口,[::] 代表任意ip
chdir = /app #在程式啟動時将會改變到指定的位置(這個是相對路徑,相對目前路徑或chroot後的“/”目錄)
pm = dynamic #選擇程序池管理器如何控制子程序的數量
#static: 對于子程序的開啟數路給定一個鎖定的值(pm.max_children)
#dynamic: 子程序的數目為動态的,它的數目基于下面的指令的值(以下為dynamic适用參數) pm.max_children = 16 #同一時刻能夠存貨的最大子程序的數量 pm.start_servers = 4 #在啟動時啟動的子程序數量 pm.min_spare_servers = 2 #處于空閑"idle"狀态的最小子程序,如果空閑程序數量小于這個值,那麼相應的子程序會被建立 pm.max_spare_servers = 16 #最大空閑子程序數量,空閑子程序數量超過這個值,那麼相應的子程序會被殺掉。 catch_workers_output = Yes #将worker的标準輸出和錯誤輸出重定向到主要的錯誤日志記錄中,如果沒有設定,根據FastCGI的指定,将會被重定向到/dev/null上
生産環境配置:
轉發請求給PHP-FPM
nginx為例:
server {
listen 83;
server_name mobile.com;
root /app/mobile/web/;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html; } location / { index index.html index.htm index.php; # Redirect everything that isn't a real file to index.php try_files $uri $uri/ /index.php$is_args$args; } #把HTTP請求轉發給PHP-FPM程序池處理 location ~ .*\.php include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 192.168.33.30:9000; #監聽9000端口 fastcgi_index index.php; try_files $uri =404; #include fastcgi.conf; } location ~ /\.(ht|svn|git) { deny all; } access_log /app/wwwlogs/access.log; error_log /app/wwwlogs/error.log; }
php-fpm啟動,重新開機,終止操作
啟動php-fpm:
/usr/sbin/php-fpm
或
/usr/local/php/sbin/php-fpm
php 5.3.3 以後的php-fpm 不再支援 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等指令,是以不要再看這種老掉牙的指令了,需要使用信号控制:
master程序可以了解以下信号
INT, TERM 立刻終止
QUIT 平滑終止
USR1 重新打開日志檔案
USR2 平滑重載所有worker程序并重新載入配置和二進制子產品
一個簡單直接的重新開機方法:
先檢視php-fpm的master程序号
# ps aux|grep php-fpm
root 21891 0.0 0.0 112660 960 pts/3 R+ 16:18 0:00 grep --color=auto php-fpm
root 42891 0.0 0.1 182796 1220 ? Ss 4月18 0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody 42892 0.0 0.6 183000 6516 ? S 4月18 0:07 php-fpm: pool www
nobody 42893 0.0 0.6 183000 6508 ? S 4月18 0:17 php-fpm: pool www
重新開機php-fpm:
kill -USR2 42891
上面方案一般是沒有生成php-fpm.pid檔案時使用,如果要生成php-fpm.pid,使用下面這種方案:
上面master程序可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf這個配置檔案,cat /usr/local/php/etc/php-fpm.conf 發現:
[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
;pid = run/php-fpm.pid
pid檔案路徑應該位于/usr/local/php/var/run/php-fpm.pid,由于注釋掉,是以沒有生成,我們把注釋去除,再kill -USR2 42891 重新開機php-fpm,便會生成pid檔案,下次就可以使用以下指令重新開機,關閉php-fpm了:
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'
轉載于:https://www.cnblogs.com/mzhaox/p/11230923.html