Chinaunix

标题: 请教 modcgi modperl fastcgi 运行原理 [打印本页]

作者: hitsubunnu    时间: 2009-09-17 12:04
标题: 请教 modcgi modperl fastcgi 运行原理
很多文章介绍  modcgi modperl fastcgi 但是都只简单提到 跟cgi的比较 不用每次打开一个进程 具体的原理都说的很含糊

希望哪位能给纠正一下理解上的错误

我现在的理解如下

原理:
  1. modcgi 使用 registry 方式  相比cgi减少每次 引导和编译的开销
  2. modperl 使用 handler 方式 底层是xs的 所以 比 modcgi更快

    apache唤醒 modcgi 和 modperl的方式是基本一样的

    客户1 -> 创建httpd进程 -> modcgi or modperl) -> httpd 挂起
    客户2 -> 唤醒 客户1产生的 httpd + mod(cgi perl) -> httpd 挂起
   
  3. fastcgi是个进程池
  
      客户1 -> httpd 进程池  
                                          -> 有http进程-> 处理cgi -> httpd 挂起
      客户2 -> httpd 进程池


使用:
   1. modcgi 就是普通的cgi加上 ModPerl::Registry 或 ModPerl:erlRun   (cgi程序要避免闭包等问题)
      http.conf 的设置 使用
        PerlResponseHandler ModPerl::Registry
      
   2. modperl 一般使用模板 catalsyt mason 等 或者自己实现
       http.conf 的设置 使用
          catalsyt :PerlResponseHandler mysite
          mason  : PerlHandler  HTML::Mason::ApacheHandler
          自己实现 :PerlResponseHandler Apache2::mysite  

   3. FCGI::Engine 等
作者: hotsnow    时间: 2009-09-18 08:30
fastcgi 应该是基于线程的吧
作者: hitsubunnu    时间: 2009-09-18 09:40
原帖由 hotsnow 于 2009-9-18 08:30 发表
fastcgi 应该是基于线程的吧


请您不要误导我


  1. FastCGI 应用程序将处理 HTTP 请求,每个应用程序都由进程池集合组成。在池中,每个进程一次处理一个请求,处理完毕后返回池中,直至其收到另一个请求。
复制代码


出处  http://technet.microsoft.com/zh- ... 072%28WS.10%29.aspx
作者: 兰花仙子    时间: 2009-09-18 12:06
perl的fastcgi实现较差,我看过一个别人的代码,就是一个永久循环驻留在apache进程里。
modperl与cgi相比,其实也只是节省了perl脚本Load和compile的开销。
当然,modperl的handler可以直接访问apache的内部API,效率比CGI高,也可以做一些CGI不能做的事,例如rewrite请求。
作者: hitsubunnu    时间: 2009-09-18 12:19
原帖由 兰花仙子 于 2009-9-18 12:06 发表
其实也只是节省了perl脚本Load和compile的开销。


能展开详细讲讲 怎么节省的开销吗?

尤其是compile的开销怎么节省的

[ 本帖最后由 hitsubunnu 于 2009-9-18 12:20 编辑 ]
作者: 兰花仙子    时间: 2009-09-18 12:23
原帖由 hitsubunnu 于 2009-9-18 12:19 发表


能展开详细讲讲 怎么节省的开销吗?

尤其是compile的开销怎么节省的


modperl只会load脚本一次,然后compile一次,就常驻内存运行,类似于一个daemon,直到这个进程退出。
CGI在每次request过来时,都会从磁盘load脚本并compile。
modperl相对于CGI,节省了每次编译的开销。我说的是这个意思。
作者: hitsubunnu    时间: 2009-09-18 13:01

  1. 1. modcgi 就是使用 registry 方式的modperl
  2. 2. modperl 就是使用 handler 方式 的modperl  

  3.     apache唤醒 modcgi 和 modperl的方式是基本一样的  但是 handler 方式 底层是xs的 所以 比  registry 方式更快

复制代码


可以这样理解吗?
作者: 兰花仙子    时间: 2009-09-18 13:55
原帖由 hitsubunnu 于 2009-9-18 13:01 发表

1. modcgi 就是使用 registry 方式的modperl
2. modperl 就是使用 handler 方式 的modperl  

    apache唤醒 modcgi 和 modperl的方式是基本一样的  但是 handler 方式 底层是xs的 所以 比  registry 方 ...


sorry,我search了下CPAN,没发现modcgi呀。。。
你是指Apache的mod_cgi?还是就是指CGI?

CGI与modperl Registry在实现方式上没什么区别,因为Registry本就是用来跑CGI的。
CGI与标准mod_perl最大的区别在于执行的HTTP阶段不同。
mod_perl可以执行在HTTP的任何阶段(一个请求处理可以分成N个阶段)。
但是到CGI时,已经很晚了。而且给CGI传参是通过环境变量的方式,比较低效。
作者: hitsubunnu    时间: 2009-09-18 16:33
不好意思 我就是因为看的资料很杂 我自己拼接在一起的 所以对modperl的运行机制很混乱才发问的

