首先先理解一下 CGI 、FASTCGI 、PHP-FPM的概念php
CGI 是用来接收HTTP请求的一个程序,例如[127.0.0.1/index.php?c=article&id=11,这个请求经过apahce、nginx等等过来,而后http服务器发送给php-cgi(就是php用来接收http的程序),这个玩意儿每次新建一个进程的时候都要读取和加载php.ini的一堆参数,而后才能开始接收请求,比较慢。nginx
FASTCGI的工做原理是首先启动一个master,这个master加载了全部的配置信息等等,master会新建不少个worker,而后每次有请求的时候master负责把请求分配给相应的worker,这样避免了重复加载和启动,就是一个提交cgi程序效能的东西,fastcgi这个东西只是一个协议(你能够理解为是一个没实现的想法),并非一个程序。apache
PHP-FPM就是实现这个想法的程序,CGI很蠢,不会管理进程,而PHP-FPM会根据实际状况,建立worker或者关掉worker进程,保持必定量的worker,请求多了,worker就多了,请求少了,worker就会被关掉一部分,你能够理解为它是一个高效CGI的进程管理器。服务器
——————————————————————————————————————————————————————————————————————————————————————————————————php-fpm
修改 /usr/local/php/etc 目录下的php-fpm.conf文件性能
手动启动 php-fpm
[root@user]#/usr/local/php/sbin
[root@user]#./php-fpm优化
一、php-fpm优化参数介绍
他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。网站
pm:表示使用那种方式,有两个值能够选择,就是static(静态)或者dynamic(动态)。
在更老一些的版本中,dynamic被称做apache-like。这个要注意看配置文件的说明。spa
———————————————————————————————————.net
pm = dynamic
pm.max_children:静态方式下开启的php-fpm进程数量
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量
———————————————————————————————————
区别:
若是dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
若是dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
而后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数
——————————————————————————————————————————————————————————————————————
php-fpm.conf有两个相当重要的参数,一个是”max_children”,另外一个是”request_terminate_timeout”
像这种全php的网站,每一个链接都须要apache+php-fpm协同运做。即使php-fpm中的request_terminate_timeout时间设置很长,apache中的timeout时间设置略短,只要apache的timeout到了,php-fpm照样在后面杀进程……
若是网站的访问者比较多,php-fpm的child是被许多访问者共用的,杀一个child,就有可能致使几个用户同时http 503 Service Unavailable。因此,个人建议是——php-fpm中的request_terminate_timeout最好不要设置,只给apache一个timeout就够了。
——————————————————————————————————————————————————————————————————————
个人两个设置的值一个是”40″,一个是”900″,可是这个值不是通用的,而是须要本身计算的。
计算的方式以下:
若是你的服务器性能足够好,且宽带资源足够充足,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”这个值又是怎么计算出来的呢?这个值原则上是越大越好,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这个错误。
—————————————————————————————————————————————————————————————————————————————————————————————————————
php-fpm.conf 示例文件
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
listen.backlog = 2048
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 50
request_terminate_timeout = 900
request_slowlog_timeout = 100
slowlog = var/log/slow.log
文章来源:微笔记_博客