2024 年 PHP 日本研討會

設定

FPM 使用 php.ini 語法作為其設定檔 - php-fpm.conf 以及池組態檔。

全域 php-fpm.conf 指令列表

pid 字串

PID 檔案的路徑。預設值:無。

error_log 字串

錯誤紀錄檔的路徑。預設值:#INSTALL_PREFIX#/log/php-fpm.log。如果設定為 "syslog",紀錄會傳送到 syslogd 而不是寫入本機檔案。

log_level 字串

錯誤日誌級別。可選值:alert, error, warning, notice, debug。預設值:notice。

log_limit 整數

日誌長度限制,允許記錄超過 1024 個字元的訊息而不換行。預設值:1024。PHP 7.3.0 起可用。

log_buffering 布林值

實驗性功能:無額外緩衝的日誌記錄。預設值:yes (啟用)。PHP 7.3.0 起可用。

syslog.facility 字串

用於指定記錄訊息的程式類型。預設值:daemon。

syslog.ident 字串

加在每條訊息之前。如果您在同一台伺服器上運行多個 FPM 執行個體,您可以更改預設值以符合一般需求。預設值:php-fpm。

emergency_restart_threshold 整數

如果在 emergency_restart_interval 設定的時間間隔內,有這麼多個子行程以 SIGSEGV 或 SIGBUS 訊號退出,則 FPM 將會重新啟動。值為 0 表示「關閉」。預設值:0 (關閉)。

emergency_restart_interval 混合

emergency_restart_interval 使用的時間間隔,用於決定何時啟動正常重新啟動。這對於解決加速器共享記憶體中的意外損壞很有用。可用單位:s(秒)、m(分鐘)、h(小時) 或 d(天)。預設單位:秒。預設值:0 (關閉)。

process_control_timeout 混合

子行程等待主行程訊號反應的時間限制。可用單位:s(秒)、m(分鐘)、h(小時) 或 d(天)。預設單位:秒。預設值:0。

process.max 整數

FPM 將 fork 的最大行程數。這旨在控制在多個池中使用動態 PM 時的整體行程數。請謹慎使用。預設值:0。

process.priority 整數

指定套用到主行程的 nice(2) 優先級 (僅在設定時)。值範圍從 -19 (最高優先級) 到 20 (最低優先級)。預設值:未設定。

daemonize 布林值

將 FPM 送到背景執行。設定為 'no' 可讓 FPM 保持在前台以便進行除錯。預設值:yes (啟用)。

rlimit_files 整數

為主行程設定開啟檔案描述符的 rlimit。預設值:系統定義值。

rlimit_core 整數

為主行程設定最大核心大小 rlimit。預設值:0。

events.mechanism 字串

指定 FPM 將使用的事件機制。可用的選項:select, pool, epoll, kqueue (*BSD), port (Solaris)。預設值:未設定 (自動偵測)。

systemd_interval 整數

當 FPM 使用 systemd 整合建置時,指定向 systemd 發送健康報告通知的時間間隔 (以秒為單位)。設定為 0 可停用。預設值:10。

池指令列表

使用 FPM,您可以運行多個具有不同設定的處理程序池。以下是可以針對每個池調整的設定。

listen 字串

接受 FastCGI 請求的地址。有效語法為:'ip.add.re.ss:port'、'port'、'/path/to/unix/socket'。此選項對每個池都是必需的。

listen.backlog 整數

設定 listen(2) 的 backlog。值 -1 在 BSD 系統上表示最大值。預設值:-1(FreeBSD 或 OpenBSD)或 511(Linux 和其他平台)。

listen.allowed_clients 字串

允許連線的 FastCGI 用戶端的 IPv4 或 IPv6 地址列表。相當於原始 PHP FastCGI (5.2.2+) 中的 FCGI_WEB_SERVER_ADDRS 環境變數。僅適用於 tcp 監聽 socket。每個地址必須以逗號分隔。如果此值留空,則將接受來自任何 IP 地址的連線。預設值:未設定(接受任何 IP 地址)。

listen.owner 字串

如果使用 Unix socket,則設定其權限。在 Linux 中,必須設定讀/寫權限才能允許來自網路伺服器的連線。許多源自 BSD 的系統允許連線,而不論權限為何。預設值:使用者和群組設定為正在執行的使用者,模式設定為 0660。

listen.group 字串

請參閱 listen.owner

listen.mode 字串

請參閱 listen.owner

listen.acl_users 字串

