FastCGI 不彻底高级指南(转载)

做者:zealyphp

1、FastCGI是什么?
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并所以得到较高的性能。众所周知,CGI解释 器的反复加载是CGI性能低下的主要缘由,若是CGI解释器保持在内存中并接受FastCGI进程管理器调度,则能够提供良好的性能、伸缩性、Fail- Over特性等等。html

FastCGI的官方站点在 http://www.fastcgi.com node

FastCGI的工做原理是:数据库

一、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
二、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的链接。
三、当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
四、FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个链接。 在正常的CGI模式中,php-cgi.exe在此便退出了。apache

在上述状况中,你能够想象CGI一般有多慢。每个Web请求PHP都必须从新解析php.ini、从新载入所有dll扩展并重初始化所有数据 结构。使用FastCGI,全部这些都只在进程启动时发生一次。一个额外的好处是,持续数据库链接(Persistent database connection)能够工做。
2、为何要使用FastCGI,而不是多线程CGI解释器?
这可能出于多方面的考虑,例如:
一、你不管如何也不能在windows平台上稳定的使用多线程CGI解释器,不管是IIS ISAPI方式仍是APACHE Module方式,它们老是运行一段时间就崩溃了。奇怪么?可是确实存在这样的状况!
固然,也有不少时候你可以稳定的使用多线程CGI解释器,可是,你有可能发现网页有时候会出现错误,不管如何也找不到缘由,而换用FastCGI方式 时这种错误的几率会大大的下降。我也不清楚这是为何,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
二、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。缘由嘛,我以为 很难讲,但有资料说在Zend WinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不过如今Zend已经不作这个产品了。
3、不使用FastCGI的理由
一、多进程比多线程消耗更多的服务器内存,php-cgi.exe解释器每进程消耗7至25兆内存,将这个数字乘以50或100试试。
二、性能。确实有时候多线程CGI解释器更快,呵呵,并且有时候,它也很稳定。
三、CGI?听起来就很土,呵呵windows

4、IIS FastCGI配置方法
一、首先肯定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,若是你想在早期版本中工做,须要从新编译它。咱们假设PHP安装在c:\php,支持FastFCGI的可执行文件名是php-cgi.exe。
注意:建议在Php.ini中关闭cgi.force_redirect,启用fastcgi.impersonate,启用cgi.rfc2616_headers。api

二、下载 http://www.caraveo.com/fastcgi/fastcgi-0.6.zip 并将其中的isapi_fcgi.dll解压缩到c:\php目录下(不是必须在此目录,这里只是叙述方便)。安全

三、使用regedit.exe创建以下注册表项:
HKEY_LOCAL_MACHINE:Software\FASTCGI\.php (必需)服务器

四、在此项下创建以下键值:
字符串类型:AppPath,值为c:\php\php-cgi.exe (必需)
字符串类型:BindPath,值为php-fcgi (必需)
如下是可选配置键值:
DWORD类型:StartServers,启动时默认启动的解释器个数,默认值5
DWORD类型:MaxServers,最大解释器个数,默认25
DWORD类型:IncrementServers,当解释器不够用时增量个数,默认2
DWORD类型:Timeout,增量解释器(超出StartServers数目的)存活时间,默认600(秒)
DWORD类型:ThreadPoolSize,线程池大小,仅IIS下有效,默认10
DWORD类型:Impersonate,仅IIS有效,若是为1,使用IIS安全标志,为0则关闭此特性。不要关闭它除非你不担忧安全问题。默认1
DWORD类型:MaxPostData,Post数据预读Byte限制,默认0
DWORD类型:BypassAuth,仅IIS有效,若是为1而且isapi_fcgi.dll被配置为IIS Filter,同时IIS被配置为使用BASIC Authentication,这将强制全部认证请求使用IIS匿名用户。这一选项的目的是容许脚本实现本身的安全机制。默认0
BINARY类型:CustomVars,附加环境变量值,新行分隔,Null结束多线程

五、若是是IIS6,添加一个Web服务扩展指向c:\php\isapi_fcgi.dll,并容许。应用程序池中的“最大工做进程数”请保持为1。

