[好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据_第1页
[好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据_第2页
[好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据_第3页
[好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据_第4页
[好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mod_phpVSmod_fastcgi目录什么是MOD_PH和MOD_FASTCGl1工作原理2MODPHP2MODFASTCGI3MOD_FACTCGI三种配置方式4静态配置5动态配置5远程方式6PHP-FPM6性能测试8名称解释8测试内容8测试结果8FASTCGI配置项对性能的影响。11分析&吉论13附录14APACHE+MOD_FASTCGI+PHP14什么是mod_php和mod_fastcgi在lamp体系中,对于apache端php的配置,我们最常用的就是mod_php,它把PHP(故为APACHE个内置模块。让apachehttp服务器本身能够支持PHPi§言

2、,不需要每一个请求就启动PHP单释器来解释PHP和把webserver与php绑定起来的方式不同,fastcgi是HTTP®务器与你的或其它机器上的程序进行“交谈”的一种工具,相当于一个程序接口。它可以接受来自web服务器的请求,解释输入信息,将处理后的结果返回给服务器(apache,lighty等)。mod_fastcgi就是在apache下支持fastcgi协议的模块。工作原理在介绍这两种模式的工作原理前,我们先了解一下php的架构*ModularCode图1php架构图上面是php的架构图,从图上可以看到,SAPI提供了一个和外部通信的接口,使得PHFW以和其他应用进行交互数据

3、。php默认提供了很多种SAPI,常见的给apache的mod_php5CGI,七&IIS的ISAPI,还有Shell的CLI。对于一个基于apache的php应用,其运行流程可以简单归结如下apache->httpd->mod_phpfastcgi->sapi->php我们下面提到的两种工作方式就分别用到了mod_php琲口cgi的sapi。mod_phpmod_phpH在lamp体系中最常使用的工作方式,在这种模式下,php被编译为apache向一个内置模块,在启动时加载。当有一个php请求过来日,直接在httpd进程里完成php的解释运行,将结果返回。在p

4、hp的sapi中,有这样一个函数:sapi_cgibin_ub_write,这个函数告诉了Zend,如何输出数据。查看mod_php的sapi源码,我们会发现,这个函数直接调用了apache的ap_rwrite函数。所以,用mod_php我们可以把php和apache看做一个模块,两者绑定在一起。其工作原理如下图所示图2mod_php工作原理mod_fastcgi在说明fastcgi之前,先了解一下普通cgi的工作流程:webserver收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作应处理,然后输出标准的html语句返回给webserver,webserver再返回给客

5、户端,这就是普通cgi的工作原理。fastcgi是基于cgi架构的扩展,他的核心思想就是在webserver和具体cgi程序之间建立一个智能的可持续的中间层,统管cgi程序的运行,这样webserver只需要将请求提交给这个层,这个层再派生出几个可复用的cgi程序实例,然后再把请求分发给这些实例,这些实例是可控的,可持续,可复用的,因此一方面避免了进程反复fork,另一方面又可以通过中间层的控制和探测机制来监视这些实例的运行情况,根据不同的状况fork或者回收实例,达到灵活性和稳定性兼得的目的。modFastCGI的主要优点是把动态语言和webserver分离开来。这种技术允许把webserv

6、er和动态语言运行在不同的主机上,以大规模扩展和改进安全性而不损失生产效率。基于mod_fastcgi方式的php应用,具典型工作流程如下图3mod_fastcgi工作原理从图上可以看出,apache启动后,mod_fastcgi会在启动多个cgi程序,也就是php-cgi脚本。具体脚本的数目通过配置来指定。当有http请求到来后,httpd进程会选择一个当前空闲的一个php-cgi程序来执行,执行的方式和mod_ph睽似,也是通过php-cgi提供的sapi完成交互。查看源码,可以发现对于cgi的sapi,和mod_ph/同,它是把结果输出到fastcgi提供的stdout上,fastcgi

7、再将数据返回给httpd完成交互。mod_factcgi的三种配置方式基于mod_fastcgi的fastcgi应用一共有三种配置方式:静态、动态和远程。他们通过apOche配置中的伪指令来代替,对应于三种方式的伪指令分别是FastCgiServer,FastCgiConfig,以及FastCgiExternalServer。对于静态和动态这两种方式,apache将通过mod_fastcgi自带的进程管理工具(fcgi-pm)来管理fastcgi应用程序,也就是php-cgi。fcgi-pm在apache启动时就被自动激活了。相对于前两种,远程模式下,php-cgi不由fcgi-pm来管理,a

8、pache不会去关心php-cgi程序的状态。卜面详细说一下三种配置方式静态配置通过FastCGIServer伪指令将文件名定义为静态FastCGI应用程序。初始时需要指定启动的php-cgi进程数目,默认为1个。apache运行过程中,如果静态应用程序实例因为任何原因死了,那么fcgi-pm将衍生另一个实例来替换。语法FastCgiServerfilenameoptions重要参数说明idle-timeoutn(30秒)。在请求异常终止和事件记录在errorLogLevel前,所允许的FastCGI应用程序不活动秒数。仅当存在与FastCGI应用程序的暂挂连接时,该不活动计时器才应用。如果应

9、用程序在此期间不响应队列的请求,那么请求异常终止。如果与应用程序的通信完成,但是与客户机的通信未完成(缓存的响应),那么超时不应用。processesn(1)0在服务器初始化时衍生的应用程序实例数。portn无。应用程序用于与Web服务器通信的TCP端口号(1-65535)。此选项使应用程序可以从网络中的其他机器访问。-socket选项和-port选项是互斥的。socketfilenameunixsock文件名Restart-delayn(5秒)。此应用程序的失败实例重新衍生之间的最小秒数。此延迟阻止中断的应用程序使用过多系统资源。动态配置在静态配置中,我们初始就指定了要启动的php进程数。和

10、静态的相反,动态应用程序根据需求启动。php应用实例的数目根据当前http请求数目动态变化,进程的管理也是通过fcgi-pm来完成。语法FastCgiConfigoptionoption重要参数说明和静态方式相比,动态配置的参数主要增加了以下几个maxProcessesn在任何时候允许运行的最大动态FastCGI应用程序实例数。minProcessesn任何时候允许运行,且无须由fcgi-pm(因没有需求)杀死的最小动态FastCGI应用程序实例数。在dyn模式下,因为fastcgi实例数目是动态改变的。所以没有静态方式中process这个参数远程方式这种模式下,fastcgi实例和apach

11、e分离开来,这两者可以分开来部署。他们之间的通信通过tcp或者unixsock来完成。使用ext方式,fastcgi实例将不会由fcgi-pm来管理,而是独立的运行。语法-FastCgiExternalServer文件名-host主机名端口-appConnTimeoutnFastCgiExternalServer文件名-socket文件名-appConnTimeoutn重要参数说明idle-timeoutn(30秒)在请求异常终止,并且事件记录之前,允许FastCGI应用程序保持不活动的秒数。只有当与FastCGI应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此

12、应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。hosthost:port应用程序用于与Web服务器通信的主机名或IP地址和TCP端口号(1-65535)。-socket和-host选项是互斥的。socket文件名无应用程序用于与Web服务器通信的UNIX域套接字的文件名。此文件名相对于FastCgiIpcDir。-socket和-port选项是互斥的。php-fpm使用FastCGI,最主要优点是把应用和webserver(apache)分离开来。这样允许把webserver和动态语言(ph

13、p)运行在不同的主机上,以大规模扩展和改进安全性而不损失效率。这样的情况下,对于php-cgi程序,由于从apache中分离出来,就需要一个单独的工具来对这些进程进行管理,在stc和dyn两种模式下,mod_fastcgi中自带的fcgi-pm会充当了这样的角色。可是,ext模式下却没有。我们入能通过一个脚本静态的启动n个实例,一旦进程死掉,还需要手工重启。当然,你可以使用supervise来管理这些进程,但是毕竟不那么灵活而且也仅仅一部份问题。甚至于fcgi-pm,因为实现的原因,其本身也有很多问题,例如不太稳定,压力下出core,无法平滑的完成切换等。基于上述的原因,我们需要一个稳定可靠的

14、进程管理工具,就像lighty下的spwn-cgi。幸运的是,出现了php-fpm。它是一个类似于spwn-cgi的管理工具,可以和任何支持远端FastCGI的webserver工作。在官方的手册上,列举了以下php-fpm所具有的特性:特性Php自带的Spwn-cgiPhp-fpmphp守护程序:pidfile,logfile,setsid(),setuid(),setgid(),chroot()(-)(-)(+)进程控制,可以平滑地重启、重新载入配置和二进制模块而不丢失请求Php4(-)Php5只能平滑停止(-)(+)限制ip地址,可以满足webserver的要求php4(-)php5.2

15、.2>(+)(-)(+)如果使用优化器,在遇到opcode缓存随机损坏的时候紧急重启所有进程(-)(-)(+)使用用不同的uid/gid/chroot/环境变量,不同的php.ini选项,不需要safemode(-)(-)(+)记录workprocess的stdout和stderr(-)(-)(+)如果set_time_limit没有起作用,强制结束过期进程(-)(-)(+)特色功能Errorheader、优化的上传支持、fastcgi_finish_request()另外,php-fpm还可以兼容zendOptimize,各种缓存优化器。Php-fpm的安装Php-fpm是以patch

16、的方式安装的,如果要使用它,你必须在安装php前打上这个补丁。eg:gzip-cdphp-5.2.6-fpm-0.5.9.diff.gz|patch-dphp-5.2.6-p1在configure时力口上enable-fpm选项。安装完php后,会有以下几个文件$pre日x/ext/php-fpm.conf$pre巾x/log/php-fpm.log$prefix/log/php-fpm.pid其中php-fpm.conf是配置文件,具体如何配置文件里有非常详尽的注释。最后,执行./bin/php-cgifpm&就可以了。另外,你也可以使用$prexif/sbin/php-fpm脚本来

17、方便的维护。性能测试名称解释abapache自测的性能测试工具,主要用于测试极限压力:对于同一url每秒所能执行的次数及响应时间。myabbaidu开发的压力测试工具,区别于ab,其更主要的功能是测试指定压力条件下机器的负载情况。eacc一种php加速器,主要是将php程序编译后的结果缓存起来。加速php的执行,对性能有很大幅度的提升,更详细的情况可以参见另一篇关于php缓存优化的文档缓存优化工具-php加速的利器etc、stc、dynmod_fastcgi运行的模式,分别指远程、静态和动态模式测试内容测试中我们将针对不同的运行模式和页面类型进行极限压力测试及机器负载测试。同时,我们还将测试使

18、用缓存优化和不使用缓存优化下机器的表现情况。另外,由于我们的测试主要是对比两种模式的性能差别,因此对于机器的硬件配置不是特别敏感,测试的时候只需要保证机器负载为0即可。测试结果最简单的php页面压力工具:mysql压力情况:每秒1000次请求,并发数70性能指标:cpuidle不同模式下机器idle情况如下图socktcpraw图4最简单php页面,1000/s请求idle情况从图上我们可以看出,测试最简单的php页面时,各种模式下性能几乎没有差别,且由于页面非常简单,eacc的效果也基本没有。复杂的php程序(2000行代码+)压力工具:mysql压力情况:每秒400次请求,并发数70性能指

19、标:cpuidle测试结果如下图图5复杂的php代码,400/s压力idle情况从图上可以看出,在php代码复杂的情况下,前面4中模式性能差别不大,mod_php略优,然后fastcgi动态配置的方式在此情况下性能差距非常之大,idle直接标为0,同时虽然每秒是400次的压力,其只能处理200次左右的请求。由于php代码很复杂,eacc的作用明显体现出来,使用缓存优化后性能提升一倍以上。另外,还可以看出,eacc这样的缓存优化工具对于mod_php和fastcgi方式起到的作用基本相同,他们之间的性能差异和使用前维持相同。在上述情况下,如果不适应fpm,fastcgi模式会出core,主要原因

20、还在在于进程管理的问题。实际项目中的php程序这里我们采用群组项目中的pb页面,涉及到和数据库交互,db交互2次db部署在其他机器,每次请求耗时50ms左右。压力工具:mysql压力情况:每秒400次请求,并发数70性能指标:cpuidle测试结果如下图6实际的php页面,400/s压力idle情况从图上可以看出,性能的情况和图2类似,各种模式的差距仍然不大极限压力测试压力工具:ab测试参数:并发请求数100,总次数10000次。测试页面:pb页面性能指标:每秒请求数rps图7极限压力测试pb页面从上图我们可以看到,极限压力下,使用eacc后,mod_php和ext(fpm)基本差不多,保持在

21、860/s左右的水平,而使用fpm方式进行管加的模式略优于其他两种fastcgi模式。测试中发现,fastcgi模式下,不使用php-fpm管理的话,仍然会有core出现。fastcgi配置项对性能的影响。在mod_fastcgi下,不管是ext还是stc方式,有一个配置项是非常关键的:默认启动的php-cgi进程实例数从fastcgi原理可以看出,当有一个httpd进程到来时,它需要调用fastcgiserver来执行,如果此时所有server都出于服务状态,则这个httpd进程将出于等待状态得不到服务,导致请求无法响应。对pb页面进行测试,配置不同的实例数目进行极限压力测试,得到结果如下r

22、ps图8fastcgi实例数对性能的影响分析一下这个原因:我们的pb页面执行时间是50m6也就是说一个php-cgi程序在1s内可以处理的请求数目是1000/50=20。假设启动的实例数目是n,则1s内最多能完成的请求数为n*20,从图上可以看出,实际结果符合我们的计算。另外,这个数值也不是无限增大了,当n*20大于server本身所能承受的极限时,rps也不会继续往上增长了。所以,使用fastcgi,对于n的选择,要综合页面平均处理时间,最大压力等多种因素结合来配置。同时,在ext方式下,webserver和fastcgiserver交互的方式有两种:通过tcp或者unixsock。测试一下

23、这两种方式的情况使用myab$秒400次请求pb页面,机器idle图9ext下unixsock和tcp的区别从图上可以看出,不管是否使用eacc,tcp方式的idle都有一个百分点的下降,这个差异主要是因为多了tcp连接过程造成的。分析&结论根据各种测试结果,可以看出和fastcgi方式相比,mod_php的性能在各种情况下都稍优,这种差异主要是在于后一种方式增加了一次数据交互过程php->fascgi->apache但是这个差距并不大,在使用了eacc等缓存优化工具后,性能有了很大提升。他们之间的差距完全不是瓶颈。从使用的角度来说,fastcgi具有以下优点:1. web

24、server和php程序分离,两者可以部署在不同的地方,通过socket方式通信带来一定安全性2. 使用fastcgi,在出现问题时可以更好的定位是webserver还是php的原因3. fastcgi方式不依赖于webserver,更加灵活,扩展性也更好4. fastcgi本身会有一些进程监控和日志记录,更便于分析问题,跟踪状态。5. 灵活多样的配置,可以根据实际的应用进行合理配置达到最佳效果。当然fastcgi也有一些缺点1 .mod_fastcgi在进程管理上有一些问题,容易出core。这个问题通过使用php-fpm可以解决2 .由于fastcgi应用单独分离出来,因此需要单独监控进程的

25、状态。防止进程挂掉后导致服务出现问题,这个可以通过使用用supervise管理一定程度上避免这个问题。3 .文档相对缺乏,mod_fastcgi对apache的支持也不是特别好,且基本没有升级。关于fastcgi运行方式的选择,从效率、稳定性等各方面来说,ext方式是最佳选择了。而且考虑到我们可能会将webserver和php分开到不同机器,选择远程方式也是必须的。进程管理工具,从各方面来说,php-fpm是最优选择了,即时使用lighty作用webserver,也完全可以用它代替spwn-cgi。综合测试结果和上述分析,我们完全可以采用fastcgi代替传统的mod_php。推荐使用下面的组

26、合方式apache+ext+php-fpm(withsuperwise)如果webserver和fastcgi部署在同一机器上,使用unixsock方式通信,否则使用tcp方式。附录apache+mod_fastcgi+ph嘴建phpmod_fastcgi的搭建主要有三种方式stc、ext和dyn,不管是哪种方式,首先在安装php的时候需要加上如下选项-enable-fastcgi,并且不能使用一with-apxs。以下是一个配置php例子./configure-prefix=/home/club/hongdk/env/php5.26-fcgi/-enable-trace-vars- -wit

27、h-zlib-dir=/home/club/hongdk/tool/zlib/- -with-mysql=/home/club/hongdk/env/mysql5/- -with-mysqli=/home/club/hongdk/env/mysql5/bin/mysql_config- -with-gettext- -with-iconv- -enable-mbstring=gbk- -with-xmlrpc- -enable-safe-mode- -enable-sockets- -enable-url-fopen-wrapper- -enable-ftp- -enable-shmop-wi

28、th-config-file-path=/home/club/hongdk/env/php5.26-fcgi/- -enable-xml- -with-dom=/home/club/hongdk/tool/libxml/- -with-libxml-dir=/home/club/hongdk/tool/libxml/- -with-curl=/home/club/hongdk/tool/curl- -with-curlwrappers- -enable-fastcgi在安装完后,会在php的bin目录下找到如下文件php-cgi执行./php-cgim如果看到PHP5.2.5(cgi-fcg)

29、(built:Nov12200820:44:08)Copyright(c)1997-2007ThePHPGroupZendEnginev2.2.0,Copyright(c)1998-2007ZendTechnologies就表明安装成功了mod_fastcgicdmod_fastcgi-2.4.6cpMakefile.AP2MakefileviMakefile修改top_dir为apache安装目录makemakeinstallapache配置修改httpd.conf首先增加LoadModulefastcgi_modulemodules/mod_fastcgi.so然后根据不同的运行模式进行配

30、置egext模式<IfModulemod_fastcgi.c>FastCgiExternalServer$php-server-socket/home/club/fastcgi.sockScriptAlias/cgi-bin/"/home/club/hongdk/env/apache-fcgi/cgi-bin/"AddHandlerphp-fastcgi.phpActionphp-fastcgi/cgi-bin/php-cgiAddTypeapplication/x-httpd-php.php</IfModule>其中$php-sever为php-cgi程序,例如/home/club/hongdk/env/ap

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论