當支援 POSIX 訪問控制列表時,您可以使用此選項進行設定。設定後,listen.ownerlisten.group 將被忽略。值是以逗號分隔的使用者名稱列表。

listen.acl_groups 字串

請參閱 listen.acl_users。值是以逗號分隔的群組名稱列表。

user 字串

FPM 處理程序的 Unix 使用者。此選項是必需的。

group 字串

FPM 處理程序的 Unix 群組。如果未設定,則使用預設使用者的群組。

pm 字串

選擇處理程序管理員將如何控制子處理程序的數量。可能的值:staticondemanddynamic。此選項是必需的。

static - 子處理程序的數量是固定的(pm.max_children)。

ondemand - 處理程序按需產生(在請求時,與 dynamic 不同,dynamic 會在服務啟動時啟動 pm.start_servers)。

dynamic - 子進程的數量會根據以下指令動態設定:pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm.max_children 整數

pm 設定為 static 時,要建立的子進程數量;當 pm 設定為 dynamic 時,要建立的子進程最大數量。此選項為必填。

此選項設定同時處理請求數量的上限。相當於 mpm_prefork 模組下的 Apache 的 MaxClients 指令,以及原始 PHP FastCGI 中的環境變數 PHP_FCGI_CHILDREN

pm.start_servers 整數

啟動時建立的子進程數量。僅在 pm 設定為 dynamic 時使用。預設值:(min_spare_servers + max_spare_servers) / 2。

pm.min_spare_servers 整數

閒置伺服器進程的期望最小數量。僅在 pm 設定為 dynamic 時使用。在此情況下也為必填。

pm.max_spare_servers 整數

閒置伺服器進程的期望最大數量。僅在 pm 設定為 dynamic 時使用。在此情況下也為必填。

pm.max_spawn_rate 整數

一次產生子進程的速率。僅在 pm 設定為 dynamic 時使用。預設值:32。

pm.process_idle_timeout 混合

閒置進程在幾秒後將被終止。僅在 pm 設定為 ondemand 時使用。可用單位:s(秒)(預設)、m(分鐘)、h(小時)或 d(天)。預設值:10s。

pm.max_requests 整數

每個子進程在重新產生之前應該執行的請求數量。這對於解決第三方程式庫中的記憶體洩漏問題很有用。對於無止盡的請求處理,請指定「0」。相當於 PHP_FCGI_MAX_REQUESTS。預設值:0。

pm.status_listen 字串

接受 FastCGI 狀態請求的位址。這會建立一個新的不可見池,可以獨立處理請求。如果主池忙於處理長時間執行的請求,這會很有用,因為在長時間執行的請求完成之前,仍然可以取得FPM 狀態頁面。語法與listen指令相同。預設值:無。

pm.status_path 字串

用於檢視FPM 狀態頁面的 URI。此值必須以斜線 (/) 開頭。如果未設定此值,則不會將任何 URI 識別為狀態頁面。預設值:無。

ping.path 字串

用於呼叫 FPM 監控頁面的 ping URI。如果未設定此值,則不會將任何 URI 識別為 ping 頁面。這可以用於從外部測試 FPM 是否處於活動狀態並正在回應。請注意,此值必須以斜線 (/) 開頭。

ping.response 字串

此指令可用於自訂 ping 請求的回應。回應格式為 text/plain,回應碼為 200。預設值:pong。

process.priority 整數

指定套用至工作行程的 nice(2) 優先順序(僅在設定時)。值可以從 -19(最高優先順序)到 20(最低優先順序)。預設值:未設定。

process.dumpable 布林值

即使行程的使用者或群組與主行程的使用者不同,也設定行程的 dumpable 旗標(PR_SET_DUMPABLE prctl)。它允許為池使用者建立行程核心傾印檔並使用 ptrace 追蹤行程。預設值:否。從 PHP 7.0.29、7.1.17 和 7.2.5 開始提供。

prefix 字串

指定路徑評估的前綴

request_terminate_timeout 混合

處理單一請求的逾時時間,超過此時間後工作行程將被終止。當 'max_execution_time' ini 選項因故無法停止腳本執行時,應使用此選項。值 '0' 表示「關閉」。可用單位:s(秒)(預設)、m(分鐘)、h(小時)或 d(天)。預設值:0。

request_terminate_timeout_track_finished 布林值

fastcgi_finish_request 之後或應用程式已完成且正在呼叫內部關閉函式時,request_terminate_timeout 設定的逾時不會生效。此指令將允許即使在這種情況下也無條件套用逾時限制。預設值:否。從 PHP 7.3.0 開始提供。

