PHP-FPM php-fpm.conf 参数优化

[global]

pid = /www/wdlinux/phps/56/var/run/php-fpm.pid

error_log = /www/wdlinux/phps/56/var/log/php-fpm.log

log_level = notice

[www]

listen = /tmp/php-56-cgi.sock

listen.backlog = -1

listen.allowed_clients = 127.0.0.1

listen.owner = www

listen.group = www

listen.mode = 0666

user = www

group = www

 

pm = dynamic     #表示我们创建的php-fpm子进程数量是固定的,那么就只有pm.max_children = 50这个参数生效。你启动php-fpm的时候就会一起全部启动51(1个主+50个子)个进程,颇为壮观。pm= dynamic模式,表示启动进程是动态分配的,随着请求量动态变化的。他由 pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers这几个参数共同决定。

 

pm.max_children = 12  #是最大可创建的子进程的数量。必须设置。这里表示最多只能20个子进程。

 

pm.start_servers = 2       #随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers+ (max_spare_servers - min_spare_servers) / 2。这里表示,一起启动会有20个子进程。

 

pm.min_spare_servers = 2        #设置服务器空闲时最小php-fpm进程数量。必须设置。如果空闲的时候,会检查如果少于10个,就会启动几个来补上

 

pm.max_spare_servers = 6        #设置服务器空闲时最大php-fpm进程数量。必须设置。如果空闲时,会检查进程数,多于30个了,就会关闭几个,达到30个的状态。

 

pm.max_requests = 2000          #当一个PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程。

502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的.

但是为什么要重启进程呢? 如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长(比如第三方库有问题等)。因此PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。正是因为这个机制,在高并发中,经常导致502 错误目前我们解决方案是把这个值尽量设置大些,减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。PS:刚开始我们是500导致内存飙高,现在改成5120,当然可以再大一些,10240等,这个主要看测试结果,如果没有内存泄漏等问题,可以再大一些。

 

request_terminate_timeout = 60     #最长执行时间        #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的max_execution_time因为某些特殊原因没有中止运行的脚本有用.设置为 0 表示 Off.当经常出现502错误时可以尝试更改此选项。这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。

 

 

request_terminate_timeout

如 果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将request_terminate_timeout设 置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给request_terminate_timeout赋一个值,这个值可以根 据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

 

max_children

max_children 这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置max_children 也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的max_children我 设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的max_children设置的较小,比如5-10个,那么php-cgi就会很累,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

max_children基本就是进程数,跟nginx的进程没有想象中的那么大,因为FPM会自己管理进程(有待考证,起码我简单浏览了一下源码,认为是这个意思).参数不宜设置过大,很占内存,进程的消耗就不用我多说了.

 

max_children较好的设置方式根据req/s来设置,若程序是 100 req/s的处理能力..最大并发是10K,那么就设置100比较好,这是动态来调整的.

 

不过你若用php 5.3,也可以把style设置为apache-like,那么设置start_servers,min_spare_servers,max_spare_servers三个参数就可以自动调整

 

很简单,具体看配置文件,这样的设置之后,在高负载和复杂的php程序会省事一点,毕竟测试req/s是可恶的体力活.

 

 

max_requests

max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关 系不大),就自动杀死..我这里应该设置512的,不过懒得压力测试了,设置大一点,不过也不要设置过大,是个结构体,没测试过,接近8K到9K大小.网上动辄设置100k,有点浪费内存了.一个进程浪费大小接近1M.按照网上常用配置的128个进程,大概浪费100M左右.好吧,我承认100M是白菜 价,但也别这样浪费..==

 

·      php-fpm配置文件中的参数 pm修改为
pm = static
默认是dynamic,动态的

这个参数用来控制php-fpm进程创建是动态创建还是在php-fpm启动时就创建好
修改为static的理由是,static在启动时创建,能节省动态创建php-fpm进程的开销
pm=static相关联的参数有
pm.max_children=24
最大创建的php-fpm进程
pm.max_children
数量的多少根据机器内存确定,基本上一个进程需要30M的内存,假设起100个进程,那么就是3000M3G内存

 

·      使用unix socket,即在nginx配置文件中
设定 fastcgi_pass=unix:/dev/shm/phpfpm.sock;

phpsocket文件phpfpm.sock放在/dev/shm中的理由是/dev/shm是内存设备,放在这个里面读取速度快
配置php-fpm的文件,修改参数 listen ,将
listen =127.0.0.1:9000
修改为
listen =/dev/shm/phpfpm.sock

如果php-fpm启动后生成的phpfpm.sock文件的权限不不足,nginx 无法读取,会报502错误,配置 listen.mode = 0666,即可完美解决问题

 

·      配置慢请求记录,用于监控
request_slowlog_timeout = 10s
slowlog = log/$pool.log.slow

 

slowlog =/tmp/www.slow.log

request_slowlog_timeout= 1

上面两行的意思是访问的时候会把执行脚本超过1秒脚本记录下来,方便我们排查到底是脚本问题还是哪里的问题,这里的时间可以调整

 

 

 

·      配置php-fpm进程可打开的最大文件句柄数
rlimit_files = 1024
默认1024,此值可以不需要配置

 

如果我们想限制使用这个pool的用户的访问目录我们可以加入下面这样一行:

php_admin_valueopen_basedir=/data/www/:/tmp/

上面不同的目录中间用:冒号分开

 

 

到底选择static还数dynamic?

很多人恐惧症来袭,不知道选什么好?

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

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

 

 

 


分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS