[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个进程,那么就是3000M,3G内存
· 使用unix socket,即在nginx配置文件中
设定 fastcgi_pass=unix:/dev/shm/phpfpm.sock;
把php的socket文件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左右,而且可以随时变化,对于一半访问量的网站足够了。