request_slowlog_timeout 混合

處理單一請求的逾時時間,超過此時間後,PHP 回溯將被傾印到「slowlog」檔案。值 '0' 表示「關閉」。可用單位:s(秒)(預設)、m(分鐘)、h(小時)或 d(天)。預設值:0。

request_slowlog_trace_depth 整數

slowlog 記錄堆疊追蹤的深度。預設值:20。從 PHP 7.2.0 開始提供。

slowlog 字串

慢速請求的記錄檔。預設值:#INSTALL_PREFIX#/log/php-fpm.log.slow

rlimit_files 整數

設定此池中子行程的開啟檔案描述器 rlimit。預設值:系統定義值。

rlimit_core 整數

設定此池中子行程的最大核心大小 rlimit。可能的值:「unlimited」或大於或等於 0 的整數。預設值:系統定義值。

chroot 字串

啟動時切換根目錄到此目錄。此值必須定義為絕對路徑。未設定此值時,不使用 chroot。

chdir 字串

啟動時變更目錄到此目錄。此值必須是絕對路徑。預設值:目前目錄或 chroot 時為 /。

catch_workers_output 布林值

將工作行程的標準輸出和標準錯誤輸出重新導向到主要錯誤記錄檔。如果未設定,標準輸出和標準錯誤輸出將根據 FastCGI 規範重新導向到 /dev/null。預設值:否。

decorate_workers_output 布林值

catch_workers_output 啟用時,啟用工作行程輸出的裝飾。預設值:是。從 PHP 7.3.0 開始提供。

clear_env 布林值

清除 FPM worker 中的環境變數。在新增此池設定中指定的環境變數之前,先清除 worker 中的環境變數,以防止任意環境變數傳遞到 FPM worker 程序。預設值:是。

security.limit_extensions 字串

限制 FPM 將解析的主要腳本的副檔名。這可以防止 Web 伺服器端的設定錯誤。您應該僅將 FPM 限制為 .php 副檔名,以防止惡意使用者使用其他副檔名執行 PHP 程式碼。預設值:.php .phar

apparmor_hat 字串

如果啟用了 AppArmor,則允許更改 hat。預設值:未設定

access.log 字串

存取記錄檔。預設值:未設定

access.format 字串

存取記錄格式。預設值:"%R - %u %t \"%m %r\" %s"

有效選項
佔位符 說明
%% % 字元
%C 請求使用的 %CPU。它可以接受以下格式:%{user}C 僅適用於使用者 CPU,%{system}C 僅適用於系統 CPU,%{total}C 適用於使用者 + 系統 CPU(預設)
%d 處理請求所花費的時間。為了精確起見,它可以接受以下格式:%{seconds}d(預設),%{milliseconds}d%{microseconds}d
%{名稱}e 環境變數(與 $_ENV$_SERVER 相同)。必須在大括號內指定變數名稱以指定環境變數的名稱。例如,伺服器細節,如 %{REQUEST_METHOD}e%{SERVER_PROTOCOL}e,HTTP 標頭,如 %{HTTP_HOST}e%{HTTP_USER_AGENT}e
%f 腳本檔名
%l 請求的 Content-Length(僅適用於 HTTP POST 請求)
%m 請求 HTTP 方法
%M PHP 分配的記憶體峰值。它可以接受以下格式:%{bytes}M(預設),%{kilobytes}M %{kilo}M%{megabytes}M%{mega}M
%n 池名稱
%{名稱}o 輸出標頭。標頭名稱必須在大括號內指定。例如:%{Content-Type}o%{X-Powered-By}o%{Transfer-Encoding}o
%p 處理請求的子程序的 PID
%P 處理請求的子程序的父程序的 PID
%q 查詢字串
%Q '?' 字元,或者如果查詢字串存在,則為 %q%r 之間的連接符
%r 不含查詢字串的請求 URI,請參閱 %q%Q
%R 遠端 IP 位址
%s 狀態(回應碼)
%t 收到請求的伺服器時間。它可以接受 strftime(3) 格式:%d/%b/%Y:%H:%M:%S %z(預設)strftime(3) 格式必須封裝在 %{<strftime_format>}t 標籤中,例如,對於 ISO8601 格式的時間字串,請使用:%{%Y-%m-%dT%H:%M:%S%z}t
%T 記錄寫入的時間(請求完成時)。它可以接受 strftime(3) 格式:%d/%b/%Y:%H:%M:%S %z(預設值)。strftime(3) 格式必須封裝在 %{<strftime_format>}t 標籤中,例如,對於 ISO8601 格式的時間字串,請使用:%{%Y-%m-%dT%H:%M:%S%z}t
%u 如果在 Authorization 標頭中指定,則為基本存取驗證使用者。

