Fast CGI 工作原理

http://www.cppblog.com/woaidongmao/archive/2011/06/21/149092.html

一、FastCGI是什么?
  FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
    FastCGI的官方站点在http://www.fastcgi.com

  FastCGI的工作原理是:

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

  在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

二、为什么要使用FastCGI,而不是多线程CGI解释器?
  这可能出于多方面的考虑,例如:
  1、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器,无论是IIS ISAPI方式还是APACHE Module方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!
  当然,也有很多时候你能够稳定的使用多线程CGI解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用FastCGI方式时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
  2、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得很难讲,但有资料说在Zend WinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不过现在Zend已经不做这个产品了。

FastCGI的技术原理

如果想了解FastCGI的技术原理就要了解何为”短生存期应用程序”,何为”长生存期应用程序”。

先从CGI技术开刀,以下是CGI技术的理论:每次当客户请求一个CGI的时候,Web服务器就请求操作系统生成一个新的CGI进程。当CGI满足要求后,服务器就杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。  而FastCGI技术的理论为:FastCGI程序一旦产生后,他可以持续工作,足够满足客户的请求直到被明确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求Web服务器运行多个FastCGI 应用程序的副本。

CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。

由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率。

自今,较为流行的Java语言Servlet技术在设计上是以参考FastCGI的技术运行所设计。

FastCGI的特点

1. 打破传统页面处理技术

传统的页面处理技术,程序必须与Web服务器或Application服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破, FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过TCP/IP协议与Web服务器通讯,这样做既适合开发大型分布式Web 群,也适合高效数据库控制。

2. 明确的请求模式

CGI技术没有一个明确的角色,在FastCGI程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。

3. 合理的程序结构

起初,真的很讨厌FastCGI应用程序的结构要求。没关系,您经过一段时间编写后就会喜欢这种结构,只有这种完全规范的结构才能让您的程序更有效率。

Fastcgi到底是什么样的技术

注:本人对LAMP,python了解不是很多,此文是我的个人理解,如果有误忘告知

自从接触rubyonrails以来,fastcgi这个技术标准就进入了我的视线,从技术角度看,fastcgi的优点还是很多的,作为一种替代cgi的技术标准, fastcgi有如下优点(稳定,安全,高性能,方便扩展)

  • 从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.
  • 从安全性上看, fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮,
  • 从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与(注1)
  • 从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python…)

但是让我感到迷惑不解的是,apache对fastcgi的支持mod_fastcgi简直就是一塌糊涂, 最新的稳定版本居然还是2003年的,snap也只到2004年, 在1.3下面还勉强可以用,在apache2.0上更是被报告无法稳定运行.fastcgi在[lighttpd][]上表现还算不错, 但是lighttpd在用户群,兼容性上还不够主流(也就在linux上面表现不错, 没有正式的windows版本, solaris下面也有bug). 另外fastcgi也缺乏发展,让人有被废弃掉了的感觉.(ruby的dbi也是这个状况). 和其他日新月异的技术标准比, fastcgi地位尴尬

直到我看到这篇文章才明白,fastcgi真是的命苦.(呵呵,以下的内容取自该文章)

从名字上看fastcgi是fast的cgi的,属于改良派.从理论上,他可以很多程序语言接口来开发动态web,但是这些程序语言每一个都是走完全革命的道路. java阵营就自己搞了一套j2ee server标准,要协作也直接找apache或者IIS谈,瞧不上fastcgi. aspx直接和IIS是亲兄弟,没有fastcgi的份. 剩下的php因为太流行(LAMP),和apache是铁哥们,一个mod_php就解决了,简单方便, python社区的牛人太多,精力旺盛,人家搞了个SCGI玩,和fastcgi比是有过之而无不及. 等到rails出山的时候, fastcgi真的算是老态龙钟了.

rails的出现使得fastcgi重新焕发了青春, apache也开始重新构建新的mod_proxy_fcgi,但是它的前途还不能说是一片光明, 我觉得至少有以下几个问题

  • 目前的fastcgi和server沟通还不够智能,一个fastcgi进程如果执行时间过长会被当成是死进程杀掉重起,这样在处理长时间任务的时候很麻烦.这样做也使得fastcgi无法允许联机调试.
  • SCGI等类似技术的都可以替换fastcgi, SCGI在python中很成功,功能完备,目前SCGI也开始支持rails了
  • 随着rails的流行,一个独立的mod_rails是可能出现的,而且ruby自身的webserver也开始涌现,以后极有可能自己搞一套东西连接主流的webserver.fastcgi设计的时候是想作common gateway interface(cgi)的,但是这个目标的现在看来已经不适合了

