温大爷要飞升 發表於 2022-10-23 18:37:00

php-fpm 配置详解

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

</span>#<span style="color: rgba(0, 0, 0, 1)">最重要的就是pm相关的几个配置了,还有一些配置采用默认就好,详情见官网。

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