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将分叉的最大进程数。这旨在在使用大量池的动态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监听套接字有意义。每个地址必须用逗号分隔。如果此值留空,则将接受来自任何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_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers

pm.max_children int

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

此选项设置将要处理的并发请求数量的限制。等同于Apache的MaxClients指令(使用mpm_prefork)以及原始PHP FastCGI中的PHP_FCGI_CHILDREN环境变量。

pm.start_servers int

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

pm.min_spare_servers int

所需的空闲服务器进程的最小数量。仅当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(秒)(默认)、m(分钟)、h(小时)或d(天)。默认值: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(秒)(默认)、m(分钟)、h(小时)或d(天)。默认值: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(秒)(默认)、m(分钟)、h(小时)或d(天)。默认值: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重定向到主错误日志。如果未设置,则根据FastCGI规范将stdout和stderr重定向到/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。它可以接受以下格式:%{user}C仅限用户CPU,%{system}C仅限系统CPU,%{total}C用户+系统CPU(默认)
%d 处理请求所花费的时间。它可以接受以下格式以实现精度:%{seconds}d(默认)、%{milliseconds}d%{microseconds}d
%{name}e 环境变量(与$_ENV$_SERVER相同)。必须在花括号中指定变量名以指定env变量的名称。例如,服务器特定信息,如%{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 池名称
%{name}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 [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 实例。

添加注释

用户贡献的注释 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 变量会正确替换。

这意味着,如果您有多个具有相似配置的池,您可以创建一个名为“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 加载。
gadnet at aqueos dot com
10 年前
文档似乎缺少很多东西。

php fpm 示例配置文件指示不同的内容,更多选项等……我想知道为什么主要文档不如用户可能拥有(或可能没有)的配置文件详细?
Frank DENIS
13 年前
listen.backlog 的默认值并不完全是“无限的”。

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

检查 sysctl 值,例如 kern.somaxconn(OpenBSD)或 net.core.somaxconn(Linux)。

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

-Frank。
antonfedonyuk at gmail dot com
3 年前
注意:“access.format”包含“%o”会在 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 相同)
; 它必须与括号关联以指定 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
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