六、添加应用程序扩展映射关系:
1). 在Internet信息服务管理器中,选择网站或应用程序的根目录。
2). 打开目录属性页(右键选择“属性”),再选择“主目录”。
3). 点击“配置”按钮,选择“映射”Tab页。
4). 点击“添加...”,在“可执行文件”设为: c:\php\isapi_fcgi.dll,扩展名设为.php,必定要选择“确认文件是否存在”,而后“肯定”保存设置。
5). 再一样添加对.php3或.phtml扩展名的支持(可选)。
6). 保存设定并从新启动IIS。

七、测试一下,同时请求多个Web页面,而后察看任务管理器中的进程,页面完成后php-cgi.exe进程持续运行并不退出。
5、Apache配置方法
一、首先肯定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,若是你想在早期版本中工做,须要从新编译它。咱们假设PHP安装在c:\php,支持FastFCGI的可执行文件名是php-cgi.exe。
注意:建议在Php.ini中打开cgi.force_redirect,关闭fastcgi.impersonate,关闭cgi.rfc2616_headers。

二、下载 http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll ,放到Apache 2.x的Modules目录中。

三、肯定Apache 2.x在CGI方式下能够正常运行PHP。httpd.conf中存在以下几行:
ScriptAlias /php/ "c:/php/"
Action application/x-httpd-php "/php/php-cgi.exe"
SetEnv PHPRC "C:/php"

AddType application/x-httpd-php .php

四、在httpd.conf中添加:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 说明:此处的 -processes 3 表示启动三个 php-cgi.exe 进程,
# 关于 FastCgiServer 的详细参数请参考 FastCGI 文档。
FastCgiServer "c:/php/php-cgi.exe" -processes 3

五、从新启动Apache,测试同上。
6、高级配置
设想这样一种场景,你的服务器上同时跑Apache 2和IIS 6,两个Web服务器都跑php应用。那么,有以下三种可能:
A、php使用iis isapi和apache module安装,均为多线程方式运行。这个和FastCGI没有关系。
B、其中一个服务器使用FastCGI方式,另外一个使用多线程方式。这个能运行正常。
C、两个均使用FastCGI方式,这个每每不正常。通常表现为:
两个服务器各自启动一些php-cgi.exe进程,而后服务器之一不解释php页面,或者隔一下子就派生新的php-cgi.exe进程(可怕呀)。

为何呢?我想大概是由于上面使用的两个东西(iis isapi和apache module)的做者大概并无想过要和对方同时使用吧,呵呵。

想了想,Apache 2和IIS 6若是能够共用一批php-cgi.exe解释器就行了,既不浪费内存,估计也不会有调度问题了。

通过研究和测试证实,这个想法是可行的。可是,因为Shane Caraveo并未在ISAPI DLL中提供使用外置FastCGI服务的功能,所以在此场景中只能是由IIS负责启动和管理php-cgi.exe,而后配置Apache去使用这些受 IIS管理的php-cgi.exe进程。

配置方法:

一、按上述四中的方法配置IIS FastCGI。

二、基本按上述五中的方法配置Apache FastCGI,五.4改成在httpd.conf中添加:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 使用外部FastCGI服务器,请参考 FastCGI 文档。
FastCgiExternalServer "c:/php/php-cgi.exe" -socket "php-fcgi"

注意:-socket参数后的值必须与HKEY_LOCAL_MACHINE:Software\FASTCGI\.php中BindPath的值一致,这样两个FastCGI进程管理器才会使用同一个命名管道链接php-cgi.exe。

注意:此配置中php-cgi.exe进程只受IIS中的FastCGI进程管理器管理,Apache的繁忙请求并不会使IIS中的 FastCGI调度更多的php-cgi.exe进程。所以,在IIS中配置FastCGI时应当使StartServers值足够大,以免php解释 器数量不足。一样带来的问题是,若是IIS关闭了,那么Apache就会找不到Php解释器了,这个要留心。

由此带来的一个问题是:此时的php.ini中cgi.force_redirect、fastcgi.impersonate、cgi.rfc2616_headers应该怎么设定呢?这个留给你们去思考吧……呵呵

另一个可能遇到的问题是,IIS很是空闲,一段时间后由IIS启动的php-cgi.exe退出了,则apache就解释不了Php了,怎么 办呢?这时能够访问一下iis网站,php-cgi.exe就又起来了,晕哦。一个建议是使用IIS 6的进程池管理,在应用程序池中关掉“空闲超时”,而且,在“应用程序池标识”中将运行帐号设定为与Apache服务启动帐号一致。

原载URL: http://blogme.cn/node/6529

相关文章
相关标签/搜索