2022年9月27日15:45:04
FastCGI(Fast Common Gateway Interface)快速通用网关接口,是 CGI 的增强版本,为了提升 CGI 的性能而生。
PHP-FPM(FastCGI Process Manager for PHP)PHP 的 FastCGI 进程管理器。FastCGI 只是一个协议规范,需要某个程序去具体实现,而 PHP-FPM 就是这个具体实现。
- ps -ef|grep php
-
- root 2178 1 0 13:28 ? 00:00:00 php-fpm: master process (/usr/local/php80/etc/php-fpm.conf)
- www 2179 2178 0 13:28 ? 00:00:00 php-fpm: pool www
- www 2180 2178 0 13:28 ? 00:00:00 php-fpm: pool www
- root 2248 1 0 13:29 ? 00:00:00 php-fpm: master process (/usr/local/php74/etc/php-fpm.conf)
- www 2250 2248 0 13:29 ? 00:00:00 php-fpm: pool www
- www 2251 2248 0 13:29 ? 00:00:00 php-fpm: pool www
这里可以看到fpm是一个常驻内存的master -> worker的多进程工作模式
fpm是一个php的工作方式,请注意!
PHP的SAPI模块 方式目前有以下几种:
强调一下,工作模式和php语言本身实现任何功能基本毫无影响,以上都是通过通信协议互相通信而已
PHP: php_sapi_name - Manual
返回接口类型的小写字符串, 或者在失败时返回 false。
对应的fpm代码的如下:
- D:\SRC_CODE\20220824\PHP-SRC_1\SAPI
- ├─apache2handler
- ├─cgi
- │ └─tests
- ├─cli
- │ └─tests
- ├─embed
- ├─fpm
- │ ├─fpm
- │ │ └─events
- │ └─tests
- ├─fuzzer
- │ ├─corpus
- │ │ ├─exif
- │ │ ├─json
- │ │ └─unserialize
- │ └─dict
- ├─litespeed
- └─phpdbg
- └─tests
- └─bug73615
fpm自身是什么呢?
- PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events> ls
- 目录: D:\src_code\20220824\php-src_1\sapi\fpm\fpm\events
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- -a---- 2022/9/28 14:04 5872 devpoll.c
- -a---- 2022/9/28 14:04 1228 devpoll.h
- -a---- 2022/9/28 14:04 5192 epoll.c
- -a---- 2022/9/28 14:04 1220 epoll.h
- -a---- 2022/9/28 14:04 4876 kqueue.c
- -a---- 2022/9/28 14:04 1224 kqueue.h
- -a---- 2022/9/28 14:04 6465 poll.c
- -a---- 2022/9/28 14:04 1216 poll.h
- -a---- 2022/9/28 14:04 4931 port.c
- -a---- 2022/9/28 14:04 1216 port.h
- -a---- 2022/9/28 14:04 4187 select.c
- -a---- 2022/9/28 14:04 1224 select.h
-
- PS D:\src_code\20220824\php-src_1\sapi\fpm\fpm> ls
- 目录: D:\src_code\20220824\php-src_1\sapi\fpm\fpm
-
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 2022/9/28 14:04 events
- -a---- 2022/9/28 14:04 2966 fpm.c
- -a---- 2022/9/28 14:04 1160 fpm.h
- -a---- 2022/9/28 14:04 1951 fpm_arrays.h
- -a---- 2022/9/28 14:04 4127 fpm_atomic.h
- -a---- 2022/9/28 14:04 12090 fpm_children.c
- -a---- 2022/9/28 14:04 901 fpm_children.h
- ........省略
fpm是c实现了epoll kqueue poll select的event,的master worker的进程管理器,照理来说不会慢,才对
为什么大多数会认为fpm会慢,吃内存呢?
参考:性能-webman手册
其实主要是因为composer的出现,导致框架的vendor越来越庞大,一个简单laravel web项目vendor
- [root@ vendor]# ls -lR| grep "^-" | wc -l
- 7066
- [root@ vendor]# du -sh
- 57M
每次启动就需要加载57M大小的7K+的文件,消耗很多磁盘IO和创建框架实例,消耗巨大
就导致laravel这么“重”的框架,访问速度就很慢
有什么解决办法呢?
开启opcache
ops性能提升至少5-10倍左右,可以看下你的php.ini是否开启(api请求,混编的页面性能提升更小)
php -m
是否包含Zend OPcache
设置pm.max_requests=0,就是不归还给系统,你可以把这个设置成pm.max_requests=50,就请求了50个之后,就释放内存给系统
如果max_requests太小,就会不停的请求内存,释放内存性能有影响
设置成0,就会不释放内存,造成系统工作内存资源太小,导致系统越来越卡
如何设置合理的配置呢?
1,pm = dynamic,这样由fpm自己调整
2,需要更高性能的ops,根据自己大小简单计算一下,比如4核8G内存,8G至少留1g给系统,php单个变量大小是128M,以此为最大基准,(7*1024)/128 = 56,这里是纯fpm的机器,不包含nginx redis等服务,如果在同一个服务器就扣除其他运行内存
- pm = static
- pm.max_children = 56
- pm.start_servers = 20
- pm.max_requests = 200
这里全部是理论数值
- cat /proc/1197/status
- cat /proc/$(pid)/status
查看
- VmPeak: 247844 kB
- VmSize: 234784 kB ——进程占用的虚拟内存大小
- VmLck: 0 kB
- VmPin: 0 kB
- VmHWM: 34296 kB
- VmRSS: 21660 kB ——占用的物理内存 约21M
通常一个fpm的工作内存是几十M,上诉的设置是很宽松的,但是设置过多的children数量会受cpu的影响,频繁切换cpu上下文的去执行会造成一些性能影响,可以通过观察服务器的访问量,服务器内存和cpu的使用量去了解最适合你业务系统的配置,需要一个过程。
比如你的业务系统查询多,或者计算多,或者业务系统不同会对fpm设置都会需要微调
那么避免上述的所有的问题,开发一个常驻内存,不需要频繁加载文件,一个master worker的和其他组件通信可以是常驻内存连接
的框架,那么php的性能是不是可以有非常大的提升,答案是:完全可以
一个完全由php开发的常驻内存的mvc框架 基于workerman的webman就是一个很大的php高性能框架,完美的避开了fpm的缺点
FastCGI的通信协议:
nginx和fpm通信协议是FastCGI,fpm有两种对接模式,端口和sock
- location ~ \.php(.*)$ {
- fastcgi_pass unix:/usr/local/php80/php-fpm.sock;
- #fastcgi_pass 127.0.0.1:9001;
- fastcgi_index index.php;
- fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- fastcgi_param PATH_INFO $fastcgi_path_info;
- fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
- include fastcgi_params;
- }
如果可以使用sock性能当然是更好的,但是nginx和fpm是分离的监听端口模式会更好一点,因为安全也是一个很大的因素
workerman也实现了FastCGI协议
php实现fastcgiGitHub - lisachenko/protocol-fcgi: FastCGI (FCGI) Protocol implementation for PHP
nginx对接fastcgiPHP FastCGI Example | NGINX
FastCGI协议标准FastCGI协议规范中文版_文化 & 方法_比克_InfoQ精选文章
FastCGI Specificationhttps://www.myway5.com/index.php/2018/07/19/fastcgi-规范中文翻译/【PHP源码分析】FastCGI协议浅析_慕课手记
源码php-src/fastcgi.c at master · php/php-src · GitHub
如果你想对fastcgi有更多的了解Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写 | 离别歌
你就会发现,nginx想的配置文件 fastcgi.conf fastcgi_params里面参数的意思
- fastcgi_param QUERY_STRING $query_string;
- fastcgi_param REQUEST_METHOD $request_method;
- fastcgi_param CONTENT_TYPE $content_type;
- fastcgi_param CONTENT_LENGTH $content_length;
-
- fastcgi_param SCRIPT_NAME $fastcgi_script_name;
- fastcgi_param REQUEST_URI $request_uri;
- fastcgi_param DOCUMENT_URI $document_uri;
- fastcgi_param DOCUMENT_ROOT $document_root;
- fastcgi_param SERVER_PROTOCOL $server_protocol;
- fastcgi_param REQUEST_SCHEME $scheme;
- fastcgi_param HTTPS $https if_not_empty;
-
- fastcgi_param GATEWAY_INTERFACE CGI/1.1;
- fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
-
- fastcgi_param REMOTE_ADDR $remote_addr;
- fastcgi_param REMOTE_PORT $remote_port;
- fastcgi_param SERVER_ADDR $server_addr;
- fastcgi_param SERVER_PORT $server_port;
- fastcgi_param SERVER_NAME $server_name;
-
- # PHP only, required if PHP was built with --enable-force-cgi-redirect
- fastcgi_param REDIRECT_STATUS 200;
剩下就是最重要的配置文件,下面是基于php8.0的中文翻译版
php-fpm.conf
- ;;;;;;;;;;;;;;;;;;;;;
- ; FPM 配置 ;
- ;;;;;;;;;;;;;;;;;;;;;
-
- ; 此配置文件中的所有相对路径都是相对于 PHP 的安装
- ; 前缀 (/usr/local/php80)。 这个前缀可以通过使用
- ; 命令行中的“-p”参数。
-
- ;;;;;;;;;;;;;;;;;;
- ; 全局 选项 ;
- ;;;;;;;;;;;;;;;;;;
-
- [global]
- ; pid文件
- ; 注意:默认前缀是 /usr/local/php80/var
- ; 默认值:无
- ;pid = 运行/php-fpm.pid
-
- pid = /usr/local/php80/php-fpm.pid
-
- ; 错误日志文件
- ; 如果它设置为“syslog”,日志将被发送到 syslogd 而不是被写入
- ; 到本地文件中。
- ; 注意:默认前缀是 /usr/local/php80/var
- ; 默认值:log/php-fpm.log
- ;error_log = log/php-fpm.log
-
- error_log = /data/log/php80/php-fpm.log
-
- ; syslog_facility 用于指定什么类型的程序正在记录
- ; 信息。 这让 syslogd 指定来自不同设施的消息
- ; 会以不同方式处理。
- ; 请参阅 syslog(3) 以获取可能的值(例如 daemon equiv LOG_DAEMON)
- ; 默认值:daemon
- ;syslog.facility = daemon
-
- ; syslog_ident 附加在每条消息之前。 如果您有多个 FPM
- ; 在同一台服务器上运行的实例,您可以更改默认值
- ; 这必须满足共同的需求。
- ; 默认值:php-fpm
- ;syslog.ident = php-fpm
-
- ; 日志级别
- ; 可能的值:alert, error, warning, notice, debug
- ; 默认值: notice
- ;log_level = notice
-
- ; 单行中字符数的日志限制(日志条目)。 如果
- ; 行超过限制,它被包裹在多行上。 限制是为了
- ; 所有记录的字符,包括消息前缀和后缀(如果存在)。 然而
- ; 换行符不计入其中,因为它仅在
- ; 记录到文件描述符。 这意味着新行字符不存在
- ; 登录到系统日志时。
- ; 默认值: 1024
- ;log_limit = 4096
-
- ; 日志缓冲指定日志行是否被缓冲,这意味着
- ; 行在单个写入操作中写入。 如果该值为 false,则
- ; 数据直接写入文件描述符。 这是一个实验
- ; 可以潜在地提高日志记录性能和内存使用的选项
- ; 对于一些繁重的日志记录场景。 如果记录到 syslog,则忽略此选项
- ; 因为它必须始终被缓冲。
- ; 默认值: yes
- ;log_buffering = no
-
- ; 如果此数量的子进程在此时间内以 SIGSEGV 或 SIGBUS 退出
- ; 由 Emergency_restart_interval 设置的时间间隔,然后 FPM 将重新启动。 一个值
- ; “0”表示“关闭”。
- ; 默认值: 0
- ;emergency_restart_threshold = 0
-
- ; Emergency_restart_interval 使用的时间间隔来确定何时
- ; 将启动正常重启。 这对于解决问题很有用
- ; 加速器共享内存中的意外损坏。
- ; 可用单位:s(秒)、m(整数)、h(我们的)或 d(ays)
- ; 默认单位:秒
- ; 默认值: 0
- ;emergency_restart_interval = 0
-
- ; 子进程等待主进程对信号做出反应的时间限制。
- ; 可用单位:s(秒)、m(整数)、h(我们的)或 d(ays)
- ; 默认单位:秒
- ; 默认值:0
- ;process_control_timeout = 0
-
- ; FPM 将分叉的最大进程数。 这是为了控制
- ; 在许多池中使用动态 PM 时的全局进程数。
- ; 谨慎使用。
- ; 注意:值为 0 表示没有限制
- ; 默认值:0
- ; process.max = 128
-
- ; 指定 nice(2) 优先级以应用于主进程(仅当设置时)
- ; 该值可以从 -19(最高优先级)到 20(最低优先级)变化
- ; 注意: - 仅当 FPM 主进程以 root 身份启动时才有效
- ; - 池进程将继承主进程优先级
- ; 除非另有说明
- ; 默认值: no set
- ; process.priority = -19
-
- ; 将 FPM 发送到后台。 设置为“否”以将 FPM 保持在前台进行调试。
- ; 默认值: yes
- ;daemonize = yes
-
- ; 为主进程设置打开文件描述符 rlimit。
- ; 默认值: system defined value
- ;rlimit_files = 1024
-
- ; 为主进程设置最大核心大小 rlimit。
- ; 可能的值:“无限”或大于或等于 0 的整数
- ; 默认值: system defined value
- ;rlimit_core = 0
-
- ; 指定 FPM 将使用的事件机制。 以下是可用的:
- ; - 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
-
- ; 当 FPM 使用 systemd 集成构建时,指定间隔,
- ; 在几秒钟内,在向 systemd 的健康报告通知之间。
- ; 设置为 0 以禁用。
- ; 可用单位:s(秒)、m(整数)、h(我们的)
- ; 默认单位:秒
- ; 默认值: 10
- ;systemd_interval = 10
-
- ;;;;;;;;;;;;;;;;;;;;
- ; 线程池定义 ;
- ;;;;;;;;;;;;;;;;;;;;
-
- ; 可以使用不同的侦听方式启动多个子进程池
- ; 端口和不同的管理选项。 池的名称将是
- ; 用于日志和统计信息。 池的数量没有限制
- ; FPM可以处理。 无论如何,您的系统会告诉您:)
-
- ; 包括一个或多个文件。 如果 glob(3) 存在,它用于包含一堆
- ; 来自 glob(3) 模式的文件。 该指令可以在任何地方使用
- ; 文件。
- ; 也可以使用相对路径。 它们的前缀为:
- ; - 全局前缀(如果已设置)(-p 参数)
- ; - /usr/local/php80 otherwise
- include=/usr/local/php80/etc/php-fpm.d/*.conf
www.conf
- ; 启动一个名为“www”的新池。
- ; 变量 $pool 可以在任何指令中使用,并将被替换为
- ; 池名称(此处为“www”)
- [www]
-
- ; 每个池前缀
- ; 它仅适用于以下指令:
- ; - 'access.log'
- ; - 'slowlog'
- ; - 'listen' (unixsocket)
- ; - 'chroot'
- ; - 'chdir'
- ; - 'php_values'
- ; - 'php_admin_values'
- ; 如果未设置,则应用全局前缀(或 /usr/local/php80)。
- ; 注意:该指令也可以相对于全局前缀。
- ; 默认值: none
- ;prefix = /path/to/pools/$pool
-
- ; Unix 用户/进程组
- ; 注意:用户是强制性的。 如果未设置组,则默认用户的组
- ; 将会被使用。
- user = www
- group = www
-
- ; 接受 FastCGI 请求的地址。
- ; 有效的语法是:
- ; 'ip.add.re.ss:port' - 在 TCP 套接字上侦听特定 IPv4 地址
- ; 特定端口;
- ; '[ip:6:addr:ess]:port' - 在 TCP 套接字上监听特定 IPv6 地址
- ; 特定端口;
- ; 'port' - 在 TCP 套接字上侦听所有地址
- ; (IPv6 和 IPv4 映射)在特定端口上;
- ; '/path/to/unix/socket' - 监听 unix 套接字。
- ; 注意:此值是强制性的。
- ;listen = 127.0.0.1:9000
-
- listen = /usr/local/php80/php-fpm.sock
-
- ; 设置listen(2) 积压的任务。
- ; 默认值:511(FreeBSD 和 OpenBSD 上为 -1)
- ;listen.backlog = 511
-
- ; 设置 unix 套接字的权限,如果使用的话。 在 Linux 中,读/写
- ; 必须设置权限才能允许来自 Web 服务器的连接。 许多
- ; BSD 派生系统允许连接而不管权限。 主人
- ; 和组可以通过名称或它们的数字 ID 来指定。
- ; 默认值:用户和组设置为运行用户
- ; 模式设置为 0660
-
- listen.owner = www
- listen.group = www
- listen.mode = 0660
-
- ; 当支持 POSIX 访问控制列表时,您可以使用
- ; 在这些选项中,value 是用户/组名称的逗号分隔列表。
- ; 设置后,listen.owner 和 listen.group 将被忽略
- ;listen.acl_users =
- ;listen.acl_groups =
-
- ; 允许连接的 FastCGI 客户端的地址列表(IPv4/IPv6)。
- ; 相当于原来的FCGI_WEB_SERVER_ADDRS环境变量
- ; PHP FCGI (5.2.2+)。 仅对 tcp 侦听套接字才有意义。 每个地址
- ; 必须用逗号分隔。 如果此值留空,则连接将是
- ; 从任何 IP 地址接受。
- ; 默认值: any
- ;listen.allowed_clients = 127.0.0.1
-
- ; 指定 nice(2) 优先级以应用于池进程(仅当设置时)
- ; 该值可以从 -19(最高优先级)到 20(较低优先级)变化
- ; 注意: - 仅当 FPM 主进程以 root 身份启动时才有效
- ; - 池进程将继承主进程优先级
- ; 除非另有说明
- ; 默认值: no set
- ; process.priority = -19
-
- ; 设置进程可转储标志 (PR_SET_DUMPABLE prctl) 即使进程用户
- ; 或组不同于主进程用户。 它允许创建进程
- ; 池用户的核心转储和 ptrace 进程。
- ; 默认值: no
- ; process.dumpable = yes
-
- ;选择进程管理器将如何控制子进程的数量。
- ;可能的值:
- ; static - 固定数量(pm.max_children)的子进程;
- ; dynamic - 子进程的数量是根据以下指令动态设置的。 使用此流程管理,将始终至少有
- ; 1 个子进程。
- ; pm.max_children - 可以同时存活的子进程的最大数量
- ; pm.start_servers - 启动子进程的数量.
- ; pm.min_spare_servers - 处于“空闲”状态(等待处理)的最小孩子数。 ;
- ; 如果 “空闲”进程的数量少于此数量,则将创建一些子进程。
- ; pm.max_spare_servers - 处于“空闲”状态的最大子节点数(等待处理)。
- ; 如果“空闲”进程的数量大于这个数量,那么一些子进程将被杀死。
- ; ondemand - 启动时不创建子级。当新请求连接时,子进程才会被forked创建.使用以下参数:
- ; pm.max_children - 可以同时活着的子进程的最大数量。
- ; pm.process_idle_timeout - 空闲进程将被终止的秒数。
- ;注意:此值是强制性的。
- pm = dynamic
-
- ; 当 pm 设置为 'static' 和
- ; pm 设置为“动态”或“按需”时的最大子进程数。
- ; 此值设置将同时请求的数量限制
- ; 服务。 等效于带有 mpm_prefork 的 ApacheMaxClients 指令。
- ; 等效于原始 PHP 中的 PHP_FCGI_CHILDREN 环境变量
- ; 电脑动画。 以下默认值基于没有太多资源的服务器。 别
- ; 忘记调整 pm.* 以满足您的需求。
- ; 注意:当 pm 设置为“静态”、“动态”或“按需”时使用
- ; 注意:此值是强制性的。
- pm.max_children = 20
-
- ; 启动时创建的子进程数。
- ; 注意:仅在 pm 设置为“动态”时使用
- ; 默认值:(min_spare_servers + max_spare_servers) / 2
- pm.start_servers = 2
-
- ; 所需的最小空闲服务器进程数。
- ; 注意:仅在 pm 设置为“动态”时使用
- ; 注意:当 pm 设置为“动态”时为必填项
- pm.min_spare_servers = 1
-
- ; 所需的最大空闲服务器进程数。
- ; 注意:仅在 pm 设置为“动态”时使用
- ; 注意:当 pm 设置为“动态”时为必填项
- pm.max_spare_servers = 3
-
- ; 空闲进程将被杀死的秒数。
- ; 注意:仅在 pm 设置为 'ondemand' 时使用
- ; 默认值: 10s
- ;pm.process_idle_timeout = 10s;
-
- ; 每个子进程在重生之前应执行的请求数。
- ; 这对于解决 3rd 方库中的内存泄漏问题很有用。 为了
- ; 无休止的请求处理指定“0”。 等效于 PHP_FCGI_MAX_REQUESTS。
- ; 默认值: 0
- pm.max_requests = 200
-
- ; 查看 FPM 状态页面的 URI。 如果未设置此值,则不会有 URI
- ; 识别为状态页面。 它显示以下信息:
- ; pool - 池的名称
- ; process manager - static, dynamic or ondemand;
- ; start time - FPM 开始的日期和时间;
- ; start since - 自 FPM 开始以来的秒数;
- ; accepted conn - 池接受的请求数;
- ; listen queue - 待处理队列中的请求数 连接(参见listen(2)中的积压任务);
- ; max listen queue - 自 FPM 启动以来,待处理连接队列中的最大请求数
- ; listen queue len - 挂起连接的套接字队列的大小;
- ; idle processes - 空闲进程的数量;
- ; active processes - 活动进程的数量;
- ; total processes - 空闲+活动进程的数量;
- ; max active processes - 自 FPM 启动以来的最大活动进程数;
- ; max children reached - 当 pm 尝试启动更多子进程时,已达到进程限制的次数(仅适用于
- ; pm 'dynamic' 和 'ondemand');
- ; 值实时更新。
- ; Example output:
- ; pool: www
- ; process manager: static
- ; start time: 01/Jul/2011:17:53:49 +0200
- ; start since: 62636
- ; accepted conn: 190460
- ; listen queue: 0
- ; max listen queue: 1
- ; listen queue len: 42
- ; idle processes: 4
- ; active processes: 11
- ; total processes: 15
- ; max active processes: 12
- ; max children reached: 0
- ;
- ; 默认情况下,状态页面输出格式为 text/plain。 通过任一
- ; 查询字符串中的'html'、'xml'或'json'会返回对应的
- ; output syntax. Example:
- ; http://www.foo.bar/status
- ; http://www.foo.bar/status?json
- ; http://www.foo.bar/status?html
- ; http://www.foo.bar/status?xml
- ;
- ; 默认情况下,状态页面只输出简短的状态。 传递“完整”
- ; 查询字符串还将返回每个池进程的状态。
- ; Example:
- ; http://www.foo.bar/status?full
- ; http://www.foo.bar/status?json&full
- ; http://www.foo.bar/status?html&full
- ; http://www.foo.bar/status?xml&full
- ; 每个进程的完整状态返回:
- ; pid - 进程的PID;
- ; state - 进程的状态(空闲,运行,...);
- ; start time - 流程开始的日期和时间;
- ; start since - 自进程开始以来的秒数;
- ; requests - 进程已处理的请求数;
- ; request duration - 请求的持续时间(以 µs 为单位);
- ; request method - 请求方法(GET,POST,...);
- ; request URI - 带有查询字符串的请求 URI;
- ; content length - 请求的内容长度(仅限 POST)
- ; user - 用户(PHP_AUTH_USER)(如果未设置,则为“-”);
- ; script - 调用的主脚本(如果未设置,则为“-”);
- ; last request cpu - 如果进程未处于空闲状态,则最后一个请求消耗的 %cpu 始终为 0,
- ; 因为 CPU 计算是在请求处理终止时完成的;
- ; last request memory - 最后一个请求消耗的最大内存量,如果进程不处于空闲状态,
- ; 则它始终为 0,因为在请求处理终止时完成了内存计算;
- ; 如果进程处于空闲状态,则信息与
- ; 进程服务的最后一个请求。 否则信息与
- ; 当前正在处理的请求。
- ; Example output:
- ; ************************
- ; pid: 31330
- ; state: Running
- ; start time: 01/Jul/2011:17:53:49 +0200
- ; start since: 63087
- ; requests: 12808
- ; request duration: 1250261
- ; request method: GET
- ; request URI: /test_mem.php?N=10000
- ; content length: 0
- ; user: -
- ; script: /home/fat/web/docs/php/test_mem.php
- ; last request cpu: 0.00
- ; last request memory: 0
- ;
- ; 注意:有一个实时 FPM 状态监控示例网页可用
- ; 它位于:/usr/local/php80/share/php/fpm/status.html
- ;
- ; 注意:该值必须以斜杠 (/) 开头。 该值可以是
- ; 任何东西,但使用 .php 扩展名或它可能不是一个好主意
- ; 可能与真实的 PHP 文件冲突。
- ; 默认值: not set
- ;pm.status_path = /status
-
- ; 接受 FastCGI 状态请求的地址。 这创造了一个新的
- ; 可以独立处理请求的隐形池。 这很有用
- ; 如果主池忙于长时间运行的请求,因为它仍然可能
- ; 在完成长时间运行的请求之前获取状态。
- ;
- ; 有效的语法是:
- ; 'ip.add.re.ss:port' - 在 TCP 套接字上侦听特定端口上的特定 IPv4 地址;
- ; '[ip:6:addr:ess]:port' - 在 TCP 套接字上侦听特定端口上的特定 IPv6 地址;
- ; 'port' - 在 TCP 套接字上侦听特定端口上的所有地址(IPv6和IPv4 映射);
- ; '/path/to/unix/socket' - 在 Unix 套接字上监听。
- ; 默认值: value of the listen option
- ;pm.status_listen = 127.0.0.1:9001
-
- ; 调用FPM监控页面的ping URI。 如果未设置此值,则否
- ; URI 将被识别为 ping 页面。 这可以用来从外部测试
- ; FPM 是活跃的并且正在响应,或者
- ; - 创建 FPM 可用性图表(rrd 等);
- ; - 如果服务器没有响应(负载平衡),则从组中删除它;
- ; - 为运营团队触发警报 (24/7)。
- ; 注意:该值必须以斜杠 (/) 开头。 该值可以是
- ; 任何东西,但使用 .php 扩展名或它可能不是一个好主意
- ; 可能与真实的 PHP 文件冲突。
- ; 默认值: not set
- ;ping.path = /ping
-
- ; 该指令可用于自定义 ping 请求的响应。 这
- ; 响应格式为文本/纯文本,响应代码为 200。
- ; 默认值: pong
- ;ping.response = pong
-
- ; 访问日志文件
- ; Default: not set
- ;access.log = log/$pool.access.log
-
- ; 访问日志格式。
- ; 允许使用以下语法
- ; %%: the '%' character
- ; %C: %CPU used by the request
- ; it can accept the following format:
- ; - %{user}C for user CPU only
- ; - %{system}C for system CPU only
- ; - %{total}C for user + system CPU (default)
- ; %d: time taken to serve the request
- ; it can accept the following format:
- ; - %{seconds}d (default)
- ; - %{milliseconds}d
- ; - %{mili}d
- ; - %{microseconds}d
- ; - %{micro}d
- ; %e: an environment variable (same as $_ENV or $_SERVER)
- ; it must be associated with embraces to specify the name of the env
- ; variable. Some examples:
- ; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
- ; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
- ; %f: script filename
- ; %l: content-length of the request (for POST request only)
- ; %m: request method
- ; %M: peak of memory allocated by PHP
- ; it can accept the following format:
- ; - %{bytes}M (default)
- ; - %{kilobytes}M
- ; - %{kilo}M
- ; - %{megabytes}M
- ; - %{mega}M
- ; %n: pool name
- ; %o: output header
- ; it must be associated with embraces to specify the name of the header:
- ; - %{Content-Type}o
- ; - %{X-Powered-By}o
- ; - %{Transfert-Encoding}o
- ; - ....
- ; %p: PID of the child that serviced the request
- ; %P: PID of the parent of the child that serviced the request
- ; %q: the query string
- ; %Q: the '?' character if query string exists
- ; %r: the request URI (without the query string, see %q and %Q)
- ; %R: remote IP address
- ; %s: status (response code)
- ; %t: server time the request was received
- ; it can accept a strftime(3) format:
- ; %d/%b/%Y:%H:%M:%S %z (default)
- ; The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
- ; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
- ; %T: time the log has been written (the request has finished)
- ; it can accept a strftime(3) format:
- ; %d/%b/%Y:%H:%M:%S %z (default)
- ; The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
- ; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
- ; %u: remote user
- ;
- ; Default: "%R - %u %t \"%m %r\" %s"
- ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
-
- ; 慢请求的日志文件
- ; 默认值:未设置
- ; 注意:如果设置了 request_slowlog_timeout,slowlog 是强制性的
- ;slowlog = log/$pool.log.slow
-
- slowlog = /data/log/php80/slow.log
-
- ; 服务单个请求的超时时间,之后 PHP 回溯将是
- ; 转储到“慢日志”文件。 值“0s”表示“关闭”。
- ; 可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays)
- ; 默认值: 0
- ;request_slowlog_timeout = 0
-
- ; 慢日志堆栈跟踪的深度。
- ; 默认值: 20
- ;request_slowlog_trace_depth = 20
-
- ; 服务单个请求的超时时间,之后工作进程将
- ; 被杀。 当 'max_execution_time' ini 选项时应使用此选项
- ; 由于某种原因不会停止脚本执行。 值“0”表示“关闭”。
- ; 可用单位:s(econds)(默认)、m(inutes)、h(ours) 或 d(ays)
- ; 默认值: 0
- ;request_terminate_timeout = 0
-
- ; 'request_terminate_timeout' ini 选项设置的超时后未使用
- ; 应用程序调用“fastcgi_finish_request”或应用程序完成时
- ; 正在调用关闭函数(通过 register_shutdown_function 注册)。
- ; 此选项将启用无条件应用超时限制
- ; 即使在这种情况下。
- ; 默认值: no
- ;request_terminate_timeout_track_finished = no
-
- ; 设置打开文件描述符 rlimit。
- ; 默认值: system defined value
- ;rlimit_files = 1024
-
- ; 设置最大核心尺寸 rlimit。
- ; 可能的值:“无限”或大于或等于 0 的整数
- ; 默认值: system defined value
- ;rlimit_core = 0
-
- ; chroot 到这个目录开始。 该值必须定义为
- ; 绝对路径。 如果未设置此值,则不使用 chroot。
- ; 注意:您可以使用 '$prefix' 作为前缀来 chroot 到池前缀或一个
- ; 的子目录。 如果未设置池前缀,则使用全局前缀
- ; 将被使用。
- ; 注意:chrooting 是一个很好的安全功能,应该在任何时候使用
- ; 可能的。 但是,所有 PHP 路径都将相对于 chroot
- ; (error_log,sessions.save_path,...)。
- ; 默认值: not set
- ;chroot =
-
- ; chdir 到这个目录开始。
- ; 注意:可以使用相对路径。
- ; 默认值: current directory or / when chroot
- ;chdir = /var/www
-
- ; 将工作人员标准输出和标准错误重定向到主错误日志。 如果未设置,stdout 和
- ; 根据 FastCGI 规范,stderr 将被重定向到 /dev/null。
- ; 注意:在高负载环境下,这可能会导致页面延迟
- ; 处理时间(几毫秒)。
- ; 默认值: no
- ;catch_workers_output = yes
-
- ; 使用包含有关信息的前缀和后缀装饰工作人员输出
- ; 写入日志的孩子以及是否使用了 stdout 或 stderr
- ; 日志级别和时间。 仅当 catch_workers_output 为 yes 时才使用此选项。
- ; 设置为“no”将输出写入 stdout 或 stderr 的数据。
- ; 默认值: yes
- ;decorate_workers_output = no
-
- ; FPM 工作人员的清晰环境
- ; 防止任意环境变量到达 FPM 工作进程
- ; 通过在此指定的环境变量之前清除工作人员中的环境
- ; 添加池配置。
- ; 设置为“no”将使所有环境变量都可用于 PHP 代码
- ; 通过 getenv()、$_ENV 和 $_SERVER。
- ; 默认值: yes
- ;clear_env = no
-
- ; 限制 FPM 允许解析的主脚本的扩展。 这个可以
- ; 防止Web服务器端的配置错误。 你应该只限制
- ; FPM转.php扩展名,防止恶意用户使用其他扩展名
- ; 执行php代码。
- ; 注意:设置一个空值以允许所有扩展。
- ; 默认值: .php
- ;security.limit_extensions = .php .php3 .php4 .php5 .php7
-
- ; 传递环境变量,如 LD_LIBRARY_PATH。 所有 $VARIABLEs 都取自
- ; 当前环境。
- ; 默认值: 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 SAPI 相同:
- ; php_value/php_flag - 您可以设置可以从 PHP 调用 'ini_set' 覆盖的经典 ini 定义。
- ; php_admin_value/php_admin_flag - 这些指令不会被 PHP 调用 'ini_set' 覆盖
- ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
-
- ; 定义“扩展”将加载相应的共享扩展
- ; 扩展目录。 定义 'disable_functions' 或 'disable_classes' 不会
- ; 覆盖以前定义的 php.ini 值,但会附加新值
- ; 反而。
-
- ; 注意:路径 INI 选项可以是相对的,并且将使用前缀进行扩展
- ; (pool, global or /usr/local/php80)
-
- ; 默认值:除了 php.ini 和
- ; 在启动时使用 -d 参数指定
- ;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
最后谈几点关于配置fpm的线程池的问题: