已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
mod php VS mod fastcgi 目录目录 什么是 MOD PHP 和 MOD FASTCGI 1 工作原理 1 MOD PHP 2 MOD FASTCGI 3 MOD FACTCGI 的三种配置方式 4 静态配置 5 动态配置 5 远程方式 6 PHP FPM 6 性能测试 8 名称解释 8 测试内容 8 测试结果 8 FASTCGI 配置项对性能的影响 11 分析 结论 13 附录 14 APACHE MOD FASTCGI PHP 搭建 14 什么是什么是 mod php 和和 mod fastcgi 在 lamp 体系中 对于 apache 端 php 的配置 我们最常用的就是 mod php 它把 PHP 做为 APACHE 一个内置模块 让 apache http 服务器本身能够支持 PHP 语言 不需要每一个请求就启动 PHP 解释器来解释 PHP 和把 webserver 与 php 绑定起来的方式不同 fastcgi 是 HTTP 服务器与你 的或其它机器上的程序进行 交谈 的一种工具 相当于一个程序接口 它可 以接受来自 web 服务器的请求 解释输入信息 将处理后的结果返回给服务器 apache lighty 等 mod fastcgi 就是在 apache 下支持 fastcgi 协议的模块 工作原理工作原理 在介绍这两种模式的工作原理前 我们先了解一下 php 的架构 图 1 php 架构图 上面是 php 的架构图 从图上可以看到 SAPI 提供了一个和外部通信的接 口 使得 PHP 可以和其他应用进行交互数据 php 默认提供了很多种 SAPI 常 见的给 apache 的 mod php5 CGI 给 IIS 的 ISAPI 还有 Shell 的 CLI 对于 一个基于 apache 的 php 应用 其运行流程可以简单归结如下 apacheapache httpdhttpd mod phpfastcgimod phpfastcgi sapisapi phpphp 我们下面提到的两种工作方式就分别用到了 mod php5 和 cgi 的 sapi mod php mod php 是在 lamp 体系中最常使用的工作方式 在这种模式下 php 被编 译为 apache 的一个内置模块 在启动时加载 当有一个 php 请求过来时 直接 在 httpd 进程里完成 php 的解释运行 将结果返回 在 php 的 sapi 中 有这样一个函数 sapi cgibin ub write 这个函数告 诉了 Zend 如何输出数据 查看 mod php 的 sapi 源码 我们会发现 这个函 数直接调用了 apache 的 ap rwrite 函数 所以 用 mod php 我们可以把 php 和 apache 看做一个模块 两者绑定在一起 其工作原理如下图所示 图 2 mod php 工作原理 mod fastcgi 在说明 fastcgi 之前 先了解一下普通 cgi 的工作流程 web server 收到用户请求 并把请求提交给 cgi 程序 cgi 程序根据请求 提交的参数作应处理 然后输出标准的 html 语句返回给 web server web server 再返回给客户端 这就是普通 cgi 的工作原理 fastcgi 是基于 cgi 架构的扩展 他的核心思想就是在 web server 和具体 cgi 程序之间建立一个智能的可持续的中间层 统管 cgi 程序的运行 这样 web server 只需要将请求提交给这个层 这个层再派生出几个可复用的 cgi 程序实 例 然后再把请求分发给这些实例 这些实例是可控的 可持续 可复用的 因此一方面避免了进程反复 fork 另一方面又可以通过中间层的控制和探测机 制来监视这些实例的运行情况 根据不同的状况 fork 或者回收实例 达到灵活 性和稳定性兼得的目的 modFastCGI 的主要优点是把动态语言和 web server 分离开来 这种技术允许把 web server 和动态语言运行在不同的主机上 以大 规模扩展和改进安全性而不损失生产效率 基于 mod fastcgi 方式的 php 应用 其典型工作流程如下 图 3 mod fastcgi 工作原理 从图上可以看出 apache 启动后 mod fastcgi 会在启动多个 cgi 程序 也就是 php cgi 脚本 具体脚本的数目通过配置来指定 当有 http 请求到来后 httpd 进程会选择一个当前空闲的一个 php cgi 程序来执行 执行的方式和 mod php 类似 也是通过 php cgi 提供的 sapi 完成交互 查看源码 可以发现 对于 cgi 的 sapi 和 mod php 不同 它是把结果输出到 fastcgi 提供的 stdout 上 fastcgi 再将数据返回给 httpd 完成交互 mod factcgi 的三种配置方式的三种配置方式 基于 mod fastcgi 的 fastcgi 应用一共有三种配置方式 静态 动态和远 程 他们通过 apache 配置中的伪指令来代替 对应于三种方式的伪指令分别是 FastCgiServer FastCgiConfig 以及 FastCgiExternalServer 对于静态和动态这两种方式 apache 将通过 mod fastcgi 自带的进程管理 工具 fcgi pm 来管理 fastcgi 应用程序 也就是 php cgi fcgi pm 在 apache 启动时就被自动激活了 相对于前两种 远程模式下 php cgi 不由 fcgi pm 来管理 apache 不会去关心 php cgi 程序的状态 下面详细说一下三种配置方式 静态配置静态配置 通过 FastCGIServer 伪指令将文件名定义为静态 FastCGI 应用程序 初始 时需要指定启动的 php cgi 进程数目 默认为 1 个 apache 运行过程中 如果 静态应用程序实例因为任何原因死了 那么 fcgi pm 将衍生另一个实例来替换 语法 FastCgiServer file name options 重要参数说明 idle timeoutidle timeout n n 30 秒 在请求异常终止和事件记录在 error LogLevel 前 所允许的 FastCGI 应用程序不活动秒数 仅当存在与 FastCGI 应用程序 的暂挂连接时 该不活动计时器才应用 如果应用程序在此期间不响应队列的 请求 那么请求异常终止 如果与应用程序的通信完成 但是与客户机的通信 未完成 缓存的响应 那么超时不应用 processesprocesses n n 1 在服务器初始化时衍生的应用程序实例数 portport n n 无 应用程序用于与 Web 服务器通信的 TCP 端口号 1 65535 此选项使应用程序可以从网络中的其他机器访问 socket 选项和 port 选项 是互斥的 socketsocket filename unix sock 文件名 Restart delayRestart delay n 5 秒 此应用程序的失败实例重新衍生之间的最小秒 数 此延迟阻止中断的应用程序使用过多系统资源 动态配置动态配置 在静态配置中 我们初始就指定了要启动的 php 进程数 和静态的相反 动态应用程序根据需求启动 php 应用实例的数目根据当前 http 请求数目动态 变化 进程的管理也是通过 fcgi pm 来完成 语法 FastCgiConfig option option 重要参数说明 和静态方式相比 动态配置的参数主要增加了以下几个 maxProcessesmaxProcesses n n 在任何时候允许运行的最大动态 FastCGI 应用程序实例 数 minProcessesminProcesses n n 任何时候允许运行 且无须由 fcgi pm 因没有需求 杀 死的最小动态 FastCGI 应用程序实例数 在 dyn 模式下 因为 fastcgi 实例数目是动态改变的 所以没有静态方式 中 process 这个参数 远程方式远程方式 这种模式下 fastcgi 实例和 apache 分离开来 这两者可以分开来部署 他们之间的通信通过 tcp 或者 unix sock 来完成 使用 ext 方式 fastcgi 实 例将不会由 fcgi pm 来管理 而是独立的运行 语法 FastCgiExternalServer 文件名 host 主机名端口 appConnTimeout n FastCgiExternalServer 文件名 socket 文件名 appConnTimeout n 重要参数说明 idle timeoutidle timeout n n 30 秒 在请求异常终止 并且事件记录之前 允许 FastCGI 应用程序保持不活动的秒数 只有当与 FastCGI 应用程序的连接暂挂 时 此不活动定时器才适用 如果请求进入应用程序的请求队列 而此应用程 序在此期间没有响应 通过写和刷新 则此请求将异常终止 如果与应用程序 的通信已完成 而与客户机的通信尚未完成 响应被高速缓存 则此超时不适 用 hosthost host porthost port 应用程序用于与 Web 服务器通信的主机名或 IP 地址和 TCP 端口号 1 65535 socket 和 host 选项是互斥的 socketsocket 文件名 无 应用程序用于与 Web 服务器通信的 UNIX 域套接字的文件名 此文件名相 对于 FastCgiIpcDir socket 和 port 选项是互斥的 php fpm 使用 FastCGI 最主要优点是把应用和 web server apache 分离开来 这 样允许把 web server 和动态语言 php 运行在不同的主机上 以大规模扩展和 改进安全性而不损失效率 这样的情况下 对于 php cgi 程序 由于从 apache 中分离出来 就需要一 个单独的工具来对这些进程进行管理 在 stc 和 dyn 两种模式下 mod fastcgi 中自带的 fcgi pm 会充当了这样的角色 可是 ext 模式下却没有 我们只能 通过一个脚本静态的启动 n 个实例 一旦进程死掉 还需要手工重启 当然 你可以使用 supervise 来管理这些进程 但是毕竟不那么灵活而且也仅仅一部 份问题 甚至于 fcgi pm 因为实现的原因 其本身也有很多问题 例如不太 稳定 压力下出 core 无法平滑的完成切换等 基于上述的原因 我们需要一个稳定可靠的进程管理工具 就像 lighty 下的 spwn cgi 幸运的是 出现了 php fpm 它是一个类似于 spwn cgi 的管理 工具 可以和任何支持远端 FastCGI 的 web server 工作 在官方的手册上 列 举了以下 php fpm 所具有的特性 特性Php 自带的Spwn cgiPhp fpm php 守护程序 pid file log file setsid setuid setgid chroot 进程控制 可以平滑 地重启 重新载入配 置和二进制模块而不 丢失请求 Php4 Php5 只能平滑停止 限制 ip 地址 可以满 足 web server 的要求 php4 php5 2 2 如果使用优化器 在 遇到 opcode 缓存随机 损坏的时候紧急重启 所有进程 使用用不同的 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 前打上 这个补丁 eg gzip cd php 5 2 6 fpm 0 5 9 diff gz patch d php 5 2 6 p1 在 configure 时加上 enable fpm 选项 安装完 php 后 会有以下几个文件 prefix ext php fpm conf prefix log php fpm log prefix log php fpm pid 其中 php fpm conf 是配置文件 具体如何配置文件里有非常详尽的注释 最后 执行 bin php cgi fpm 就可以了 另外 你也可以使用 prexif sbin php fpm 脚本来方便的维护 性能测试性能测试 名称解释名称解释 ab apache 自测的性能测试工具 主要用于测试极限压力 对于同一 url 每秒所能 执行的次数及响应时间 myab baidu 开发的压力测试工具 区别于 ab 其更主要的功能是测试指定压力条件 下机器的负载情况 eacc 一种 php 加速器 主要是将 php 程序编译后的结果缓存起来 加速 php 的执行 对性能有很大幅度的提升 更详细的情况可以参见另一篇关于 php 缓存优化的 文档 缓存优化工具 php 加速的利器 etc stc dyn mod fastcgi 运行的模式 分别指远程 静态和动态模式 测试内容测试内容 测试中我们将针对不同的运行模式和页面类型进行极限压力测试及机器负载测 试 同时 我们还将测试使用缓存优化和不使用缓存优化下机器的表现情况 另外 由于我们的测试主要是对比两种模式的性能差别 因此对于机器的硬件 配置不是特别敏感 测试的时候只需要保证机器负载为 0 即可 测试结果测试结果 最简单的 php 页面 压力工具 mysql 压力情况 每秒 1000 次请求 并发数 70 性能指标 cpu idle 不同模式下机器 idle 情况如下图 图 4 最简单 php 页面 1000 s 请求 idle 情况 从图上我们可以看出 测试最简单的 php 页面时 各种模式下性能几乎没 有差别 且由于页面非常简单 eacc 的效果也基本没有 复杂的 php 程序 2000 行代码 压力工具 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 方式 起到的作用基本相同 他们之间的性能差异和使用前维持相同 在上述情况下 如果不适应 fpm fastcgi 模式会出 core 主要原因还在在于 进程管理的问题 实际项目中的 php 程序 这里我们采用群组项目中的 pb 页面 涉及到和数据库交互 db 交互 2 次 db 部署在其他机器 每次请求耗时 50ms 左右 压力工具 mysql 压力情况 每秒 400 次请求 并发数 70 性能指标 cpu idle 测试结果如下 图 6 实际的 php 页面 400 s 压力 idle 情况 从图上可以看出 性能的情况和图 2 类似 各种模式的差距仍然不大 极限压力测试 压力工具 ab 测试参数 并发请求数 100 总次数 10000 次 测试页面 pb 页面 性能指标 每秒请求数 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 来执 行 如果此时所有 server 都出于服务状态 则这个 httpd 进程将出于等待状态得不到服务 导致请求无法响应 对 pb 页面进行测试 配置不同的实例数目进行极限压力测试 得到结果如下 图 8 fastcgi 实例数对性能的影响 分析一下这个原因 我们的 pb 页面执行时间是 50ms 也就是说一个 php cgi 程序在 1s 内可以 处理的请求数目是 1000 50 20 假设启动的实例数目是 n 则 1s 内最多能完 成的请求数为 n 20 从图上可以看出 实际结果符合我们的计算 另外 这个 数值也不是无限增大了 当 n 20 大于 server 本身所能承受的极限时 rps 也 不会继续往上增长了 所以 使用 fastcgi 对于 n 的选择 要综合页面平均处理时间 最大压力 等多种因素结合来配置 同时 在 ext 方式下 webserver 和 fastcgi server 交互的方式有两种 通过 tcp 或者 unix sock 测试一下这两种方式的情况 使用 myab 每秒 400 次请求 pb 页面 机器 idle 图 9 ext 下 unix sock 和 tcp 的区别 从图上可以看出 不管是否使用 eacc tcp 方式的 idle 都有一个百分点的 下降 这个差异主要是因为多了 tcp 连接过程造成的 分析分析 结论结论 根据各种测试结果 可以看出和 fastcgi 方式相比 mod php 的性能在各种 情况下都稍优 这种差异主要是在于后一种方式增加了一次数据交互过程 php fascgi apache 但是这个差距并不大 在使用了 eacc 等缓存优化工具后 性 能有了很大提升 他们之间的差距完全不是瓶颈 从使用的角度来说 fastcgi 具有以下优点 1 webserver 和 php 程序分离 两者可以部署在不同的地方 通过 socket 方式 通信带来一定安全性 2 使用 fastcgi 在出现问题时可以更好的定位是 webserver 还是 php 的原因 3 fastcgi 方式不依赖于 webserver 更加灵活 扩展性也更好 4 fastcgi 本身会有一些进程监控和日志记录 更便于分析问题 跟踪状态 5 灵活多样的配置 可以根据实际的应用进行合理配置达到最佳效果 当然 fastcgi 也有一些缺点 1 mod fastcgi 在进程管理上有一些问题 容易出 core 这个问题通过使用 php fpm 可以解决 2 由于 fastcgi 应用单独分离出来 因此需要单独监控进程的状态 防止进程 挂掉后导致服务出现问题 这个可以通过使用用 supervise 管理一定程度上 避免这个问题 3 文档相对缺乏 mod fastcgi 对 apache 的支持也不是特别好 且基本没有升 级 关于 fastcgi 运行方式的选择 从效率 稳定性等各方面来说 ext 方式是最 佳选择了 而且考虑到我们可能会将 webserver 和 php 分开到不同机器 选择 远程方式也是必须的 进程管理工具 从各方面来说 php fpm 是最优选择了 即时使用 lighty 作 用 web server 也完全可以用它代替 spwn cgi 综合测试结果和上述分析 我们完全可以采用 fastcgi 代替传统的 mod php 推 荐使用下面的组合方式 apache ext php fpm with superwise 如果 webserver 和 fastcgi 部署在同一机器上 使用 unix sock 方式通信 否则使 用 tcp 方式 附录附录 apache 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 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 with 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 cgi v 如果看到 PHP 5 2 5 cgi fcgi built Nov 12 2008 20 44 08 Copyright c 1997 2007 The PHP Group Zend Engine v2 2 0 Copyright c 1998 2007 Zend Technologies 就表明安装成功了 mod fastcgi cd mod fastcgi 2 4 6 cp Makefile AP2 Makefile vi Makefile 修改 top dir 为 apache 安装目录 make make install apache 配置 修改 httpd conf 首先增加 LoadModule fastcgi module modules mod fastcgi so 然后根据不同的运行模式进行配置 eg ext 模式 FastCgiExternalServer php server socket home club fastcgi sock ScriptAlias cgi bin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度车位转让合同范例3篇
- 2024年快递服务新规则合同3篇
- 2024商业借款合同样本
- 石油勘探服务招标合同三篇
- 2024年国家体育馆接待与住宿安排合同3篇
- 2024年度国际体育赛事综合接待服务协议版B版
- 互联网时代的仓储转型计划
- 2024年全方位IT运维服务协议书2篇
- 2024年国际人才交流合同
- 二零二四年到期债券购买与转让协议2篇
- PCBA工艺管制制程稽查表
- 第十二章 全面推进国防和军队现代化 (4)课件
- 包装物品的火灾防范措施
- 子痫前期护理查房课件
- 老年冠心病慢病管理指南(2023版)解读
- 西方现代主义文学
- 2023年国家开放大学《财务报表分析》形成性考核(1-4)试题答案解析
- 试用期面谈记录表
- 幼儿园故事课件:《小马过河》
- 药物经济学在新药研发中的应用
- 桌面推演幻灯
评论
0/150
提交评论