兰花仙子的意思可以理解为下面这样吗?
   虽然我在http.conf 里 配置成了 PerlResponseHandler ModPerl::Registry这种形式  但是我在写程序时仍使用use CGI模块等写出的程序  其实质就是最原始的cgi程序 不会对 Load和compile的开销起任何作用

我的理解(劳烦您纠正)
modperl最常见的有2种形态:handler和registry

1. 我以为很多地方提到的modcgi就是指  运行在 modperl的registry形式下的 用use CGI模块等写出的程序  http.conf 的设置时 使用 PerlResponseHandler ModPerl::Registry  写法上跟普通cgi基本一样但是需要避免一些闭包等等。。  这种形式跟最原始的cgi是有区别的 也是可以节省了perl脚本Load和compile的开销    一般原始cgi要想移植到modperl下 都采用这种模式

2. handler是比registry更高级的一个层次 是利用apache的底层进行开发 可以在http的12阶段实现任何事情但是很复杂  一般都是使用 catalyst mason 等  在http.conf里设置成 PerlHandler  HTML::Mason::ApacheHandler
这种形式     当然也可以自己编写 类似 Apache2::Hello 但是自己编写比较麻烦

如果您看不懂我的表述 或者我的理解有很大的偏差 请帮忙回答2个问题
  1. 最原始的cgi要想 移植到 modperl下 是通过 ModPerl::Registry  吗 当然要按照规范写   这种移植性能上有提升吗?
  2.registry 和 handler 的区别 ?

[ 本帖最后由 hitsubunnu 于 2009-9-18 16:35 编辑 ]
作者: billypeng    时间: 2009-09-18 16:51
apache那么复杂的配置,搞懂它都不容易。

直接使用lighttpd + fastcgi,我觉得又简单又方便,功能和功能都能满足要求。
作者: 兰花仙子    时间: 2009-09-18 16:55
1. 最原始的cgi要想 移植到 modperl下 是通过 ModPerl::Registry  吗 当然要按照规范写   这种移植性能上有提升吗?
  2.registry 和 handler 的区别 ?


1. 是通过ModPerl::Registry。不过说实话,我这样写的经验很少。性能提升是肯定的,因为CGI也是只load和compile一次,然后就常驻内存运行。
2. CGI与Apache的交互是通过$q ($q=CGI->new)来实现的,其实是访问环境变量。modperl是通过$r来交互的,$r你应该清楚了吧,它包含apache的一切内部API。Registry是封装了CGI的modperl,数据传送应该是apache -> registry -> CGI这种方式,内部细节具体是怎么样的,坦白说我也不是很清楚。

一般用modperl的,确实都会使用某种模板。我过去一直用Mason,它就是为modperl而生的。

mod_perl作为开源开发工具,缺少有实力的厂商支持,框架少,概念复杂,代码可移植性和维护性都差,我认为它前途不怎么样,不比JAVA。
但是,modperl比JAVA快,这是不争的事实。而且modperl比java强大,比如开发一个响应Filter,modperl可以加入任何HTTP头部,而Java只能加入有限的几个头部。
作者: hitsubunnu    时间: 2009-09-18 17:19
非常感谢  这些问题困惑了我很久  一直没办法印证

在ModPerl::Registry 下为了减少编写语法上的麻烦 我都将成程序按照mvc划分 然后把所有东西都写成模块 通过几个入口调用 c部分模块 再调用mv的模块

条件允许的话 我更喜欢用mason 或者 catalyst  

不是特殊情况很少去使用$r 编写底层的东西   modperl实在是太复杂了  

再次表示感谢
作者: 兰花仙子    时间: 2009-09-18 17:28
原帖由 hitsubunnu 于 2009-9-18 17:19 发表
非常感谢  这些问题困惑了我很久  一直没办法印证

在ModPerl::Registry 下为了减少编写语法上的麻烦 我都将成程序按照mvc划分 然后把所有东西都写成模块 通过几个入口调用 c部分模块 再调用mv的模块

条 ...


没用过catalyst, 装都没装好过,
modperl缺乏好用易用的框架,这也是我对MP开发不太看好的原因。
为什么不像Java或Python呢,WEB框架一抓就一堆。

anyway welcome交流。
作者: hitsubunnu    时间: 2009-09-18 17:53
看看这个最前卫的框架 http://www.perlfoundation.org/il ... ramework_for_perl_6
作者: 兰花仙子    时间: 2009-09-18 18:14
原帖由 hitsubunnu 于 2009-9-18 17:53 发表
看看这个最前卫的框架 http://www.perlfoundation.org/il ... ramework_for_perl_6


perl6。。遥遥无期啊。
不知Perl6下还有没有mod_perl?
如果用虚拟机的话,岂非跟java一样?
把web服务器port在虚拟机里,就跟java一样了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2