FPM是FastCGI Process Manager的縮寫,由全稱我們可以知道其和FastCGI有關,就是一個FastCGI的進程管理器。對於FastCGI我們可以理解成一個協議,兒FPM是其在PHP中的一個實現。
FPM的出現實現了PHP應用的分布式部署,這樣使得PHP和web伺服器可以在不同的機器上。當然與其說是FPM不如說是FastCGI的出現。最初FPM並沒有被PHP的官方正式應用於PHP中,只是作為PHP的一個補丁應用。但是自從PHP5.3.3版本以後FPM被正式捆綁進PHP中,作為了PHP的一部分。這樣我們配置起來比較方便,只需在PHP編譯的時候添加—enable-fpm選項即可
php-5.6.9]# ./configure –enable-fpm
Fpm 的簡單配置
Fpm在php編譯的時候添加—enable-fpm選項即可啟動fpm,此外在編譯的時候還有兩個選項分別是 –with-fpm-user=USER 和—with-fpm-group=GROUP,用來設定fpm所屬的使用者和使用者組。如果不指定這兩項,那預設的使用者和使用者組都是nobody。當然這兩項也可以在fpm的設定檔php-fpm.conf(其所在目錄為PHP安裝目錄/etc/php-fpm.conf)中修改。
user = nobody
//所屬使用者
group = nobody
//所屬組
listen = 127.0.0.1:9000
//fpm所在伺服器的ip地址和監聽的連接埠號碼,預設為9000
pm = dynamic
//設定進程管理器是如何管理子進程的,dynamic動態管理至少會有一個子進程被建立,其數量有個最大值由pm.max_children來設定,而建立的數量由pm.start_servers來設定;static 靜態管理設定固定數量的子進程隨著服務啟動而被建立;ondemand 在服務啟動的時候並不建立子進程只是當有請求的時候才根據情況建立。
pm.max_children = 10
//當pm設定為static的時候,此值表示隨著服務的啟動建立的子進程的數量;當pm設定為dynamic或者ondemand的時候,此值表示建立的子進程最多不能超過此數量
pm.start_servers = 2
//表示隨著服務啟動建立的子進程(注意這裡是子進程而不是線程)的數量,此選項只有在pm 設定為dynamic的時候才有效。並且這個值預設設定為 min_spare_servers + (max_spare_servers – min_spare_servers)/2,並且如果此值設為0,那麼建立的子進程的數量也是由上述公式決定。
pm.min_spare_servers = 1
//要求閑置的服務進程的數量的最小值
pm.max_spare_servers = 3
//閑置的服務進程的數量的最大值
pm.process_idle_timeout = 10s
//進程的閑置時間,以秒為單位,超過這個時間該進程將會被殺死
Fpm 的應用
下面我們來看一下如何管理fastcgi服務,首先我們可以進入php安裝目錄
~]# cd /usr/local/php5
php5]# ./sbin/php-fpm
//開啟fastcgi服務,開啟服務以後會在/usr/local/php5/var/run/php-fpm.pid中有fastcgi主進程id
php5]# kill –INT `cat /usr/local/php5/var/run/php-fpm.pid`
//關閉fastcgi服務
php5]# kill –USR2 ` cat /usr/local/php5/var/run/php-fpm.pid`
//重啟fastcgi服務
Fpm 使用說明
在fpm簡單配置中我們提到pm=dynamic和pm.start_servers =2。當開啟fastcgi服務以後首先我們查看 php-fpm.pid
php5]# cat /usr/local/php5/var/run/php-fpm.pid //其結果為
32407
php5]# ps x | grep php-fpm //接著我們使用此命令查看其主進程情況
32407 ? Ss 0:00 php-fpm: master process (/usr/local/php5/etc/php-fpm.conf)
php5]# ps –ef | grep php-fpm //然後再使用該命令查看其所有進程情況
root 32407 1 0 13:46 ? 00:00:00 php-fpm: master process (/usr/local/php5/etc/php-fpm.conf)
nobody 32408 32407 0 13:46 ? 00:00:00 php-fpm: pool www
nobody 32409 32407 0 13:46 ? 00:00:00 php-fpm: pool www
在這裡我們看到了三條資訊,第一條是主進程,由系統建立,其id為32407,父進程id為1。剩餘兩條是其子進程,因為在pm.start_servers = 2 我們設定的為2,所以隨著服務的啟動會建立兩個子進程。這兩個子進程的使用者都是nobody(user=nobody),其進程id分別是 32408、32409,第三項是這兩個子進程的父進程的id 32407。
當然fpm至少會建立一個子進程,因為如果start_servers 設定為0 那麼其會根據上面我們說的那個公式計算出子進程的數量。當然如果我們設定min_spare_servers 和max_spare_servers都為0,那子進程的數量為0,這樣的話是不能啟動服務的(這些設定有效前提是pm設為dynamic)。因為fpm使用使用者為nobody的子進程來處理請求的,那個由系統建立的主進程——id為32407,所屬使用者為root——是不能處理請求的。當然我們可以根據我們伺服器的實際情況(例如:記憶體大小)來最佳化我們這裡的進程數量。
以上只是簡單的介紹了fpm的配置與使用,目的就是為了說明fpm的作用。