环境:macOS 10.14.6 PHP 8.0.20 (fpm-fcgi)
本文将按照配置文件顺序解释指令含义,包含了当前版本的全部指令,少量字段并没有搞懂,感觉不影响日常开发和维护,欢迎评论区补充
pid = /usr/local/var/run/php8.0-fpm.pid
#fpm 主进程 pid 存放位置,进程会根据设置自动生成文件
error_log = /usr/local/var/log/php8/php-fpm.log
#错误日志存放位置,设置成本地文件即可,进程会根据设置自动生成文件
#若设置成"syslog",日志将发送给 syslogd。(syslogd 不熟悉可以无视)
如果选择将日志记录到系统日志(error_log = syslog)以下设置有意义。
个人建议有明确需要再来关注这两个指令
;syslog.facility = daemon
#用于说明正在记录消息的程序是什么类型,
#syslogd 可以对不同类型的 facility(设备)信息采取不同的处理方式。
#当前环境默认:daemon(可能是因为我们通常是以守护进程的方式在运行 fpm)以下是可以被
#识别的值:
#kern 内核信息,首先通过 klogd 传递;
#user 用户进程;
#mail 邮件;
#daemon 后台进程;
#authpriv 授权信息;
#syslog 系统日志;
#lpr 打印信息;
#news 新闻组信息;
#uucp 由uucp生成的信息
#cron 计划和任务信息。
#mark syslog 内部功能用于生成时间戳
#local0----local7 与自定义程序使用,例如使用 local5 做为 ssh 功能
#扩展阅读:https://blog.csdn.net/zyy617532750/article/details/74942090
;syslog.ident = php-fpm
#当前进程所记录的系统日志的(唯一)标识,如果跑了多个fpm进程,需要用这个来区分是谁的。
#当前环境默认:php-fpm
;log_level = notice
#记录日志的级别:alert、error、warning、notice、debug。当前环境默认:notice
;log_limit = 1024
#单行字符数。如果该行超出限制,则换行。当前环境默认:1024。
;log_buffering = yes 重日志场景关注此项
#google 翻译:日志缓冲指定日志行是否被缓冲,这意味着该行是在单个写入操作中写入的。
#如果值为 false,则数据直接写入文件描述符。这是一个实验性的选项,可以在一些繁重的日志
#记录场景中潜在地提高日志记录性能和内存使用率。如果记录到 syslog,则忽略此选项,
#因为它必须始终被缓冲。
#当前环境默认:yes
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
#表示在 emergency_restart_interval 所设置的时间内(如设置:60s)出现SIGSEGV
#或者SIGBUS错误的 php-cgi 进程数如果超过了 emergency_restart_threshold 个,
#php-fpm 就会优雅重启。这对于解决加速器共享内存中的意外损坏非常有用。
#这两个选项一般保持默认值。0 表示 “关闭该功能”。 当前环境默认: 0 (关闭)。
;process_control_timeout = 0
#设置子进程等待主进程对信号做出反应的超时时间。
#默认单位:s(秒)。 默认值:0(不限制超时时间)。
; process.max = 0
#允许 FPM 可 fork 出的进程的最大数。当开启了多个进程池并在多个进程池中使用动态 PM(下面有讲)时,
#用来限制全局进程数。谨慎使用。默认:0,没有限制
; process.priority = -19
#设置子进程的优先级,在 master 进程以 root 用户启动时有效;如果没有设置,子进程会
#继承 master 进程的优先级,值范围-19(最高)到20(最低),默认不设置。
daemonize = yes
#设置 yes,FPM 将在后台运行;
#设置 no,FPM将在前台运行,此模式有助于调试时及时展示错误信息
当程序提示打开文件数量受到限制时,关注这两项。
在一些并发或多线程情况下,需要突破这个限制。
;rlimit_files = 1024
#设置 master 进程最多能打开的文件数。nginx.conf中也能看到相关指令。默认为系统的值。
;rlimit_core = 0
#设置 master 进程核心 rlimit 限制值;可选 unlimited 或 >=0 的整数,默认为系统的值。
#ulimit -n 和-u 可以查看 linux 的最大进程数和最大文件打开数。
;events.mechanism = epoll
#一直不知道干嘛的 默认自动检测
# Specify the event mechanism FPM will use. The following is available:
# - select (any POSIX os)
# - poll (any POSIX os)
# - epoll (linux >= 2.5.44)
# - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
# - /dev/poll (Solaris >= 7)
# - port (Solaris >= 10)
;systemd_interval = 10
#当 fpm 被设置为系统服务时,多久向服务器报告一次运行报告,单位有s、m、h。
#默认单位s,默认值10。(原来程序也要打卡上班的)默认即可,不用管他。
#在不同的监听端口和不同的管理选项下可以跑任意数量的池,并没有个数限制,看硬件和系统;
#进程池的名字用于 标记哪些属于本进程池进程的日志和统计数据。
#像 nginx 的虚拟主机一样,可以把不同的虚拟主机的配置写在自己的文件中,然后通过 include 引入
#引入文件时可以写相对路径,也可以写绝对路径
#默认只有 www.conf
include=/usr/local/etc/php/8.0/php-fpm.d/*.conf
当前环境下 include 引入的文件是 /usr/local/etc/php/8.0/php-fpm.d/www.conf 下文继续介绍 www.conf
[www]
#启动一个名为'www'的进程池,$pool变量可以在本文中任何指令中使用,需要使用进程池名称的地方,都可以直接使用它作为代替。
;prefix = /path/to/pools/$pool
#本配置文件中的相对路径前缀 prefix,默认不设置,将使用全局默认 prefix
#一般我喜欢设置完整路径
#只影响下面的指令(如果它们设置的是相对路径的话):
# - 'access.log'
# - 'slowlog'
# - 'listen' (unixsocket)
# - 'chroot'
# - 'chdir'
# - 'php_values'
# - 'php_admin_values'
user = nobody
group = nobody
#设置 worker 进程启动时的 user 和 group,必须要设置 user,而 group 在未设置的情
#况下,默认使用 user 所在的 group,默认都是 nobody,一般系统中也会存在这个用户和组
listen = 127.0.0.1:9999
#监听的 ip 和端口号。
#可以的格式如下:
# 'ip.add.re.ss:port' - 通过 a TCP socket 监听 IPv4:port
# '[ip:6:addr:ess]:port' - 通过 a TCP socket 监听 IPv6:port
# 'port' - 通过 a TCP socket 监听 以上所有地址类型
# '/path/to/unix/socket' - 通过 a unix socket 监听 性能会更好
;listen.backlog = 511 高并发时关注(注释是抄的,我没太理解)
#设置 listen(2) 函数的 backlog 参数值,默认: 511。
#未 accept 处理的 socket 队列大小,-1 on FreeBSD and OpenBSD,其他平台默认
#65535,高并发时重要,合理设置会及时处理排队的请求;太大会积压太多,处理完后
#nginx 在前面都等超时断开这个和 fpm 的 socket 连接了,就杯具了。
#不要用-1,建议1024以上,最好是2的幂值。
#一个池共用一个 backlog 队列,所有的池进程都去这个队列里 accept 连接。
#最大数量受限于系统配置 cat /proc/sys/net/core/somaxconn,系统配置修改:
#vim /etc/sysctl.conf,增加 net.core.somaxconn = 2000 则最大为2000,
#然后 php 最大的 backlog 可以到2000。
#http://blog.chinaunix.net/uid-28541347-id-5748886.html
针对 unix socket 连接方式的设置
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
#用 unix socket 连接方式时,指定拥有 unix socket 权限的用户,
#默认和运行的用户一样;用 tcp 连接可以注释掉
;listen.acl_users =
;listen.acl_groups =
#当支持 POSIX 访问控制列表时,您可以使用这些选项设置它们,值是用逗号分隔的用户/组
#名称的列表。 设置后,listen.owner 和 listen.group 将被忽略
;listen.allowed_clients = 127.0.0.1
#设置允许连接 fpm 的地址,多个地址用逗号隔开,如果不配置,则默认任意地址都能来连。
默认:any,任何主机都可以连接。仅对 tcp socket 有意义。
# Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable
# in the original PHP FCGI (5.2.2+).
; process.priority = -19 不理解优先级的用途
#set nice(2) priority 参数。
#池进程的权限,同样要 master 进程是 root 用户才有效,和全局那个一样,不设置的话会继承 master 进程的优先级。默认不设置。
; process.dumpable = no 不知道实际用途
#即使进程用户或组不同于主进程用户,也要设置进程可转储标志 (PR_SET_DUMPABLE prctl)。 它允许为池用户创建进程核心转储和 ptrace 进程。默认值:no
pm = dynamic 强制设置的指令,三种算法必须要选一个
#决定进程管理器以哪种算法来控制进程数量 默认dynamic 小内存建议dynamic 8G以上建议static 因为创建和回收进程也是有开销的。可选值:
# static - 固定数量,数值由 pm.max_children 确定;
# dynamic - 子进程的数量是根据以下指令动态设置的。 有了这个流程管理,总会有至少1个子进程:
# pm.max_children - 可以同时活跃的最大子进程数。
# pm.start_servers - fpm 启动时创建的子进程数量(就是初始值)
# pm.min_spare_servers - 空闲子进程的最小值,低于这个值就会创建新的子进程
# pm.max_spare_servers - 空闲子进程的最大值,高于这个值就会kill部分子进程
# ondemand - fpm 启动时不创建子进程. 有连接请求时才会创建子进程,涉及指令:
# pm.max_children - 可以同时活跃的最大子进程数。
# pm.process_idle_timeout - 指定空闲进程空闲多久后被killed
#pm.max_children 等效于带有 mpm_prefork 的 ApacheMaxClients 指令。 等效于原始 PHP CGI 中的 PHP_FCGI_CHILDREN 环境变量。以下默认值基于没有太多资源的服务器。
pm.max_children = 5 #dynamic static ondemand
pm.start_servers = 2 #dynamic 计算公式:(min_spare_servers + max_spare_servers) / 2
pm.min_spare_servers = 1 #dynamic
pm.max_spare_servers = 3 #dynamic
;pm.process_idle_timeout = 10s; #ondemand 默认值10s
;pm.max_requests = 500
#每个子进程最大处理500请求就被回收,可防止内存泄露。默认没有开启,进程永远不重启。等效于 PHP_FCGI_MAX_REQUESTS
非常有意思的功能(默认关闭状态),fpm 提供了获取进程运行状态的入口,并提供了一个静态页面来展示这些数据。相关配置参考此处
注意:使用file://协议访问 status.html 时,要解决跨域问题
;pm.status_path = /status #负责开启或关闭 FPM status page
;pm.status_listen = 127.0.0.1:9001 #这是干嘛的 反正默认就好了
;ping.path = /ping
#FPM 监控页面的 ping 网址。 如果没有设置,则无法访问 ping 页面。该页面用于外部检测 FPM 是否存活并且可以响应请求。请注意必须以斜线开头 (/)。默认没有设置
;ping.response = pong
#用于定义 ping 请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本。默认值:pong。
;access.log = log/$pool.access.log
#类似于 nginx 的访问日志,fpm 也有访问日志,每次有请求过来都可以记录日志,默认关闭
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
#此处定义访问日志的格式,具体格式参见原文
;slowlog = log/$pool.log.slow #php慢日志 默认关闭
;request_slowlog_timeout = 0 #超过指定时间的请求将被写进慢日志 默认0
;request_slowlog_trace_depth = 20 #慢日志堆栈信息深度 默认20
;request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。默认为0
;request_terminate_timeout_track_finished = no
# 在应用程序调用 'fastcgi_finish_request' 或应用程序完成并调用关闭函数(通过 register_shutdown_function 注册)后,不使用 'request_terminate_timeout' ini 选项设置的超时。 即使在这种情况下,此选项也将启用无条件应用超时限制。 默认no关闭
#和上面含义一样 默认系统默认值
;rlimit_files = 1024
;rlimit_core = 0
;chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.默认没有设置
;chdir = /var/www
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
;catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: no.
;decorate_workers_output = yes
#使用前缀和后缀装饰工作输出,其中包含有关写入日志的子节点的信息,以及是否使用了 stdout 或 stderr 以及日志级别和时间。 仅当 catch_workers_output 为 yes 时才使用此选项。 设置为“no”将输出写入 stdout 或 stderr 的数据。
;clear_env = no #清理环境 默认yes 默认即可
;security.limit_extensions = .php .php3 .php4 .php5 .php7 #设置fpm执行解析的扩展名 默认 .php
#传递环境变量,如 LD_LIBRARY_PATH。 所有 $VARIABLEs 都取自当前环境。
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
#php.ini的附加设置,值应用于这个进程池。 这些设置会覆盖之前在 php.ini 中定义的值。具体语法看原文
;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