php-fpm配置解说(PHP-FPM参数优调)

[全站通告] 想快速节省您的时间并可接受付费的朋友,可扫右边二维码加博主微信-非诚勿扰!

最近处理一些PHP脚本的时候,要经常用到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目录下的etc/php-fpm.d/*.conf

pm.max_children = 100
最大子进程数量,越多越好,一般每个php-cgi所耗费的内存为20M左右
如果最大数量设置为100,则在峰值的时候php-cgi所耗内存在2000M以内
如果这个值设置的比较小,那么等待的请求时间会出现502超时
4G内存服务器可以设置成200

pm.start_servers = 20
pm.start_servers:启动时创建的子进程数,10~20之间就可以,20个的话是400M内存

pm.max_requests = 10240
为避免内存泄露,php-fpm有这么一个机制,当一个php-cgi进程处理的请求数达到这个配置后,则会自动重启该进程
所以在高并发中,经常导致502错误
解决方法就是把这个值设置大一些,减少进程重启次数,减少高并发情况下502错误。

request_terminate_timeout = 400
单个请求的超时中止时间,超时后会终止进程,nginx发现信号断了,就会给客户端返回502错误。
和php.ini的max_execution_time配置不冲突,谁先达到时间谁先起作用。
由于程序中有请求第三方接口等待,所以建议这个值设置为400秒,长一点不会出现502错误

pm.min_spare_servers = 10
保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程

pm.max_spare_servers = 30
保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

rlimit_files = xxx
设置文件打开描述符的rlimit限制,可使用 ulimit -n 查看

其他:pm.status_path = /status
可以用来查看php-fpm运行情况,配置打开后再在nginx进行代理转发,就可以在浏览器访问了

/status显示的参数意义:

pool – fpm池子名称,大多数为www
process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic
start time – 启动日期,如果reload了php-fpm,时间会更新
start since – 运行时长
accepted conn – 当前池子接受的请求数
listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
max listen queue – 请求等待队列最高的数量
listen queue len – socket等待队列长度
idle processes – 空闲进程数量
active processes – 活跃进程数量
total processes – 总进程数量
max active processes – 最大的活跃进程数量(FPM启动开始算)
max children reached - 进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
slow requests – 启用了php-fpm slow-log,缓慢请求的数量

还可以在访问时,在网址后面追加?full,可以查看更详细的状态,参数值有:
pid – 进程PID,可以单独kill这个进程.
state – 当前进程的状态 (Idle, Running, …)
start time – 进程启动的日期
start since – 当前进程运行时长
requests – 当前进程处理了多少个请求
request duration – 请求时长(微妙)
request method – 请求方法 (GET, POST, …)
request URI – 请求URI
content length – 请求内容长度 (仅用于 POST)
user – 用户 (PHP_AUTH_USER) (or ‘-’ 如果没设置)
script – PHP脚本 (or ‘-’ if not set)
last request cpu – 最后一个请求CPU使用率。
last request memorythe - 上一个请求使用的内存

nginx转发配置:

location /status {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

其他:ping.path = /ping
用于外部检测FPM是否存活并且可以响应请求

nginx转发配置:

location /ping {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

注:macOS系统对进程数、打开文件数等等有限制,为了方便操作,直接在Linux下测试。

修改配置后重载配置文件:

ps aux|grep php-fpm 得到Ss类型运行的pid
kill -USR2 pid

php7以上版本的php-fpm参数配置

php-fpm的核心参数配置,默认如下:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

只针对动态方式dynamic说明如下:

max_children:动态方式下限定php-fpm的最大进程数

start_servers:动态方式下的起始php-fpm进程数量

min_spare_servers :动态方式空闲状态下的最小php-fpm进程数量

max_spare_servers :动态方式空闲状态下的最大php-fpm进程数量

这些参数如果注意改错了参数会导致php-fpm启动不了,nginx也就无法访问php文件,可查看日志排查错误:

/usr/local/php/var/log/php-fpm.log

规则汇总:

1.max_children 必须大于 min_spare_servers

2.max_children 必须大于 max_spare_servers

3.start_servers 必须大于 min_spare_servers

4.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) /

php-fpm全局配置说明(PHP5.6载入)

配置里面的所有相对路径,都是相对于php的安装路径。

除了有php-fpm.conf配置文件外,通常还有其他的*.conf配置文件(也可以不要,直接在php-fpm.conf配置)用于配置进程池,不同的进程池可以用不同的用户执行,监听不同的端口,处理不同的任务;多个进程池共用一个全局配置。

[www] #进程池的名字;
user = www
group = www #以什么用户什么组的权限来运行[www]这个进程池,用户,必须要设置,用户组,如果没有设置,则默认用户的组被使用;
listen.backlog = 65535 #子进程未accept处理的客户端请求队列大小,-1 on FreeBSD and OpenBSD,其他平台默认65535,高并发时重要,合理设置会及时处理排队的请求;太大会积压太多,处理完后nginx在前面都等超时断开这个和fpm的socket连接了,就杯具了。不要用-1,建议1024以上,最好是2的幂值(注意:不同版本的默认值是不同的,php5多是128,php7多是511)。
#1:一个池共用一个backlog队列,所有的池进程都去这个队列里accept连接;
#2:最大数量受限于系统配置cat /proc/sys/net/core/somaxconn,系统配置修改:vim /etc/sysctl.conf,增加net.core.somaxconn =1024则最大为1024,然后php最大的backlog可以到1024。
listen = 127.0.0.1:9000 #进程池[www]的监听端口,可用格式为:'ip:port','port','/path/to/unix/socket'。每个进程池都需要设置。如果nginx和php在不同的机器上,只能用机器真实ip+端口的格式,如果在同一台机器上,还可以选择unix soxket方式,这种理论上速度会提升31%,但高并发下不够稳定。
listen.owner = www
listen.group = www
listen.mode = 0666 #unix socket设置选项,如果使用tcp方式访问,这里注释即可。
listen.acl_users = www,php #当系统支持 POSIX ACL(Access Control Lists)时,可以设置使用此选项。 当设置了的时候,将会忽略 listen.owner 和 listen.group。值是逗号分割的用户名列表。 PHP 5.6.5 起可用。
listen.acl_groups=web #参见 listen.acl_users。 值是逗号分割的用户组名称列表。 PHP 5.6.5 起可用。
listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。每个地址是用逗号分隔。如果没有设置或者为空,则允许任何服务器请求连接。
process.priority = -19 #该池进程的权限,同样要master进程是root用户才有效,和全局那个一样,不设置的话会继承master进程的优先级。
pm = dynamic #可选static,dynamic,ondemand,也就是说php-fpm有三种进程管理模式,默认dynamic。
#1:static,固定启动若干(即pm.max_children)php进程,保持不变。
#有效配置:pm.max_children
#2:ondemand,这种模式刚启动时不会启动任何php进程,只有php-fpm接收到请求时才会根据需求启动php进程,最大为pm.max_children个,另外若php进程空闲时间达到pm.process_idle_timeout(单位s),就会kill掉该进程。
#有效配置:pm.max_children,pm.process_idle_timeout
#3:dynamic,这种是最常用的,根据相关配置动态调整php进程个数;
#有效配置如下:
#pm.max_children : 最大php进程数;
#pm.min_spare_servers:最小的空闲php进程数,少与该值会启动php进程(这里的空闲并不是指完全空闲的php进程,可以直接理解为启动的php进程就好了,把空闲二字去掉更贴切);
#pm.max_spare_servers:最大的空闲php进程数,多余的会被kill;
#pm.start_servers : php-fpm启动时的php进程数,它的值需要在min_spare_servers和max_spare_servers之间,默认值:min_spare_servers(max_spare_servers - min_spare_servers) / 2;
#pm.max_requests ,默认为0(此时等于PHP_FCGI_MAX_REQUESTS)。为了便于描述,此处假设它的值是500,那么这个参数的作用是一个php进程(即fpm的一个子进程)处理500个请求后会被kill,然后再启动一个php进程,这样可以防止因为内存泄漏导致的php进程占用内存过高的问题。
access.log = var/log/php-fpm/$pool-access.log #访问文件日志;
access.format = "%R - %u %t “%m %r%Q%q” %s %f %{mili}d %{kilo}M %C%%" #设定访问日志的格式。
slowlog = /var/log/php-fpm/$pool-slow.log #慢请求日志;
request_slowlog_timeout #默认为0(不启用),此处假设它的值是10,则超过10s未响应的请求就是慢请求,会被记录到慢请求日志中;
request_terminate_timeout #默认为0(不启用),此处假设它的值是20,则若某个请求超过20s未响应,相应的php进程会被kill掉,和php.ini中的max_execution_time效果类似。
php_value ,php_flag, php_admin_value , php_admin_flag #设置php.ini中的配置,后二者相比前两者,不能被 PHP 代码中的 ini_set() 及相似函数覆盖。

#最重要的就是pm相关的几个配置了,还有一些配置采用默认就好,详情见官网。

【全局配置】
pid = run/php-fpm.pid #pid设置。
error_log = log/php-fpm.log #错误日志。
log_level = notice #错误级别。上面的php-fpm.log纪录的错误等级。可用级别为:alert(必须立即处理),error(错误情况),warning(警告情况),notice(一般重要信息),debug(调试信息)。默认:notice。
syslog.facility = daemon #把日志写进系统log,linux还不够熟悉,暂时不用理会。
syslog.ident = php-fpm #系统日志标示(前缀),如果跑了多个fpm进程池,需要用这个来区分日志是谁的。
emergency_restart_threshold = 5
emergency_restart_interval = 60 #表示在60s内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。0 表示‘关闭该功能’。默认值: 0 (关闭)。
process_control_timeout = 0 #设置子进程接受主进程复用信号的超时时间。可用单位:s(秒),m(分),h(小时),或者 d(天) 默认单位: s(秒)。默认值: 0。
process.max = 128 #当动态管理子进程时,fpm最多能fork多少个进程,默认0表示无限制,这是所有进程池能启动子进程的总和,谨慎使用。
process.priority = -19 #设置子进程的优先级,在master进程以root用户启动时有效;如果没有设置,子进程会继承master进程的优先级,值范围-19(最高)到20(最低),默认不设置。
rlimit_files = 1024 #设置master进程最多能打开的文件,默认为系统的值。
rlimit_core = 0 #master进程核心rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。
events.mechanism = epoll #事件处理机制,默认自动检测,可选值: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)。linux>=2.5.44会默认epoll,效果最好的IO方式。
systemd_interval = 10s #当fpm被设置为系统服务时,多久向服务器报告一次状态,单位有s,m,h。
daemonize = yes #作为守护进程运行php-fpm。默认值为yes。

问题未解决?付费解决问题加Q或微信 2589053300 (即Q号又微信号)右上方扫一扫可加博主微信

所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!

支付宝赞助
微信赞助

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如您下载该资源,行为将被视为对《免责声明》全部内容的认可->联系老梁投诉资源
LaoLiang.Net部分资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:service@laoliang.net
意在交流学习,欢迎赞赏评论,如有谬误,请联系指正;转载请注明出处: » php-fpm配置解说(PHP-FPM参数优调)

发表回复

本站承接,网站推广(SEM,SEO);软件安装与调试;服务器或网络推荐及配置;APP开发与维护;网站开发修改及维护; 各财务软件安装调试及注册服务(金蝶,用友,管家婆,速达,星宇等);同时也有客户管理系统,人力资源,超市POS,医药管理等;

立即查看 了解详情