配置

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 将创建的进程的最大数量。这旨在在使用动态 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) 回退。值为 -1 表示 BSD 系统上的最大值。默认值:-1(FreeBSD 或 OpenBSD)或 511(Linux 和其他平台)。

listen.allowed_clients 字符串

允许连接的 FastCGI 客户端的 IPv4 或 IPv6 地址列表。等效于原始 PHP FastCGI (5.2.2+) 中的 FCGI_WEB_SERVER_ADDRS 环境变量。仅对 tcp 监听套接字有意义。每个地址必须用逗号分隔。如果此值为空白,则将接受来自任何 ip 地址的连接。默认值:未设置(接受任何 ip 地址)。

listen.owner 字符串

设置 Unix 套接字的权限,如果使用的话。在 Linux 中,必须设置读/写权限才能允许来自 Web 服务器的连接。许多 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 - 进程按需生成(当请求时,与动态相反,动态会在服务启动时启动 pm.start_servers)。

dynamic - 子进程的数量是根据以下指令动态设置的:pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm.max_children 整数

pm 设置为 static 时要创建的子进程数量,以及当 pm 设置为 dynamic 时要创建的子进程的最大数量。此选项是必须的。

此选项设置将服务同时请求的限制。等效于 ApacheMaxClients 指令(使用 mpm_prefork)以及原始 PHP FastCGI 中的 PHP_FCGI_CHILDREN 环境变量。

pm.start_servers 整数

启动时创建的子进程数量。仅当 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。

pm.min_spare_servers 整数

期望的最小空闲服务器进程数量。仅在 pm 设置为 dynamic 时使用。在这种情况下也是强制性的。

pm.max_spare_servers int

期望的最大空闲服务器进程数量。仅在 pm 设置为 dynamic 时使用。在这种情况下也是强制性的。

pm.max_spawn_rate int

一次生成子进程的速率。仅在 pm 设置为 dynamic 时使用。默认值:32

pm.process_idle_timeout mixed

空闲进程被杀死的秒数。仅在 pm 设置为 ondemand 时使用。可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays)。默认值:10s。

pm.max_requests int

每个子进程在重新生成之前应该执行的请求数。这对于解决第三方库中的内存泄漏很有用。对于无限的请求处理,指定 '0'。等效于 PHP_FCGI_MAX_REQUESTS。默认值:0。

pm.status_listen string

接受 FastCGI 状态请求的地址。这将创建一个新的不可见池,它可以独立处理请求。如果主池忙于长时间运行的请求,这很有用,因为它仍然可以在完成长时间运行的请求之前获取 FPM 状态页面。语法与 listen 指令相同。默认值:无。

pm.status_path string

查看 FPM 状态页面 的 URI。此值必须以斜杠 (/) 开头。如果未设置此值,则不会将任何 URI 识别为状态页面。默认值:无。

ping.path string

用于调用 FPM 监控页面的 ping URI。如果未设置此值,则不会将任何 URI 识别为 ping 页面。这可用于从外部测试 FPM 是否处于活动状态并响应。请注意,该值必须以斜杠 (/) 开头。

ping.response string

此指令可用于自定义对 ping 请求的响应。响应的格式为 text/plain,响应代码为 200。默认值:pong。

process.priority 整数

指定要应用于工作进程的 nice(2) 优先级(仅在设置时)。该值可以从 -19(最高优先级)到 20(最低优先级)不等。默认值:未设置。

process.dumpable bool

即使进程用户或组与主进程用户不同,也设置进程可转储标志(PR_SET_DUMPABLE prctl)。它允许为池用户创建进程核心转储并跟踪进程。默认值:否。自 PHP 7.0.29、7.1.17 和 7.2.5 起。

prefix string

指定路径评估的前缀

request_terminate_timeout mixed

为提供单个请求而设定的超时时间,在此之后工作进程将被杀死。如果由于某种原因 'max_execution_time' ini 选项无法停止脚本执行,则应使用此选项。值为 '0' 表示 '关闭'。可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays)。默认值:0。

request_terminate_timeout_track_finished bool

request_terminate_timeout 设置的超时时间在 fastcgi_finish_request 之后或应用程序已完成并且正在调用内部关闭函数后不会生效。此指令将启用超时限制,即使在这种情况下也会无条件应用。默认值:否。自 PHP 7.3.0 起。

request_slowlog_timeout mixed

为提供单个请求而设定的超时时间,在此之后,将把 PHP 回溯转储到 'slowlog' 文件。值为 '0' 表示 '关闭'。可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays)。默认值:0。

request_slowlog_trace_depth int

慢日志日志堆栈跟踪的深度。默认值:20。自 PHP 7.2.0 起。

slowlog string

慢请求的日志文件。默认值:#INSTALL_PREFIX#/log/php-fpm.log.slow

rlimit_files 整数

设置此池中子进程的打开文件描述符 rlimit。默认值:系统定义的值。

rlimit_core 整数

设置此池中子进程的最大核心大小 rlimit。可能的值:'unlimited' 或大于或等于 0 的整数。默认值:系统定义的值。

chroot string

在启动时 chroot 到此目录。此值必须定义为绝对路径。当未设置此值时,不使用 chroot。

chdir string

在启动时 chdir 到此目录。此值必须是绝对路径。默认值:当前目录或 chroot 时为 /。

catch_workers_output bool

将工作进程的 stdout 和 stderr 重定向到主错误日志。如果未设置,则 stdout 和 stderr 将根据 FastCGI 规范重定向到 /dev/null。默认值:否。

