php-fpm⼯作流程
php-fpm全名是PHP FastCGI进程管理器
php-fpm启动后会先读php.ini,然后再读相应的conf配置⽂件,conf配置可以覆盖php.ini的配置。
启动php-fpm之后,会创建⼀个master进程,监听9000端⼝(可配置),master进程⼜会根据f去创建若⼲⼦进程,⼦进程⽤于处理实际的业务。
当有客户端(⽐如nginx)来连接9000端⼝时,空闲⼦进程会⾃⼰去accept,如果⼦进程全部处于忙碌状态,新进的待accept的连接会被master放进队列⾥,等待fpm⼦进程空
闲;
这个存放待accept的半连接的队列有多长,由 listen.backlog 配置。
php-fpm全局配置说明
配置⾥⾯的所有相对路径,都是相对于php的安装路径。
nginx 配置文件
除了有f配置⽂件外,通常还有其他的*.conf配置⽂件(也可以不要,直接在f配置)⽤于配置进程池,不同的进程池可以⽤不同的⽤户执⾏,监听不同的
端⼝,处理不同的任务;多个进程池共⽤⼀个全局配置。
include=/opt/remi/php56/root/etc/php-fpm.d/*.conf 载⼊其他的配置⽂件。
php-fpm全局配置参数中⽂说明:
pid = /opt/remi/php56/root/var/run/php-fpm/php-fpm.pid
#pid进程⽂件,默认为none。
error_log = /opt/remi/php56/root/var/log/php-fpm/error.log
#错误⽇志位置,默认:安装路径 #INSTALL_PREFIX#/log/php-fpm.log。如果设置为syslog,log就会发送给syslogd服务⽽不会写进⽂件⾥。
syslog.facility = daemon
#把⽇志写进系统log,linux还不够熟悉,暂时不⽤理会。
syslog.ident = php-fpm
#系统⽇志标⽰,如果跑了多个fpm进程,需要⽤这个来区分⽇志是谁的。
log_level = notice
#⽇志等级,默认notice,可选:alert, error, warning, notice, debug
emergency_restart_threshold = 60
#配合下⾯emergency_restart_interval参数
emergency_restart_interval = 60s
#如果在此参数设置的时间内,出现SIGSEGV或SIGBUS的⼦进程数超过emergency_restart_threshold参数设置的值,那么fpm就会优雅的重启,值是0表⽰off这个功能,可⽤的单位有:s秒,m分,h时,d天。
process_control_timeout = 0
#设置⼦进程接受主进程复⽤信号的超时时间。这个每天明⽩,是过了这个时间就不能复⽤了?
process.max = 128
#当动态管理⼦进程时,fpm最多能fork多少个进程,0表⽰⽆限制,这是所有进程池能启动⼦进程的总和,谨慎使⽤。
process.priority = -19
#设置⼦进程的优先级,在master进程以root⽤户启动时有效;如果没有设置,⼦进程会继承master进程的优先级,值范围-19(最⾼)到20(最低),默认不设置。
daemonize = yes
#设置成no⽤于调试bug,默认为yes。
rlimit_files = 1024
#设置master进程最多能打开的⽂件,默认为系统的值。
rlimit_core = 0
#master进程核⼼rlimit限制值;可选unlimited或>=0的整数,默认为系统的值。
#事件处理机制,默认⾃动检测,可选值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,port
systemd_interval = 10s
#当fpm被设置为系统服务时,多久向服务器报告⼀次状态,单位有s,m,h。
php-fpm进程池配置 pool Definitions:
在不同的监听端⼝和不同的管理选项下可以跑任意数量的池,并没有个数限制;
池的名字⽤于 logs 和 stats。
user = apache
group = apache
#以什么⽤户什么组的权限来运⾏池fpm。
⽤apache可以像httpd服务⼀样去访问某些⽬录
listen = 127.0.0.1:9000
#监听的ip和端⼝,可以 /path/to/unix/socket 来监听unix socket,性能更好。
listen.backlog = 65535
#未accept处理的socket队列⼤⼩,-1 on FreeBSD and OpenBSD,其他平台默认65535,⾼并发时重要,合理设置会及时处理排队的请求;太⼤会积压太多,处理完后nginx在前⾯都等超时断开这个和fpm的socket连接了,就杯具了。不要⽤-1,建议#⼀个池共⽤⼀个backlog队列,所有的池进程都去这个队列⾥accept连接。
#最⼤数量受限于系统配置 cat /proc/sys/net/core/somaxconn,系统配置修改:vim /f,增加 somaxconn = 2000 则最⼤为2000,然后php最⼤的backlog可以到2000。
listen.owner = apache
#⽤socket连接⽅式时,指定拥有unix socket权限的⽤户,默认和运⾏的⽤户⼀样;⽤tcp连接可以注释掉
listen.allowed_clients = 127.0.0.1
#设置允许连接fpm的地址,⽐如nginx就要来连,多个地址⽤逗号隔开,如果不配置,则默认任意地址都能来连。
process.priority = -19
#池进程的权限,同样要master进程是root⽤户才有效,和全局那个⼀样,不设置的话会继承master进程的优先级。
pm = dynamic
#启动时⼦进程管理⽅式,可选值:static(启动时创建指定个数), dynamic(启动时根据情况创建,⾄少有⼀个), ondemand(启动时不创建⼦进程,有需求才创建)
pm.max_children = 5
#该池同时最多存在5个进程,三种管理⽅式都要配置
pm.start_servers = 2
#fpm启动时创建2个⼦进程,只适⽤动态dynamic管理⽅式
pm.min_spare_servers = 2
#服务器闲置时最少保持2个⼦进程,不够这个数就会创建,只适⽤动态dynamic管理⽅式
pm.max_spare_servers = 3
#服务器闲置时最多要有⼏个,多了会kill,只适⽤动态dynamic管理⽅式
pm.process_idle_timeout = 10s
#⼦进程闲置10s后就会被杀掉。
pm.max_requests = 500
#每个⼦进程最⼤处理500请求就被回收,可防⽌内存泄露。
pm.status_path string
#FPM 状态页⾯的⽹址。如果没有设置,则⽆法访问状态页⾯,默认值:⽆。
ping.path string
#FPM 监控页⾯的 ping ⽹址。如果没有设置,则⽆法访问 ping 页⾯。该页⾯⽤于外部检测 FPM 是否存活并且可以响应请求。请注意必须以斜线开头(/)。
#⽤于定义 ping 请求的返回响应。返回为 HTTP 200 的 text/plain 格式⽂本。默认值:pong。
process.priority int
#设置 worker 的 nice(2)优先级(如果设置了的话)。该值从 -19(最⾼优先级)到 20(更低优先级)。默认值:不设置
prefix string
#检测路径时使⽤的前缀
access.log = var/log/$pool.access.log
#访问⽂件⽇志,没啥⽤处,⽐如yii2每次都记录访问index.php,只是记录真实的PHP⽂件。
slowlog = var/log/$pool.log.slow
#PHP⽂件执⾏过慢的⽇志,会准确的记录具体哪⼀⾏代码太慢,这个⾮常有⽤,在设置了时间时⽣效。
request_slowlog_timeout = 2s
#超过这个运⾏时间就会写慢⽇志
request_terminate_timeout = 3s
#单个请求的超时时间,有时候php.ini设置的最⼤执⾏时间未⽣效,这个就会来⼲掉那个执⾏太久的请求。
rlimit_files = 1024
#最⼤打开句柄数,默认为系统值。
rlimit_core = 0
#最多的核⼼使⽤数,默认为系统分配。
chroot = /path
#路径必须是绝对路径,改变⼦进程的跟⽬录,可以把进程对⽂件系统的读写与实际的操作系统⽂件系统隔离,对安全有好处。
chdir = /var/www
#改变当前⼯作⽬录,可以⽤相对路径,默认是当前⽬录或者chroot。
catch_workers_output = yes
#重定向标准输出stdout和标准错误stderr到主错误⽇志,如果不设置,这两个⽇志就会定向到/dev/null,在⾼负载情况下,这个配置会引起页⾯延迟⼏毫秒,默认不开启。
clear_env = no
#创建work进程时是否清除环境变量,如果是yes,那么该⼦进程 getenv() 就访问不到 $_ENV 和$_SERVER 了。
security.limit_extensions = .php .php3 .php4 .php5
#为了安全,限制能执⾏的脚本后缀
#为当前池指定另外的 php.ini 配置,⽐如指定当前池的错误⽇志写在哪个地⽅
php_value/php_flag
#可以设置php.ini的内容,可以被ini_set覆盖
php_admin_value/php_admin_flag
#这个同上,但是不会被ini_set覆盖。
#其中flag设置的,值只能是on, off, 1, 0, true, false, yes or no,其他类型的值需要⽤value。
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
#这种⽅法设置 `disable_functions` 和 `disable_classes` 时,不会覆盖 php.ini 的设置,只会追加。
注意:PHP配置值通过 php_value 或者 php_flag 设置,并且会覆盖以前的值。
disable_functions 或者 disable_classes 在 php.ini 之中定义的值不会被覆盖掉,但是会将新的设置附加在原有值的后⾯。
使⽤ php_admin_value 或者 php_admin_flag 定义的值,不能被 PHP 代码中的 ini_set() 覆盖。
⾃ 5.3.3 起,也可以通过 web 服务器设置 PHP 的设定。
nginx 通过 unixsock 与 php-fpm 通信:
适⽤场景:nginx和php-fpm在同⼀台服务器上,这时可以直接⽤unixsocket进程间通信,不⾛tcp端⼝通信,可以节约创建连接的时间,从⽽提⾼性能。
1、设置php-fpm的listen为/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock(可以⽤相对路径),然后重启fpm就会⾃动创建该php567-fpm.sock⽂件
2、nginx的fastcgi_pass参数修改为 unix:/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock; 通过php567-fpm.sock⽂件去和fpm通信,需要保证该 php567-fpm.sock ⽂件nginx 有权限访问。
总结:
sock⽂件随便创建到哪⾥都可以,只要fpm有权限在那个⽬录⾥写⽂件,nginx有权限去读就可以。tcp连接会更稳定,因为有tcp协议保证数据的正确性,但是sock有更少的数据拷贝和上下⽂切换,更少的资源占⽤。不过只能在nginx和fpm在同⼀台机器上才能⽤sock。
php-fpm进程状态监控
1、nginx配置:遇到 status 的请求,直接转发给php
location ~^/status$ {
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
2、fpm配置:pm.status_path = /status
3、然后重新fpm和nginx,在浏览器⾥访问就能看到了:
默认以 text/plain 展⽰结果,可以传参数 ?json/html/xml 分别得到json等格式的结果;参数full可以查看每个⼦进程的明细
pool 进程池名称
process manager 进程管理⽅式
start time 进程什么时候启动的
start since 进程已经运⾏了多少秒
accepted conn 该池总共accept了多少连接
listen queue 等待accept的连接的数量
max listen queue fpm启动后,历史最⾼等待accept的连接的数量
listen queue len 配置的监听队列最⼤长度受限于`listen.backlog`和系统`cat /proc/sys/net/core/somaxconn`,两者中取最⼩值
idle processes 闲置的进程数
active process 正在⼯作的进程数(加上限制的,就是总的⼦进程数)
total processes 总的⼦进程数量
max active processes fpm启动后,历史最多同时⼯作的进程数
max children reached 进程管理模式为 'dynamic'和 'ondemand'时,此数值是当⼦进程不够⽤时,master创建更多⼦进程的次数
slow requests 慢请求个数
full参数下
pid ⼦进程ID;
state ⼦进程状态(Idle, Running, ...);
start time ⼦进程启动的时间;
start since ⼦进程启动后运⾏了多少秒;
requests 当前⼦进程⼀共处理了多少个请求;
request duration 请求耗费的纳秒数;
request method 请求⽅法 (GET, POST, ...);
request URI 请求参数;
content length POST请求时,请求的内容长度;
user - the user (PHP_AUTH_USER) (or '-' if not set);
script 请求的哪个php⽂件;
last request cpu 上次请求耗费的cpu资源
last request memory 上次请求耗费的内存峰值
如果进程是闲置状态,那这些信息记录的就是上次请求的相关数据,否则就是当前本次请求的相关数据。
backlog配置问题
⼀个fpm⼦进程在同⼀时间只能处理⼀个请求,如果,backlog设置得过⼤,nginx之类的客户端发起的请求⼀直没有fpm⼦进程进⾏accept,nginx就会直接断掉这个连接,等fpm 忙过来了再去accept的时候,就会发现断开了,于是报错。backlog设置得过⼩,访问量⼤时fpm⼦进程全部处于忙碌状态,backlog也塞满了,就会拒绝新的连接,此时nginx再请求,就会直接被拒。所以需要合理的设置backlog参数。
⼤部分参数只要系统默认的就可以了,我们只需要知道⼏个⽐较重要的参数设置,什么时候⽤到可以回头查询相关说明

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。