1 FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。
它的功能包括:
● 支持平滑停止/啟動的高級進程管理功能;
● 可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);
● stdout 和 stderr 日志記錄;
● 在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode;
● 文件上傳優化支持;
● "慢日志" - 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;
● fastcgi_finish_request() - 特殊功能:用于在請求完成和刷新數據后,繼續在后臺執行耗時的工作(錄入視頻轉換、統計處理等);
● 動態/靜態子進程產生;
● 基本 SAPI 運行狀態信息(類似Apache的 mod_status);
● 基于 php.ini 的配置文件。
2 從源代碼編譯
編譯 PHP 時需要 --enable-fpm 配置選項來激活 FPM 支持。
以下為 FPM 編譯的具體配置參數(全部為可選參數):
● --with-fpm-user - 設置 FPM 運行的用戶身份(默認 - nobody)
● --with-fpm-group - 設置 FPM 運行時的用戶組(默認 - nobody)
● --with-fpm-systemd - 啟用 systemd 集成 (默認 - no)
● --with-fpm-acl - 使用POSIX 訪問控制列表 (默認 - no) 5.6.5版本起有效
3 配置
FPM 配置文件為 php-fpm.conf,其語法類似 php.ini 。
1 php-fpm.conf 全局配置段
pid string
PID文件的位置。默認為空。
error_log string
錯誤日志的位置。默認:安裝路徑 #INSTALL_PREFIX#/log/php-fpm.log。
log_level string
錯誤級別??捎眉墑e為:alert(必須立即處理),error(錯誤情況),warning(警告情況),notice(一般重要信息),debug(調試信息)。默認:notice。
emergency_restart_threshold int
如果子進程在 emergency_restart_interval 設定的時間內收到該參數設定次數的 SIGSEGV 或者 SIGBUS退出信息號,則FPM會重新啟動。0 表示“關閉該功能”。默認值:0(關閉)。
emergency_restart_interval mixed
emergency_restart_interval 用于設定平滑重啟的間隔時間。這么做有助于解決加速器中共享內存的使用問題??捎脝挝唬簊(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。
process_control_timeout mixed
設置子進程接受主進程復用信號的超時時間。可用單位:s(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。
daemonize boolean
設置 FPM 在后臺運行。設置“no”將 FPM 保持在前臺運行用于調試。默認值:yes。
2 運行配置區段
在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。
listen string
設置接受 FastCGI 請求的地址??捎酶袷綖椋?ip:port','port','/path/to/unix/socket'。每個進程池都需要設置。
listen.backlog int
設置 listen(2) 的半連接隊列長度?!?1”表示無限制。默認值:-1。
listen.allowed_clients string
設置允許連接到 FastCGI 的服務器 IPV4 地址。等同于 PHP FastCGI (5.2.2+) 中的 FCGI_WEB_SERVER_ADDRS 環境變量。僅對 TCP 監聽起作用。每個地址是用逗號分隔,如果沒有設置或者為空,則允許任何服務器請求連接。默認值:any。
listen.owner string
如果使用,表示設置 Unix 套接字的權限。在Linux中,讀寫權限必須設置,以便用于 WEB 服務器連接。在很多 BSD 派生的系統中可以忽略權限允許自由連接。默認值:運行所使用的用戶和組,權限為 0666。
listen.group string
listen.mode string
user string
FPM 進程運行的Unix用戶。必須設置。
group string
FPM 進程運行的 Unix 用戶組。如果沒有設置,則默認用戶的組被使用。
pm string
設置進程管理器如何管理子進程。可用值:static,ondemand,dynamic。必須設置。
static - 子進程的數量是固定的(pm.max_children)。
ondemand - 進程在有需求時才產生(當請求時,與 dynamic 相反,pm.start_servers 在服務啟動時即啟動。
dynamic - 子進程的數量在下面配置的基礎上動態設置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
pm.max_children int
pm 設置為 static 時表示創建的子進程的數量,pm 設置為 dynamic 時表示最大可創建的子進程的數量。必須設置。
該選項設置可以同時提供服務的請求數限制。類似 Apache 的 mpm_prefork 中 MaxClients 的設置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 環境變量。
pm.start_servers in
設置啟動時創建的子進程數目。僅在 pm 設置為 dynamic 時使用。默認值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
pm.min_spare_servers int
設置空閑服務進程的最低數目。僅在 pm 設置為 dynamic 時使用。必須設置。
pm.max_spare_servers int
設置空閑服務進程的最大數目。僅在 pm 設置為 dynamic 時使用。必須設置。
pm.max_requests int
設置每個子進程重生之前服務的請求數。對于可能存在內存泄漏的第三方模塊來說是非常有用的。如果設置為 '0' 則一直接受請求,等同于 PHP_FCGI_MAX_REQUESTS 環境變量。默認值:0。
pm.status_path string
FPM 狀態頁面的網址。如果沒有設置,則無法訪問狀態頁面,默認值:無。
ping.path string
FPM 監控頁面的 ping 網址。如果沒有設置,則無法訪問 ping 頁面。該頁面用于外部檢測 FPM 是否存活并且可以響應請求。請注意必須以斜線開頭(/)。
ping.response string
用于定義 ping 請求的返回響應。返回為 HTTP 200 的 text/plain 格式文本。默認值:pong。
request_terminate_timeout mixed
設置單個請求的超時中止時間。該選項可能會對 php.ini 設置中的 'max_execution_time' 因為某些特殊原因沒有中止運行的腳本有用。設置為 '0' 表示 'Off'。可用單位:s(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。
request_slowlog_timeout mixed
當一個請求該設置的超時時間后,就會將對應的 PHP 調用堆棧信息完整寫入到慢日志中。設置為 '0' 表示 'Off'。可用單位:s(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。
slowlog string
慢請求的記錄日志。默認值:#INSTALL_PREFIX#/log/php-fpm.log.slow。
rlimit_files int
設置文件打開描述符的 rlimit 限制。默認值:系統定義值。
rlimit_core int
設置核心 rlimit 最大限制值??捎弥担?unlimited',0 或者正整數。默認值:系統定義值。
chroot string
啟動時的 Chroot 目錄。所定義的目錄需要是絕對路徑。如果沒有設置,則 chroot 不被使用。
chdir string
設置啟動目錄,啟動時會自動 Chdir 到該目錄。所定義的目錄需要是絕對路徑。默認值:當前目錄,或者根目錄(chroot時)。
catch_workers_output boolean
重定向運行過程中的 stdout 和 stderr 到主要的錯誤日志文件中。如果沒有設置,stdout 和 stderr 將會根據 FastCGI 的規則被重定向到 /dev/null。默認值:無。