总结: 我觉得fastcgi的前途不明朗, 但是目前来说,他也是rails唯一可以进入生产环境的工具,只用搞懂怎么配就可以了,没有必要深入研究.

注1: 有时候逻辑也会参与图片的生成,这时候图片的IO处理就需要动态程序介入了,此时fastcgi技术上的优势虽然体现不出来,但是也不会比其他技术标准差.

from:http://www.opbsder.com/html/y2008/1141_fastcgi.html

时间: 2024-07-31 16:50:03

Fast CGI 工作原理的相关文章

CGI/FastCGI/mod_php工作原理

先了解一下普通cgi的工作流程:web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web server,web server再返回给客户端,这就是普通cgi的工作原理. 从上面看,cgi所要实现的不过是动态网页而已,这种处理方式的特点就是每接到一个请求,web server都要fork出一个单独的cgi程序的进程来处理,这种方式的好处是把web server和具体的程序处理独立开来,结构清晰,可控性强,同时缺点就是

PHP工作原理及五大运行模式:包括cgi 、fast-cgi、cli、isapi、Web模块模式

PHP的五大运行模式 1)CGI( Common Gateway Interface):即通用网关接口, 2)FastCGI( Long-Live CGI):即常驻型通用网关接口 3)CLI( Command Line Interface):即命令行运行接口 4)Web模块模式(Apache等Web服务器运行的模式) 5)ISAPI(Internet Server Application Program Interface)   1.1 CGI是一种让客户端(web浏览器)与Web服务器(ngi

tcpkill工作原理分析

此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 日常工作生活中大家在维护自己的服务器.VPS有时会碰到这样的情况:服务器上突然出现了许多来自未知ip的网络连接与流量,我们需要第一时间切断这些可能有害的网络连接.除了iptables/ipset, blackhole routing这些常规手段,我们还可以借助一些更轻量级的小工具来临时处理这些情况,如tcpkill. tcpkill使用简介 tcpkill是一个网络分析工具集dsniff中的一个小工具.在

[转]ZK工作原理

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此.本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本

Android的消息机制之ThreadLocal的工作原理

提到消息机制大家应该都不陌生,在日常开发中不可避免地要涉及到这方面的内容.从开发的角度来说,Handler是Android消息机制的上层接口,这使得开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行.很多人认为Handler的作用是更新UI,这说的的确没错,但是更新UI仅仅是Handler的一个特殊的使用场景,具体来说是这样的:有时候需要在子线程中进行耗时的IO操作,这可能是读取文件或者访问网络等,当耗时操作

PHP和Fastcgi/php-fpm的工作原理-理论部分 不涉及实验

标题:PHP概述笔者:郑彦生时间:2014-05-16--------------- ---|谢谢马哥教育|--- 祝马哥的事业一帆风顺. MIME,HTTP,HTML MIME:N能够让http传送非文本信息:如mp3http:只能解析html的文档,对于多媒体mp3等,浏览器需要安装插件 或者 web浏览器能够调与之匹配的web程序进行解码注意:浏览器本身不能播放音乐,要么有自带的插件,要么主机上其它的程序可以播放音乐,而浏览器可以调用这个程序来执行播放音乐服务器发过来的一般都是静态的文本

Zookeeper的功能以及工作原理

1 Zookeeper的基本概念 1.1 角色 Zookeeper中的角色主要有以下三类,如下表所示: 系统模型如图所示: 1.2 设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 2 .可靠性:具有简单.健壮.良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受. 3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息.但由于网络延时等原因,Zook

Nginx 工作原理和优化、漏洞

1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作. Nginx的模块从结构上分为核心模块.基础模块和第三方模块: 核心模块:HTTP模块.EVENT模块和MAIL模块 基础模块:HTTP Access模块.HTTP F

TCP传输工作原理

引言 在TCP/IP体系结构中,IP协议只管将数据包尽力传送到目的主机,无论数据传输正确与否,它都不做验证,不发确认,也不保证数据包的顺序,因而不具有可靠性.这一问题要由传输层TCP协议来解决,TCP协议为Internet提供了可靠的无差错的通信服务. 一.OSI参考模型和TCP/IP参考模型 OSI模型(open system interconnection reference model)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图1所示的七层. TCP/IP最初是为ARPA