可以傳遞額外的環境變數並更新特定池的 PHP 設定。要執行此操作,您需要將以下選項添加到池設定檔中。

範例 #1 將環境變數和 PHP 設定傳遞到池

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
使用 php_valuephp_flag 傳遞的 PHP 設定將覆蓋其先前的值。請注意,定義 disable_functionsdisable_classes 不會覆蓋先前定義的 php.ini 值,而是會附加新值。

使用 php_admin_valuephp_admin_flag 定義的設定無法使用 ini_set() 覆蓋。

可以在網路伺服器設定中設定 PHP 設定。

範例 #2 在 nginx.conf 中設定 PHP 設定

set $php_value "pcre.backtrack_limit=424242";
set $php_value "$php_value \n pcre.recursion_limit=99999";
fastcgi_param  PHP_VALUE $php_value;

fastcgi_param  PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
注意

由於這些設定是作為 fastcgi 標頭傳遞給 php-fpm 的,因此 php-fpm 不應綁定到全球可存取的位址。否則,任何人都可以更改 PHP 設定選項。另請參閱 listen.allowed_clients

備註 池不是安全機制,因為它們不提供完全隔離;例如,所有池都將使用單個 OPcache 執行個體。

新增備註

使用者貢獻的備註 9 則備註

ikrabbe
6 年前
似乎沒有辦法得知已使用或可以使用的存取日誌格式代碼。我找到的只有原始程式碼。

在部署 php-fpm 時,如果沒有未解決的問題,真的會很有幫助。例如,我經常在檔案路徑上遇到困難,但那是另一個主題。

case '%': /* '%' */
case 'C': /* %CPU */
case 'd': /* 期間 µs */
case 'e': /* fastcgi 環境 */
case 'f': /* 腳本 */
case 'l': /* 內容長度 */
case 'm': /* 方法 */
case 'M': /* 記憶體 */
case 'n': /* 池名稱 */
case 'o': /* 標頭輸出 */
case 'p': /* PID */
case 'P': /* PID */
case 'q': /* query_string */
case 'Q': /* '?' */
case 'r': /* 請求 URI */
case 'R': /* 遠端 IP 位址 */
case 's': /* 狀態 */
case 'T'
case 't': /* 時間 */
case 'u': /* 遠端使用者 */
rob at librobert dot net
3 年前
php-fpm.conf 中使用的 `include` 指令在此並未說明。然而,這個指令也可以在 pool 設定中使用。在被包含的檔案中,`$pool` 變數會被正確地替換。

這表示,如果您有多個 pools 具有類似的設定,您可以建立一個名為 `default-values.inc` 的檔案,如下所示:

-----
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = X
pm.min_spare_servers = X
pm.max_spare_servers = X

access.log = /var/log/php-fpm/$pool.access
access.format = "%R %u [%t] \"%m %r\" %s %d %l"
slowlog = /var/log/php-fpm/$pool.slow

php_flag[short_open_tag] = off
-----

然後在每個 pool 設定中包含該檔案,如下所示:

-----
[vhost1.example.com]
user = www-vhost1
group = www-vhost1

listen = 127.0.0.1:9001

include = /usr/local/etc/php-fpm.d/default-values.inc
-----

這樣可以讓事情更透明化,並且如果您決定更改設定,可能會節省一些時間。

請確保被包含的檔案名稱不要以 `.conf` 結尾,因為所有副檔名為 `.conf` 的檔案都會從 php-fpm.conf 載入。
gadnet at aqueos dot com
10 年前
看來這份文件缺少很多東西。

PHP FPM 的範例設定檔指示了不同的東西,有更多選項等等... 我想知道為什麼主要的說明文件比使用者可能擁有(或可能沒有)的設定檔還要簡略?
Frank DENIS
13 年前
`listen.backlog` 的預設值並非完全「無限制」。

在某些作業系統上是 128,在其他系統上是 -1(這也不代表「無限制」,而是硬性限制的別名)。

請檢查像 `kern.somaxconn`(OpenBSD)或 `net.core.somaxconn`(Linux)這樣的系統核心參數值。

如果您需要的 PHP worker 超過預設值,請將其調高。然後在您的 php-fpm 設定檔中將 `listen.backlog` 調整為相同的值。

