一文看懂PHP进程管理器php-fpm


Posted in PHP onJune 01, 2020

php-fpm是什么

php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。

php-fpm的工作原理

php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。
启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。
当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog 配置。

如何查看php-fpm进程与子进程

查看php-fpm相关的所有进程。如下图

一文看懂PHP进程管理器php-fpm

这里pool www皆是php-fpm的子进程,也就是我们常说的work进程。

查看php-fpm下面的子进程

通过上面的命令,其实我们能够看出php-fpm相关的进程了,如果我们需要更加直观的查看php-fpm的master进程和work进程,可以通过下面的方式进程查看。
这里的5370则是php-fpm的master进程号。通过上面的命令已经很能直观的得出。

一文看懂PHP进程管理器php-fpm

通过上面的命令,可以看出php-fpm作为master进程,下面有15个子进程。这里的子进程数都是可以进程自定义配置。通过如下几个参数进程配置:

pm = dynamic # 动态创建子进程
pm.max_children = 20 # 最大子进程数
pm.start_servers = 15 # 初始化php-fpm进程时,默认的子进程数

php-fpm参数配置说明

php-fpm全局配置参数

#php-fpm的运行权限。
#以什么用户什么组的权限来运行池fpm。
user = www
group = www

#php-fpm的运行方式,可以使端口,也可以使socke文件。
#如果是端口则是走tcp,如果是socket则直接读socket文件,这样性能相对更好。
listen = 127.0.0.1:9000 

#拥有socket权限的用户,需要和上面的user、group配置相结合。
#如果采用的端口的方式,则不配置。
listen.owner = www
listen.group = www
listen.mode = 0660

#这是php-fpm端口连接的地址。多个用","隔开。默认任意地址都可以连接。
#例如Nginx和php-fpm不在同一台服务器上,这里的值就是Nginx服务的ip地址。
#当Nginx和php-fpm配置在同一台服务器上,则直接写127.0.0.1即可。
listen.allowed_clients = 127.0.0.1 

#pid进程文件存放的位置,当我们启用一个php服务,
#则会自动创建一个该pid文件,其实我们可以直接把该文件理解理解php-fpm的进程号文件,
#两则是等价的。默认为none。
pid = /opt/remi/php72/root/var/run/php-fpm/php-fpm.pid 

#错误日志位置,默认:安装路径 #INSTALL_PREFIX#/log/php-fpm.log。
#如果设置为syslog,log就会发送给syslogd服务而不会写进文件里。
error_log = /opt/remi/php72/root/var/log/php-fpm/error.log 

#PHP限制的文件扩展名
security.limit_extensions = .php .php3 .php4 .php5 .php7

#系统日志标示,如果跑了多个fpm进程,需要用这个来区分日志是谁的。
syslog.ident = php-fpm 

#日记登记,可选:alert, error, warning, notice, debug。
log_level = notice 

#紧急重启阈值,需要与下面emergency_restart_interval参数一起配置。
emergency_restart_threshold = 60 

# 紧急重启阈值的时间范围。在此参数设置的时间内,
# 出现SIGSEGV或SIGBUS的子进程数超过emergency_restart_threshold参数设置的值。
# 那么fpm就会优雅的重启,值是0表示off这个功能,可用的单位有:s秒,m分,h时,d天。
emergency_restart_interval = 60s 

#设置子进程接受主进程复用信号的超时时间。
process_control_timeout = 0 

#当动态管理子进程时,fpm最多能fork多少个进程,0表示无限制,
# 这是所有进程池能启动子进程的总和,谨慎使用。
process.max = 128 

#设置子进程的优先级,在master进程以root用户启动时有效;
#如果没有设置,子进程会继承master进程的优先级,值范围-19(最高)到20(最低),默认不设置。
process.priority = -19 

#设置成no用于调试bug,默认为yes。
daemonize = yes 

#master进程最多能打开的文件数量。默认采用系统设置的值。
rlimit_files = 1024 

#master进程核心rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。
rlimit_core = 0

#事件处理机制,默认自动检测,可选值:select,poll,
#epoll(linux>=2.5.44),kqueue,/dev/poll,port
events.mechanism = epoll 

#fpm想系统发送状态的频率。单位有s,m,h。
#前提是fpm被设置会系统服务。
systemd_interval = 10s

php-fpm的进程进程池配置

#php-fpm的队列长度。
listen.backlog = 65535 

#php进程池权限,同样要master进程是root用户才有效,
#和上面的全局设置一样,不设置的话会继承master进程的优先级。
process.priority = -19 

#子进程管理方式
#static(静态配置,在启动php-fpm时根据该值创建固定的子进程数量);
#dynamic(动态配置,在启动php-fpm时根据pm.start_servers的值初始化对应的子进程数,至少一个子进程);
#ondemand(按需配置,在启动php-fpm时不创建子进程,而是根据请求动态fork子进程);
pm = dynamic 

