摘自:https://www.jb51.net/article/148550.htm 感谢分享php
php-fpm全名是PHP FastCGI进程管理器html
php-fpm启动后会先读php.ini,而后再读相应的conf配置文件,conf配置能够覆盖php.ini的配置。linux
启动php-fpm以后,会建立一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去建立若干子进程,子进程用于处理实际的业务。nginx
当有客户端(好比nginx)来链接9000端口时,空闲子进程会本身去accept,若是子进程所有处于忙碌状态,新进的待accept的链接会被master放进队列里,等待fpm子进程空闲;web
这个存放待accept的半链接的队列有多长,由 listen.backlog 配置。apache
配置里面的全部相对路径,都是相对于php的安装路径。json
除了有php-fpm.conf配置文件外,一般还有其余的*.conf配置文件(也能够不要,直接在php-fpm.conf配置)用于配置进程池,不一样的进程池能够用不一样的用户执行,监听不一样的端口,处理不一样的任务;多个进程池共用一个全局配置。vim
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的整数,默认为系统的值。 events.mechanism = epoll #事件处理机制,默认自动检测,可选值:select,poll,epoll(linux>=2.5.44),kqueue,/dev/poll,port systemd_interval = 10s #当fpm被设置为系统服务时,多久向服务器报告一次状态,单位有s,m,h。
在不一样的监听端口和不一样的管理选项下能够跑任意数量的池,并无个数限制;
池的名字用于 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,建议1024以上,最好是2的幂值。 #一个池共用一个backlog队列,全部的池进程都去这个队列里accept链接。 #最大数量受限于系统配置 cat /proc/sys/net/core/somaxconn,系统配置修改:vim /etc/sysctl.conf,增长 net.core.somaxconn = 2000 则最大为2000,而后php最大的backlog能够到2000。 listen.owner = apache listen.group = apache listen.mode = 0660 #用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.response string #用于定义 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和php-fpm在同一台服务器上,这时能够直接用unixsocket进程间通讯,不走tcp端口通讯,能够节约建立链接的时间,从而提升性能。
一、设置php-fpm的listen为/opt/remi/php56/root/var/run/php-fpm/php567-fpm.sock(能够用相对路径),而后重启fpm就会自动建立该php567-fpm.sock文件
二、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。
一、nginx配置:遇到 status 的请求,直接转发给php
location ~^/status$ {
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
二、fpm配置:pm.status_path = /status
三、而后从新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参数。
大部分参数只要系统默认的就能够了,咱们只须要知道几个比较重要的参数设置,何时用到能够回头查询相关说明