-Frank.
antonfedonyuk at gmail dot com
3 年前
注意:包含 `%o` 的 `access.format` 在 PHP 7.4 中會產生錯誤(未在其他版本中測試)。
antonfedonyuk at gmail dot com
3 年前
; 存取日誌格式。
; 允許以下語法
; %%:'%' 字元
; %C:請求使用的 CPU 百分比
; 它可以接受以下格式
; - %{user}C:僅限使用者 CPU
; - %{system}C:僅限系統 CPU
; - %{total}C:使用者 + 系統 CPU(預設)
; %d:處理請求所需的時間
; 它可以接受以下格式
; - %{seconds}d(預設)
; - %{milliseconds}d
; - %{milli}d
; - %{microseconds}d
; - %{micro}d
; %e:環境變數(與 $_ENV 或 $_SERVER 相同)
; 它必須與大括號一起使用以指定環境變數的名稱。
; 一些例子
; - 伺服器特定資訊,例如:%{REQUEST_METHOD}e 或 %{SERVER_PROTOCOL}e
; - HTTP 標頭,例如:%{HTTP_HOST}e 或 %{HTTP_USER_AGENT}e
; %f:腳本檔名
; %l:請求的內容長度(僅適用於 POST 請求)
; %m:請求方法
; %M: PHP 分配的記憶體峰值
; 它可以接受以下格式
; - %{bytes}M(預設)
; - %{kilobytes}M
; - %{kilo}M
; - %{megabytes}M
; - %{mega}M
; %n: 池名稱
; %o: 輸出標頭
; 它必須與大括號一起使用來指定標頭的名稱
; - %{Content-Type}o
; - %{X-Powered-By}o
; - %{Transfert-Encoding}o
; - ....
; %p: 處理請求的子行程 PID
; %P: 處理請求的子行程之父行程的 PID
; %q: 查詢字串
; %Q: 如果存在查詢字串,則為 '?' 字元
; %r: 請求 URI(不包含查詢字串,請參閱 %q 和 %Q)
; %R: 遠端 IP 位址
; %s: 狀態(回應碼)
; %t: 伺服器收到請求的時間
; 它可以接受 strftime(3) 格式
; %d/%b/%Y:%H:%M:%S %z(預設)
; strftime(3) 格式必須封裝在 %{<strftime_format>}t 標籤中
; 例如,對於 ISO8601 格式的時間字串,請使用: %{%Y-%m-%dT%H:%M:%S%z}t
; %T: 寫入日誌的時間(請求已完成)
; 它可以接受 strftime(3) 格式
; %d/%b/%Y:%H:%M:%S %z(預設)
; strftime(3) 格式必須封裝在 %{<strftime_format>}t 標籤中
; 例如,對於 ISO8601 格式的時間字串,請使用: %{%Y-%m-%dT%H:%M:%S%z}t
; %u: 遠端使用者
;
; 預設值: "%R - %u %t \"%m %r\" %s"
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"

https://github.com/php/php-src/blob/master/sapi/fpm/www.conf.in#L257-L318
frederic at juliana-multimedia dot com
6 年前
使用 Apache、mod_proxy_fcgi 和 php-fpm,如果您想要一個通用的池和幾個具有不同 php 設定的虛擬主機,您可以使用 ProxyFCGISetEnvIf 指令和 PHP_ADMIN_VALUE 環境變數。即使對於布林值指令,它也不適用於 PHP_ADMIN_FLAG。

PHP 指令必須以空格和 \n 分隔。

ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=/var/www/toto/:/tmp/ \n session.save_path=/var/www/toto/session \n display_errors=On \n error_reporting=-1"
jon dot phpnetdonotspam at langevin dot me
1 年前
PHP-FPM 設定頁面顯然沒有說明需要指定每個 PHP 版本可用的選項。

它聲稱 pm.status_listen 是一個有效的指令,但該指令僅在 php 8.0.0 或更高版本中存在,這對於仍在使用 PHP 7.4 的我們來說是個壞消息。

為其他正在為此奮鬥的人註明這一點。
david dot cancalon at proxeem dot fr
4 年前
在使用共用 PHP-FPM 池的 Apache 虛擬主機設定中使用 ProxyFCGISetEnvIf 時要非常小心。像這樣定義的值會在池工作器中的所有 Apache 虛擬主機之間共用,可能會根據請求的順序導致奇怪的行為。

在此處查看完整說明
https://serverfault.com/questions/817020/stop-reusing-php-value-for-different-sites-with-php-fpm/817905#817905
To Top