网站首页 文章专栏 php-fpm配置与优化

php-fpm配置与优化

编辑时间:2020-09-08 09:32:11 作者:苹果 浏览量:3102


    前言:php-fpm参数调优 也算是服务器的优化吧 。


在linux yum 安装的php7版本环境下:


php-fpm.conf 的全局配置文件在 /etc/php-fpm.conf中,默认开启了   


pid = /var/run/php-fpm/php-fpm.pid #PID 文件的位置

error_log = /var/log/php-fpm/error.log #错误日志的位置 

daemonize = yes #将fpm转至后台运行,如果设置为"no",那么fpm会运行在前台

include=/etc/php-fpm.d/*.conf  #用于包含一个或多个文件

其他默认关闭的信息,不建议开启,需要设置,可在/etc/php-fpm.d/ 下的对应文件中单独配置


进程配置:

/etc/php-fpm.d/下的默认有一个www.conf 的配置文件,具体的一些常用配置如下:

user = nginx

group = nginx  #启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。用户组,如果没有设置,则默认用户的组被使用。


listen = 127.0.0.1:9000#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置。如果nginx和php在不同的机器上,分布式处理,就设置ip这里就可以了



pm = dynamic #php-fpm进程启动模式,pm可以设置为static、dynamic和ondemand

特别注意:

如果选择static,则进程数就数固定的,由pm.max_children指定固定的子进程数。比如设置 pm.max_children = 20,则启动php-fpm的时候就会一起全部启动21(1个主+20个子)个进程。


如果选择dynamic,则进程数是动态变化的,由以下参数决定:

pm.max_children = 50 #子进程最大数

pm.start_servers = 2 #启动时的进程数,默认值为: min_spare_servers + (max_spare_servers - min_spare_servers) / 2

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

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

pm.max_requests = 500#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.


可以看到,pm = dynamic模式非常灵活,也通常是默认的选项。但是,dynamic模式为了最大化地优化服务器响应,会造成更多内存使用,因为这种模式只会杀掉超出最大闲置进程数(pm.max_spare_servers)的闲置进程,比如最大闲置进程数是30,最大进程数是50,然后网站经历了一次访问高峰,此时50个进程全部忙碌,0个闲置进程数,接着过了高峰期,可能没有一个请求,于是会有50个闲置进程,但是此时php-fpm只会杀掉20个子进程,始终剩下30个进程继续作为闲置进程来等待请求,这可能就是为什么过了高峰期后即便请求数大量减少,服务器内存使用却也没有大量减少,也可能是为什么有些时候重启下服务器情况就会好很多,因为重启后,php-fpm的子进程数会变成最小闲置进程数,而不是之前的最大闲置进程数


至于ondemand,与 dynamic 相反,进程数是动态变化的,pm.start_servers 在服务启动时即启动。(不建议这种)由以下参数决定:

pm.process_idle_timeout mixed:秒数,多久之后结束空闲进程。


这种模式把内存放在第一位,他的工作模式很简单,每个闲置进程,在持续闲置了pm.process_idle_timeout秒后就会被杀掉,有了这个模式,到了服务器低峰期内存自然会降下来,如果服务器长时间没有请求,就只会有一个php-fpm主进程,当然弊端是,遇到高峰期或者如果pm.process_idle_timeout的值太短的话,无法避免服务器频繁创建进程的问题,所以不推荐使用这种。


引申:我们配置时,到底选择static还是dynamic?

般原则是:动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。

如果你的内存很大,有8-20G,按照一个php-fpm进程20-30M算,60个差不多2G内存了,那就可以开启static模式。如果你的内存很小,比如才256M,那就要小心设置了,因为你的机器里面的其他的进程也算需要占用内存的,所以设置成dynamic是最好的,比如:pm.max_chindren = 8, 占用内存160M左右,而且可以随时变化,对于一半访问量的网站足够了。





pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.


pm.status_path = /status #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none。这个建议开启!方法:《php-fpm状态监控》


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

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


request_terminate_timeout = 0   #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用。设置为 '0′ 表示 ‘Off'.当经常出现502错误时可以尝试更改此选项


slowlog = log/$pool.log.slow    #慢请求的记录日志,配合request_slowlog_timeout使用。建议开启!

request_slowlog_timeout = 10s#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0′ 表示 ‘Off'


rlimit_files = 1024 #设置文件打开描述符的rlimit限制. 默认值: 系统定义值。系统默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。


rlimit_core = 0 #设置核心rlimit最大限制值. 可用值: ‘unlimited' 、0或者正整数. 默认值: 系统定义值.


下面是我的配置 www部分(优化后的):

[www]

listen =127.0.0.1:9000

listen.allowed_clients = 127.0.0.1

user = www

group = www

pm = dynamic

pm.max_children =50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 30

request_terminate_timeout = 600

pm.status_path = /status

request_slowlog_timeout = 5s

slowlog = /data/logs/php/fpm/www-slow.log

pm.max_requests = 2048

pm.process_idle_timeout = 10s

rlimit_files = 51200



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论