版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、mod_php VS mod_fastcgi目录什么是 MOD_PH和 MOD_FASTCGI 1工作原理 2MOD_PHP. 2MOD_FASTCGI 3MOD_FACTCGt三种配置方式 4静态配置 5动态配置 5远程方式 6PHP-FPM 6性能测试 8名称解释 8测试内容 8测试结果 8FASTCGI配置项对性能的影响。 11分析&结论 13附录 14APACHE+MOD_FASTCGI+PH建 14什么是 mod_php 和 mod_fastcgi在 lamp 体系中,对于 apache 端 php 的配置,我们最常用的就是 mod_php, 它 把PHP故为APACH一个内
2、置模块。让即ache http服务器本身能够支持PHP语 言,不需要每一个请求就启动 PHPW释器来解释PHP和把webserver与php绑定起来的方式不同,fastcgi是HTTP!艮务器与你的 或其它机器上的程序进行“交谈”的一种工具, 相当于一个程序接口。 它可以接 受来自 web 服务器的请求,解释输入信息,将处理后的结果返回给服务器 (apache,lighty 等)。mod_fastcgi 就是在 apache 下支持 fastcgi 协议的模块。工作原理在介绍这两种模式的工作原理前,我们先了解一下php的架构* Modular Code图1 php架构图上面是php的架构图,从
3、图上可以看到,SAPI提供了一个和外部通信的接 口,使得PHF可以和其他应用进行交互数据。php默认提供了很多种SAPI,常见 的给即ache的mod_php5 CGI,给IIS的ISAPI,还有Shell的CLI。对于一个 基于apache的php应用,其运行流程可以简单归结如下apache -> httpd -> mod_phpfastcgi -> sapi -> php我们下面提到的两种工作方式就分别用到了mod_php5和cgi的sapi 。mod_phpmod_php是在lamp体系中最常使用的工作方式,在这种模式下,php被编译 为apache的一个内置模块
4、,在启动时加载。当有一个 php请求过来时,直接在 httpd进程里完成php的解释运行,将结果返回。在php的sapi中,有这样一个函数:sapi_cgibin_ub_write, 这个函数告 诉了 Ze nd,如何输出数据。查看mod_php的sapi源码,我们会发现,这个函数 直接调用了 即ache的ap_rwrite函数。所以,用 mod_php我们可以把php和 即ache看做一个模块,两者绑定在一起。其工作原理如下图所示图2 mod_php工作原理mod_fastcgi在说明fastcgi之前,先了解一下普通cgi的工作流程:web server收到用户请求,并把请求提交给 cgi
5、程序,cgi程序根据请求提 交的参数作应处理,然后输出标准的 html语句返回给web server,web server 再返回给客户端,这就是普通 cgi的工作原理。fastcgi 是基于cgi架构的扩展,他的核心思想就是在web server和具体cgi程序之间建立一个智能的可持续的中间层,统管cgi程序的运行,这样webserver只需要将请求提交给这个层,这个层再派生出几个可复用的cgi程序实例,然后再把请求分发给这些实例,这些实例是可控的,可持续,可复用的,因 此一方面避免了进程反复fork,另一方面又可以通过中间层的控制和探测机制 来监视这些实例的运行情况,根据不同的状况fork
6、或者回收实例,达到灵活性 和稳定性兼得的目的。modFastCGI的主要优点是把动态语言和 web server分离 开来。这种技术允许把 web server和动态语言运行在不同的主机上,以大规模 扩展和改进安全性而不损失生产效率。基于mod_fastcgi方式的php应用,其典型工作流程如下图3 mod_fastcgi 工作原理从图上可以看出,apache启动后,mod_fastcgi会在启动多个cgi程序, 也就是php-cgi脚本。具体脚本的数目通过配置来指定。当有http请求到来后,httpd进程会选择一个当前空闲的一个php-cgi程序来执行,执行的方式和mod_php类似,也是通
7、过php-cgi提供的sapi完成交互。查看源码,可以发现 对于cgi的sapi,和mod_php不同,它是把结果输出到 fastcgi提供的stdout 上, fastcgi再将数据返回给httpd完成交互。mod_factcgi的三种配置方式基于mod_fastcgi的fastcgi应用一共有三种配置方式:静态、动态和远程。 他们通过apache配置中的伪指令来代替,对应于三种方式的伪指令分别是 FastCgiServer, FastCgiC on fig,以及 FastCgiExter nalServer 。对于静态和动态这两种方式,apache将通过mod_fastcgi自带的进程管理
8、工 具(fcgi-pm) 来管理fastcgi 应用程序,也就是 php-cgi 。fcgi-pm 在apache启 动时就被自动激活了。相对于前两种,远程模式下, php-cgi不由fcgi-pm来管 理,即ache不会去关心php-cgi程序的状态。面详细说一下三种配置方式静态配置通过 FastCGIServer 伪指令将文件名定义为静态 FastCGI 应用程序。初始 时需要指定启动的 php-cgi 进程数目,默认为 1 个。 apache 运行过程中,如果 静态应用程序实例因为任何原因死了,那么 fcgi-pm 将衍生另一个实例来替换。语法 FastCgiServer file na
9、me options重要参数说明idle-timeout n (30 秒)。在请求异常终止和事件记录在 error LogLevel 前,所允许的 FastCGI 应用程序不活动秒数。 仅当存在与 FastCGI 应用程序的 暂挂连接时,该不活动计时器才应用。 如果应用程序在此期间不响应队列的请求, 那么请求异常终止。如果与应用程序的通信完成, 但是与客户机的通信未完成 (缓 存的响应),那么超时不应用。processes n (1)。在服务器初始化时衍生的应用程序实例数。port n 无。应用程序用于与 Web 服务器通信的 TCP 端口号( 1-65535 )。 此选项使应用程序可以从网络
10、中的其他机器访问。 -socket 选项和 -port 选项 是互斥的。socket filename unix sock 文件名Restart-delay n(5 秒)。此应用程序的失败实例重新衍生之间的最小秒数。 此延迟阻止中断的应用程序使用过多系统资源。动态配置在静态配置中,我们初始就指定了要启动的 php 进程数。和静态的相反,动 态应用程序根据需求启动。 php 应用实例的数目根据当前 http 请求数目动态变 化,进程的管理也是通过 fcgi-pm 来完成。语法 FastCgiConfig option option .重要参数说明和静态方式相比,动态配置的参数主要增加了以下几个m
11、axProcesses n 在任何时候允许运行的最大动态 FastCGI 应用程序实例 数。minProcesses n 任何时候允许运行,且无须由 fcgi-pm (因没有需求)杀死 的最小动态 FastCGI 应用程序实例数。在 dyn 模式下,因为 fastcgi 实例数目是动态改变的。所以没有静态方式中 process 这个参数远程方式这种模式下,fastcgi实例和apache分离开来,这两者可以分开来部署。他 们之间的通信通过tcp或者unix sock来完成。使用ext方式,fastcgi实例将 不会由fcgi-pm来管理,而是独立的运行。语法 -FastCgiExternalS
12、erver 文件名 -host 主机名端口 -appC onn Timeout nFastCgiExternalServer 文件名-socket 文件名-appConnTimeout n 重要参数说明idle-timeout n (30秒) 在请求异常终止,并且事件记录之前,允许 FastCGI应用程序保持不活动的秒数。只有当与FastCGI应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的 通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。host host:p
13、ort应用程序用于与Web服务器通信的主机名或 IP地址和TCP端口号(1-65535)。-socket 和-host 选项是互斥的。socket 文件名无应用程序用于与 Web服务器通信的UNIX域套接字的文件名。此文件名相 对于FastCgilpcDir 。 -socket和-port 选项是互斥的。php-fpm使用FastCGI,最主要优点是把应用和 web server(apache)分离开来。这样 允许把webserver和动态语言(php)运行在不同的主机上,以大规模扩展和改进 安全性而不损失效率。这样的情况下,对于php-cgi程序,由于从apache中分离出来,就需要一 个单
14、独的工具来对这些进程进行管理,在stc和dyn两种模式下,mod_fastcgi中自带的fcgi-pm会充当了这样的角色。可是,ext模式下却没有。我们只能通 过一个脚本静态的启动n个实例,一旦进程死掉,还需要手工重启。当然,你可 以使用supervise来管理这些进程,但是毕竟不那么灵活而且也仅仅一部份问 题。甚至于fcgi-pm,因为实现的原因,其本身也有很多问题,例如不太稳定, 压力下出core,无法平滑的完成切换等。基于上述的原因,我们需要一个稳定可靠的进程管理工具,就像lighty下的spwn-cgi。幸运的是,出现了 php-fpm。它是一个类似于spwn-cgi的管理工 具,可以
15、和任何支持远端 FastCGI的web server工作。在官方的手册上,列举 了以下php-fpm所具有的特性:特性Php自带的Spwn-cgiPhp-fpmphp守护程序:pidfile, log file, setsid(), setuid(),setgid(),chroot()(-)(-)(+)进程控制,可以平滑地 重启、重新载入配置和 一进制模块而不丢失 请求Php4 (-)Php5只能平滑停止(-)(+)限制ip地址,可以满足web server的要求php4 (-)php5.2.2 >(+)(-)(+)如果使用优化器,在遇 到opcode缓存随机损 坏的时候紧急重启所 有进
16、程(-)(-)(+)使用用不同的uid / gid / chroot / 环境变量, 不同的php.ini选项, 不需要safe mode(-)(-)(+)记录 work process 的stdout 和口 stderr(-)(-)(+)如果 set_time_limit 没 有起作用,强制结束过 期进程(-)(-)(+)特色功能 Error header 、优化的上传支持、fastcgi_finish_request() 另外,php-fpm还可以兼容zend Optimize,各种缓存优化器。Php-fpm的安装Php-fpm是以patch的方式安装的,如果要使用它,你必须在安装php前
17、打上这个补丁。eg:gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1在 con figure 时加上一en able-fpm 选项。安装完php后,会有以下几个文件$prefix/ext/php-fpm.co nf$prefix/log/php-fp m.log$prefix/log/php-fpm.pid其中php-fpm.conf是配置文件,具体如何配置文件里有非常详尽的注释。 最后,执行./bin/php-cgi -pm &就可以了。另外,你也可以使用$prexif/sbin/php-fpm脚本来方便的维护
18、。性能测试名称解释abapache 自测的性能测试工具,主要用于测试极限压力:对于同一url 每秒所能执行的次数及响应时间。myabbaidu开发的压力测试工具,区别于ab,其更主要的功能是测试指定压力条件下 机器的负载情况。eacc一种 php 加速器,主要是将 php 程序编译后的结果缓存起来。加速 php 的执行, 对性能有很大幅度的提升 ,更详细的情况可以参见另一篇关于 php 缓存优化的 文档 缓存优化工具 -php 加速的利器etc、stc、dynmod_fastcgi 运行的模式,分别指远程、静态和动态模式测试内容测试中我们将针对不同的运行模式和页面类型进行极限压力测试及机器负载
19、测 试。同时,我们还将测试使用缓存优化和不使用缓存优化下机器的表现情况。 另 外,由于我们的测试主要是对比两种模式的性能差别, 因此对于机器的硬件配置 不是特别敏感,测试的时候只需要保证机器负载为 0 即可。测试结果最简单的 php 页面压力工具: mysql 压力情况:每秒 1000 次请求,并发数 70 性能指标: cpu idle不同模式下机器 idle 情况如下图普通模式使用缓存优化图4最简单php页面,1000/s请求idle 情况从图上我们可以看出,测试最简单的 php页面时,各种模式下性能几乎没有 差别,且由于页面非常简单,eacc的效果也基本没有。复杂的php程序(2000行代
20、码+)压力工具:mysql压力情况:每秒400次请求,并发数70性能指标:cpu idle测试结果如下图下适应缓存优化使用的优图5复杂的php代码,400/s压力idle情况从图上可以看出,在php代码复杂的情况下,前面4中模式性能差别不大, mod_php略优,然后fastcgi动态配置的方式在此情况下性能差距非常之大,idle 直接降为0,同时虽然每秒是400次的压力,其只能处理200次左右的请求。 由于php代码很复杂,eacc的作用明显体现出来,使用缓存优化后性能提升一 倍以上。另外,还可以看出,eacc这样的缓存优化工具对于 mod_php和fastcgi方式 起到的作用基本相同,他
21、们之间的性能差异和使用前维持相同。在上述情况下,如果不适应fpm,fastcgi模式会出core,主要原因还在在于 进程管理的问题。实际项目中的php程序这里我们采用群组项目中的pb页面,涉及到和数据库交互,db交互2次 db部署在其他机器,每次请求耗时 50ms左右。压力工具:mysql压力情况:每秒400次请求,并发数70性能指标:cpu idle测试结果如下sock下适应缰存优化使用的(X图6实际的php页面,400/s压力idle情况从图上可以看出,性能的情况和图 2类似,各种模式的差距仍然不大极限压力测试压力工具:ab测试参数:并发请求数100,总次数10000次测试页面:pb页面性
22、能指标:每秒请求数rps下使用缓存优化使用的优图7极限压力测试pb页面从上图我们可以看到,极限压力下,使用eacc后,mod_php和ext(fpm)基本差不多,保持在860/s左右的水平,而使用fpm方式进行管理的模式略优于其他 两种fastcgi模式。测试中发现,fastcgi模式下,不使用php-fpm管理的话,仍然会有core出现。fastcgi配置项对性能的影响。在mod_fastcgi下,不管是ext还是stc方式,有一个配置项是非常关键的:默认启动的 php-cgi进程实例数从fastcgi原理可以看出,当有一个httpd进程到来时,它需要调用fastcgi server来执行,
23、 如果此时所有server都出于服务状态,则这个 httpd进程将出于等待状态得不到服务,导致 请求无法响应。对pb页面进行测试,配置不同的实例数目进行极限压力测试,得到结果如下图8 fastcgi实例数对性能的影响分析一下这个原因:我们的pb页面执行时间是50ms也就是说一个php-cgi程序在1s内可以处 理的请求数目是1000/50 = 20。假设启动的实例数目是n,则1s内最多能完成 的请求数为n *20,从图上可以看出,实际结果符合我们的计算。另外,这个数 值也不是无限增大了,当n*20大于server本身所能承受的极限时,rps也不会 继续往上增长了。所以,使用fastcgi,对于
24、n的选择,要综合页面平均处理时间,最大压力 等多种因素结合来配置。同时,在 ext方式下,webserver和fastcgi server 交互的方式有两种:通 过tcp或者unix sock。测试一下这两种方式的情况使用myab每秒400次请求pb页面,机器idle90807060tcp下使用缰存优化使用凹比50403020unix sock100图 9 ext 下 unix sock 和 tcp 的区别从图上可以看出,不管是否使用 eacc,tcp 方式的 idle 都有一个百分点的 下降,这个差异主要是因为多了 tcp 连接过程造成的。分析 &结论根据各种测试结果,可以看出和fa
25、stcgi方式相比,mod_php的性能在各种情 况下都稍优,这种 差 异主要 是 在于后 一种方式增 加了一 次数据交互 过程 php->fascgi->apache但是这个差距并不大,在使用了eacc等缓存优化工具后,性能有了很大提升。他们之间的差距完全不是瓶颈。从使用的角度来说, fastcgi 具有以下优点:1. webserver和php程序分离,两者可以部署在不同的地方,通过socket方式 通信带来一定安全性2. 使用fastcgi,在出现问题时可以更好的定位是 webserver还是php的原因3. fastcgi方式不依赖于 webserver,更加灵活,扩展性也
26、更好4. fastcgi本身会有一些进程监控和日志记录,更便于分析问题,跟踪状态。5. 灵活多样的配置,可以根据实际的应用进行合理配置达到最佳效果。当然 fastcgi 也有一些缺点1. mod_fastcgi在进程管理上有一些问题,容易出core。这个问题通过使用 php-fpm 可以解决2. 由于fastcgi应用单独分离出来,因此需要单独监控进程的状态。防止进程挂 掉后导致服务出现问题,这个可以通过使用用supervise管理一定程度上避免 这个问题。3. 文档相对缺乏, mod_fastcgi 对 apache 的支持也不是特别好,且基本没有升 级。关于fastcgi运行方式的选择,从
27、效率、稳定性等各方面来说,ext方式是最佳 选择了。而且考虑到我们可能会将 webserver和php分开到不同机器,选择远程 方式也是必须的。进程管理工具, 从各方面来说, php-fpm 是最优选择了, 即时使用 lighty 作用 web server,也完全可以用它代替 spw n-cgi。综合测试结果和上述分析,我们完全可以采用fastcgi代替传统的mod_php。推荐使用下面的组合方式apache + ext + php-fpm(with superwise)如果webserver和fastcgi部署在同一机器上,使用unix sock方式通信,否则使用 tcp 方式。附录apa
28、che+mod_fastcgi+php搭建php mod_fastcgi 的搭建主要有三种方式 stc、ext和dyn,不管是哪种方式,首先在安装php的时候需要加上如下选项-enable-fastcgi,并且不能使用 一with-apxs。 以下是一个配置 php 例子./configure -prefix=/home/club/hongdk/env/php5.26-fcgi/ -enable-trace-vars -with-zlib-dir=/home/club/hongdk/tool/zlib/ -with-mysql=/home/club/hongdk/env/mysql5 / -w
29、ith-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 -with-config-file-path=/home/club/hongdk/env/php5.26-fcgi/ -enable-xml -with-dom=/home/club/hong
30、dk/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-cgi -/,如果看到PHP 5.2.5 (cgi-fcg)i (built: Nov 12 2008 20:44:08)Copyright (c) 1997-2007 The PHP GroupZend Engine v2.2.0,
31、 Copyright (c) 1998-2007 Zend Technologies就表明安装成功了mod_fastcgicd mod_fastcgi-2.4.6cp Makefile.AP2 Makefilevi Makefile修改 top_dir 为 apache 安装目录 makemake installapache 配置修改 httpd.conf 首先增加 LoadModule fastcgi_module modules/mod_fastcgi.so然后根据不同的运行模式进行配置eg ext 模式 <IfModule mod_fastcgi.c>FastCgiExter
32、nalServer $php-server -socket /home/club/fastcgi.sockScriptAlias /cgi-bin/ "/home/club/hongdk/env/apache-fcgi/cgi-bin/" AddHandler php-fastcgi .phpAction php-fastcgi /cgi-bin/php-cgiAddType application/x-httpd-php .php</IfModule>其中 $php-sever 为 php-cgi 程序 ,例如 /home/club/hongdk/env/apach
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年急诊急性肺含铁血黄素沉着症
- 环保设施运营维护与管理手册
- 靶向药物科普宣教
- 销售学题库及答案
- 消防证题库及答案
- 消毒相关知识题库及答案
- 宪法试卷及答案
- 咖啡师春节假期安全告知书
- 企业品牌推广效果跟踪手册
- 口腔设备组装调试工春节假期安全告知书
- 2025届北京市西城区北京四中高考英语二模试卷含答案
- 2024压力容器设计审批考试题库 判断题
- 客运春运安全培训
- 2025年太原铁路局招聘笔试参考题库含答案解析
- CHB-系列温控仪表说明书
- 《植物生产与环境》第二章:植物生产与光照
- 短链脂肪酸在肠内营养中的影响
- 春秋战国的服饰文化课件
- 单值-移动极差控制图(自动版)
- 《GNSS基础知识》课件
- 第7课-离子推进技术(推力器)
评论
0/150
提交评论