参考链接

[global]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
; PID 文件的位置。默认为空
;pid = run/php-fpm.pid

; 错误日志的位置。
; 默认:#INSTALL_PREFIX#/log/php-fpm.log
;error_log = log/php-fpm.log

; 设置何种程序记录消息,默认值:daemon
;syslog.facility = daemon

; 为每条信息添加前缀。 如果在同一台服务器上运行了多个 FPM 实例,可以修改此默认值来满足需求。默认值:php-fpm
;syslog.ident = php-fpm

; 错误级别
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; 如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。0 表示“关闭该功能”。默认值:0(关闭)
;emergency_restart_threshold = 0

; emergency_restart_interval 用于设定平滑重启的间隔时间。这么做有助于解决加速器中共享内存的使用问题。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。
;emergency_restart_interval = 0

; 设置子进程接受主进程复用信号的超时时间。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)
;process_control_timeout = 0

; Fork 的最大 FPM 进程数。使用动态管理进程数时,此设计可以控制在一个进程池内的全局进程数量。 使用需谨慎。默认值:0
; process.max = 128

; 设置 master 进程的 nice(2) 优先级(如果设置了此值)。 可以是 -19(最高优先级)到 20 (更低优先级)。 默认值:不设置
; process.priority = -19

; 设置 FPM 在后台运行。设置“no”将 FPM 保持在前台运行用于调试。默认值:yes
daemonize = no

; 设置 master 进程的打开文件描述符 rlimit 数
;rlimit_files = 1024

; 设置 master 进程最大 core 的 rlimit 尺寸。 默认值:0
;rlimit_core = 0

; 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)
; Default Value: not set (auto detection)
;events.mechanism = epoll

; 使用 systemd 集成的 FPM 时,设置间歇秒数,报告健在通知给 systemd。 设置为 0 表示禁用。默认值:10
;systemd_interval = 10

[some_pool]

在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
; FPM 进程运行的Unix用户。必须设置
user = _www

; FPM 进程运行的 Unix 用户组。如果不设置,就使用默认用户的用户组
group = _www

; 设置接受 FastCGI 请求的地址
listen = 127.0.0.1:9001

; 设置 listen(2) 的 backlog 最大值。“-1”表示无限制。默认值:-1
;listen.backlog = 511

; 设置允许连接到 FastCGI 的服务器 IPV4 地址。等同于 PHP FastCGI (5.2.2+) 中的 FCGI_WEB_SERVER_ADDRS 环境变量。仅对 TCP 监听起作用。每个地址是用逗号分隔,如果没有设置或者为空,则允许任何服务器请求连接。默认值:any。 PHP 5.5.20 和 5.6.4起,开始支持 IPv6 地址
;listen.allowed_clients = 127.0.0.1

; 设置 worker 的 nice(2)优先级(如果设置了的话)。 该值从 -19(最高优先级) 到 20(更低优先级)。 默认值:不设置
; process.priority = -19

; 设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic
pm = dynamic

; pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置
pm.max_children = 5

; 设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 2

; 设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置
pm.min_spare_servers = 1

; 设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置
pm.max_spare_servers = 3

; 秒数,多久之后结束空闲进程。 仅当设置 pm 为 ondemand
;pm.process_idle_timeout = 10s;

; 设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0
;pm.max_requests = 500

; FPM 状态页面的网址。如果没有设置,则无法访问状态页面,默认值:无
;pm.status_path = /status

; FPM 监控页面的 ping 网址。如果没有设置,则无法访问 ping 页面。该页面用于外部检测 FPM 是否存活并且可以响应请求。请注意必须以斜线开头(/)
;ping.path = /ping

; 用于定义 ping 请求的返回响应。返回为 HTTP 200 的 text/plain 格式文本。默认值:pong
;ping.response = pong

; Access log 文件。 默认值:不设置
;access.log = log/$pool.access.log

; access log 的格式。 默认值: "%R - %u %t \"%m %r\" %s"
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

; 慢请求的记录日志。默认值:#INSTALL_PREFIX#/log/php-fpm.log.slow
;slowlog = log/$pool.log.slow

; 当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中。设置为 '0' 表示 'Off'。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)
;request_slowlog_timeout = 0

; Depth of slow log stack trace.
; Default Value: 20
;request_slowlog_trace_depth = 20

; 设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 'max_execution_time' 因为某些特殊原因没有中止运行的脚本有用。设置为 '0' 表示 'Off'。可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)
;request_terminate_timeout = 0

; 设置文件打开描述符的 rlimit 限制。默认值:系统定义值
;rlimit_files = 1024

; 设置核心 rlimit 最大限制值。可用值:'unlimited',0 或者正整数。默认值:系统定义值
;rlimit_core = 0

; 启动时的 Chroot 目录。所定义的目录需要是绝对路径。如果没有设置,则 chroot 不被使用
;chroot =

; 设置启动目录,启动时会自动 Chdir 到该目录。所定义的目录需要是绝对路径。默认值:当前目录,或者根目录(chroot时)
;chdir = /var/www

; 重定向运行过程中的 stdout 和 stderr 到主要的错误日志文件中。如果没有设置,stdout 和 stderr 将会根据 FastCGI 的规则被重定向到 /dev/null。默认值:无
;catch_workers_output = yes

; Decorate worker output with prefix and suffix containing information about
; the child that writes to the log and if stdout or stderr is used as well as
; log level and time. This options is used only if catch_workers_output is yes.
; Settings to "no" will output data as written to the stdout or stderr.
; Default value: yes
;decorate_workers_output = no

; 为 FPM worker 进程清除环境变量。 在进程池配置文件里设置环境变量前,阻止任意系统的环境变量进入 FPM worker 进程。 自 PHP 5.4.27、 5.5.11 和 5.6.0 起。 默认值: Yes
;clear_env = no

小结

进程池

php-fpm 的主进程可以管理多个进程池,每个进程池相互独立。

进程池与 Nginx 可通过 TCP 或 Unix Socket 通信;Nginx 与 php 运行在不同机器时采用 TCP 通信的方式。

max_requests 相关

为了验证 max_requests 的作用,作如下设置

1
2
3
pm = static
pm.max_children = 1
pm.max_requests = 2

重启 php-fpm,主进程[76227] 创建了子进程[76228];处理第二次请求后,子进程[76228] 退出,新的子进程[76237] 启动。

max_requests 是设置为 0 时,子进程将一直接受请求。