#最大子进程数量
pm.max_children = 5 

#初始化子进程数量,与上面的pm = dynamic配置使用。
pm.start_servers = 2 

#服务器闲置时最少保持2个子进程,不够这个数就会创建,只适用动态dynamic管理方式
pm.min_spare_servers = 2 

#服务器闲置时最多要有几个,多了会kill,只适用动态dynamic管理方式
pm.max_spare_servers = 3 

#子进程闲置时间,也就是说子进程没有可处理的任务时,在该之间使就会被killed。
pm.process_idle_timeout = 10s

#每个子进程最大的处理请求数量。在一定程度上可以防止内存泄漏。
pm.max_requests = 500 

#php-fpm状态监控的uri
pm.status_path string

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

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

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

#检测路径时使用的前缀
prefix string

#访问文件日志,没啥用处,比如yii2每次都记录访问index.php,只是记录真实的PHP文件。
access.log = var/log/$pool.access.log 

#php的慢日志
slowlog = var/log/$pool.log.slow 

#慢日志时间阈值
request_slowlog_timeout = 2s 

#单个请求的超时时间,当php.ini设置的最大执行时间未生效,则交由它来处理。
request_terminate_timeout = 3s 

#最大打开句柄数,默认为系统值。
rlimit_files = 1024 

#最多的核心使用数,默认为系统分配。
rlimit_core = 0

部分配置演示

php-fpm的backlog大小设置

php-fpm的backlog大小设置与php-fpm的处理能力有关,而不是越大越好。

当该值设置过大,导致php-fpm处理不过来,nginx那边等待超时,断开连接,报504 gateway timeout错。同时php-fpm处理完准备write 数据给nginx时,发现TCP连接断开了,报“Broken pipe”。

当该值设置过小,nginx之类的client请求,根本进入不了php-fpm的accept queue,报“502 Bad Gateway”错。所以,这还得去根据php-fpm的QPS来决定backlog的大小。计算方式最好为QPS=backlog。

php-fpm启动模式

php-fpm以socket启动或者端口启动,这两种的方式根据实际情况进行配置。

nginx和php-fpm在同一台服务器上,这时可以直接用unix socket进程间通信,不走tcp端口通信,可以节约创建连接的时间,从而提高性能。sock文件随便创建到哪里都可以,只要fpm有权限在那个目录里写文件,nginx有权限去读就可以。tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下文切换,更少的资源占用。不过只能在nginx和fpm在同一台机器上才能用socket。

如何选择socket启动还是端口启动。

由于tcp方式相对unix的方式,并发量更高,因此针对并发量高的项目,建议采用tcp方式,现在Nginx配置示例文件默认的也是tcp方式。

使用unix方式,可以优化的点,就是将socket文件放在/dev/shm目录下面,大致的意思,就是该目录下面的文件是不是存储再硬盘中的,而是存储再内存中的。至于硬盘读取和内存读取,谁快谁慢,肯定是内存最快了。

socket方式启动如何查看socke文件。

socket文件是根据上面提到的pid配置项而定的。我们可以直接使用cat命令,查看进程号。

一文看懂PHP进程管理器php-fpm

子进程默认启动数量,通过上面的pm = dynamic 配置,我们知道这种方式是动态配置子进程大小的,同时我们也可以设置默认的子进程数。

pm = dynamic
pm.max_children = 20
### 默认15个子进程,演示的效果就是上面的shell命令的结果图。
pm.start_servers = 15

当我们尝试设置为3时,显示如下错误信息。

一文看懂PHP进程管理器php-fpm

说明,这里的start_servers配置项和min_spare_servers配置是有一定的关系的。我们设置为最小10,结果就能正常启动php-fpm了。

以上就是一文看懂PHP进程管理器php-fpm的详细内容,更多关于PHP进程管理器php-fpm的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
十天学会php之第六天
Oct 09 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
Yii配置文件用法详解
Dec 04 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
PHP7新特性
Mar 09 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 #PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
May 29 #PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 #PHP
PHP实现本地图片转base64格式并上传
May 29 #PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 #PHP
php生成短网址/短链接原理和用法实例分析
May 29 #PHP
PHP const定义常量及global定义全局常量实例解析
May 28 #PHP
You might like
解析php中获取url与物理路径的总结
2013/06/21 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
React实现轮播效果
2020/08/25 Javascript
Python的Django框架下管理站点的基本方法
2015/07/17 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python实现元素等待代码实例
2019/11/11 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
python实现图片转字符画
2021/02/19 Python
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
高中军训感想800字
2014/02/23 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
2014年度个人工作总结
2014/11/07 职场文书
让生命充满爱观后感
2015/06/08 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
Python 中random 库的详细使用
2021/06/03 Python