decorate_workers_output bool

在启用 catch_workers_output 时,启用工作进程输出的输出装饰。默认值:是。自 PHP 7.3.0 起可用。

clear_env bool

清除 FPM 工作进程中的环境。通过在添加此池配置中指定的 env 变量之前清除工作进程中的环境,防止任意环境变量到达 FPM 工作进程。默认值:是。

security.limit_extensions string

限制 FPM 允许解析的主脚本的扩展。这可以防止 Web 服务器端出现配置错误。您应该仅将 FPM 限制为 .php 扩展,以防止恶意用户使用其他扩展执行 php 代码。默认值:.php .phar

apparmor_hat string

如果启用了 AppArmor,则允许更改帽子。默认值:未设置

access.log string

访问日志文件。默认值:未设置

access.format string

访问日志格式。默认值:"%R - %u %t \"%m %r\" %s"

有效选项
占位符 描述
%C %CPU
%d 持续时间 µs
%e fastcgi env
%f 脚本
%l 内容长度
%m 方法
%M 内存
%n 池名称
%o 头输出
%p PID
%q 查询字符串
%Q %q 和 %r 之间的粘合剂
%r 请求 URI
%R 远程 IP 地址
%s 状态
%T 时间
%t 时间
%u 远程用户

可以传递额外的环境变量并更新特定池的 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 [email protected]
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() 覆盖。

可以在 Web 服务器配置中设置 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 实例。

添加笔记

用户贡献笔记 13 笔记

21
ikrabbe
6 年前
似乎无法获取有关使用的或可使用的访问日志格式代码的信息。我发现的只是源代码。

在部署 php-fpm 时,不用再有疑问,这将非常有帮助。我一直在与文件路径作斗争,例如,但那是另一个话题。

case '%': /* '%' */
case 'C': /* %CPU */
case 'd': /* 持续时间 µs */
case 'e': /* fastcgi env */
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': /* 远程用户 */
14
rob at librobert dot net
3 年前
此处没有记录在 php-fpm.conf 中使用的 'index' 指令。但是,此指令也可以在池配置中使用。在包含文件中,$pool 变量将被正确替换。

这意味着,如果您有多个具有类似配置的池,您可以创建一个名为“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
-----

然后在每个池配置中包含该文件,如下所示

-----
[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”结尾,因为所有具有该扩展名的文件都从php-fpm.conf加载。
4
jon dot phpnetdonotspam at langevin dot me
1 年前
PHP-FPM 配置页面似乎没有必要指定每个 PHP 版本可用的选项。

它声称 pm.status_listen 是一个有效的指令,但该指令仅在 php 8.0.0 及更高版本中存在,这对我们这些仍在使用 PHP 7.4 的人来说是一个打击。

为其他与之斗争的人记录这一点。
2
antonfedonyuk at gmail dot com
2 年前
注意:“access.format”包含“%o”在 PHP 7.4 中会导致错误(未在其他版本中测试)
14
gadnet at aqueos dot com
10 年前
该文档似乎缺少很多东西。

PHP fpm 示例配置文件指示不同的内容,更多选项等等... 我想知道为什么主文档比用户可以拥有(或没有)的配置文件更简洁?
2
david dot cancalon at proxeem dot fr
3 年前
使用使用共享 PHP-FPM 池的 Apache 虚拟主机配置中的 ProxyFCGISetEnvIf 时要非常小心。这样定义的值在池工作程序中的所有 Apache 虚拟主机之间共享,可能会导致奇怪的行为,具体取决于请求的顺序。

请参阅此处的完整说明
https://serverfault.com/questions/817020/stop-reusing-php-value-for-different-sites-with-php-fpm/817905#817905
6
frederic at juliana-multimedia dot com
5 年前
使用 Apache、mod_proxy_fcgi 和 php-fpm,如果您想要一个通用池和几个具有不同 php 配置的 vhost,您可以使用 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"
9
Frank DENIS
13 年前
listen.backlog 的默认值并不完全是“无限”。

它在某些操作系统上是 128,而在其他系统上是 -1(也不意味着“无限”,而是硬限制的别名)。

检查类似 kern.somaxconn(OpenBSD)或 net.core.somaxconn(Linux)的 sysctl 值。

如果您需要的 PHP 工作进程比默认值多,请将其提高。然后将 php-fpm 配置文件中的 listen.backlog 调整为相同的值。

-Frank。
2
rob at librobert dot net
3 年前
对我之前笔记的更正...

我写了“在 php-fpm.conf 中使用的‘index’指令”。

但显然我的意思是“‘include’指令”...
1
antonfedonyuk at gmail dot com
2 年前
; 访问日志格式。
; 允许以下语法
; %%: '%' 字符
; %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 相同)
; 它必须与括号相关联以指定 env 的名称
; 变量。一些例子
; - 服务器细节,例如:%{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
-4
Yousef Ismaeil Cliprz
10 年前
检查是否启用了 fastCGI

<?php
// 您可以在 $_SERVER['FCGI_SERVER_VERSION'] 中使用 isset 或 is_null
function isFastCGI () {
return !
is_null($_SERVER['FCGI_SERVER_VERSION']);
}

?>
-9
sroussey at gmail dot com
11 年前
从 5.3.9 开始,添加了 security.limit_extensions 配置项,默认值为 .php。如果您需要执行其他扩展,则必须更改此设置。
-20
mb
9 年前
如果您需要禁用 security.limit_extensions 变量,只需将变量设置为 FALSE,如下所示

security.limit_extensions = FALSE
To Top