Mod Perl Icon Mod Perl Icon 介绍.


Table of Contents:

[ TOC ]
The Writing Apache Modules with Perl and C book can be purchased online from O'Reilly and Amazon.com.
Your corrections of the technical and grammatical errors are very welcome. You are encouraged to help me improve this guide. If you have something to contribute please send it directly to me.
[ TOC ]

什么是mod_perl

Apache/Perl项目将Perl语言和Apache HTTP服务器的强大功能结合了起来。 通过mod_perl可以完全使用Perl书写Apache模块,让你轻松的完成一些在常规 的CGI程序中很难做到的事情,比如运行子请求(run sub requests)。而且, 持续性嵌入在apache中的perl解释器节约了启动一个外部解释器的花销,也就是 Perl的启动时间。还有一个重要的特色是代码缓冲,所有的模块和脚本都是一次 性被装载和编译的,之后的服务器时间内它们都是从缓存中读入。于是服务器运行 的都是已经被装载和编译过的代码,非常快。

mod_perl最主要的优点是功能和速度。你有全部的权利去访问(access)web服务器 的内部工作,并且能介入到处理请求的任何阶段中。于是,你可以自己定制一些处理 过程,如:URI到文件名的转换、认证、响应生成、记录日志等。这些只占用很小的 运行花销。因为它通常以web服务器扩展的方式完成,而不必另开一个单独的进程。 CGI,作为使用最广的服务器扩展,可以完全被mod_perl方式的代码取代,来完成处理 请求的响应生成阶段。mod_perl包含了两个可以实现这个目标的通用模块: Apache::Registry:可以轻易的运行现有的perl CGI脚本。 Apache::PerlRun:作用和Apache::Registry相似,但是允许你运行更``脏''(在 一定程度内)的脚本。

你可以配置自己的http服务器和处理模块(使用PerlSetVar和<Perl>), 甚至可以定义自己的配置标示。

许多人问:mod_perl可以提高多少性能呢? 这取决于你使用mod_perl做什么和你问的是谁。 开发人员报告的速度提高从200%到2000%都有。最好的测算方法是自己试试看。 (参看 http://perl.apache.org/tidbits.html http://perl.apache.org/stories/)

[ TOC ]


mod_cgi

当你使用如下的配置运行你的CGI脚本时:

 
  ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/

你是在mod_cgi方式下运行它,尽管你没有显式的申明。当你使用ScriptAlias 的时候,Apache就会隐性的完成配置工作。

顺便说一下,不要将 ScriptAliasExecCGI混淆。ExecCGI是 使脚本 可以被执行,而不是作为文本文件返回。例如,要使用mod_perl和 Apache::Registry可以配置如下: <Location /perl> SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI PerlSendHeader On </Location>

[ TOC ]


Apache::Registry

从Perl API的观点看,Apache::Registry和其他的Perl包在概念上没有什么 不同。Apache::Registry读 入脚本文件,编译,执行,并且存储到缓冲区。 Perl解释器在服务器子进程的生存周期内一直保持着,任何编译后的代码都会被 解释器保持在内存中直到子进程结束。

为了防止脚本名字冲突,Apache::Registry为每个脚本创建一个unique key (唯一键),方法是添加Apache::ROOT::到每个脚本URI的格式路径之前。这个 键值实际上是脚本所在的包名称。所以如果你请求脚本/perl/project/test.pl, 系统会为脚本添加一行包申明代码: package Apache::ROOT::perl::project::test_e2pl;

Apache::Registry 也存储脚本最后被修改的时间。每当脚本被修改,缓冲区的 代码就会被丢弃,系统会重新编译修改后的脚本。不过,系统并不检查脚本使用的 perl库文件的修改时间。

Apache::RegistryApache::exit()重载CORE::exit(), 所以使用 exit()的CGI脚本会正确运行。相关的细节内容我们会在后面的章节讨论。

Apache::Registry做的最后一件事情,就是模拟mod_cgi的环境变量,象 $ENV{SERVER_NAME}, $ENV{REMOTE_USER}等。PerlSetupEnv Off 会使这个节省内存和CPU时间的特色失效。

从程序员的观点看,在mod_cgi模式和在mod_perl模式运行一个普通的CGI脚本几乎 没有什么差别。不过,速度上却有很大的提升,只是内存的花销会大很多(天下没有 免费的午餐,:-)。

当脚本运行在mod_cgi模式时,每当它们被调用的时候就会被装载一次,然后退出。 在mod_perl模式下,它们只被装载一次,然后就被缓存。这就带来了很大的性能提升。 但是由于代码被缓存,并不退出,所以不会象mod_cgi模式下那样清除内存。这可能 带来意想不到的影响。

mod_perl模式下,当系统检测到脚本被修改后,会重新编译和装载脚本,但是记住, 当脚本require或者use的那些库修改时是不会被重新编译的。你必须自己手动操作以 确保它们被重新编译。

当然,这份手册会详细回答所有的这些问题。

让我们看看当脚本在Apache::Registry模式下执行的时候都发生了些什么。我们 以下面的一段简单代码为例(URI /perl/project/test.pl)

 
  print "Content-type: text/html\n\n";
print "It works\n";

Apache::Registry会将它转换成:

 
  package Apache::ROOT::perl::project::test_e2pl;
use Apache qw(exit);
sub handler {
print "Content-type: text/html\n\n";
print "It works\n";
}

第一行为代码的使用提供一个唯一的名字空间和一个唯一键值,用来从缓冲区引用这段 代码。

第二行引入Apache::exit,以重载perl内置的exit

sub handle过程将实际的脚本代码包裹起来。缺省情况下(即你没有指定其它选择), 当你使用mod_perl并且调用你的代码的URI,mod_perl就会寻找执行该URI所关联的 handler过程。

[ TOC ]


你可以学习到什么

这篇文档是为了帮助你可以更快更容易的开始使用Apache的mod_perl扩展。它包含了 如下信息:如何安装和配置Perl(mod_perl)和Apache,如何在mod_perl模式下书写 脚本和发布那些已经存在的Perl脚本。需要提醒的是它并不打算具体阐述如何使用Apache 的Perl API和C API这个很大的话题。不过你可以在文档中的 得到帮助和进一步学习这个章节发现一些关于这些话题的链接。 这篇文档试图覆盖Apache::RegistryApache::PerlRun的 绝大部分内容。 一些和mod_perl相关的话题,如:管理Apache服务器,调试脚本,使用数据库,mod_perl 模式下的Perl,常用代码片断等等,本文也将一一阐述。文档总览 这节将会引导你进入文档。

本文假定你最少已经了解编译和安装Perl和Apache的基本知识。(如果还没有,就去阅读 一下两个软件发行包中的INSTALL文档)。不过,在本文中你会找到详细Perl和Apache安装 配置说明,以帮助你成功完成mod_perl的安装,很快就可以将服务器运行起来。

如果阅读完本文和得到帮助和进一步学习一节中列举的其他文档后,你依然存在 问题,那么你可能应该通过apache/mod_perl的邮件列表来帮助你。先看看邮件列表的存档 文件(http://mathforum.org/epigone/modperl)。通常搜索了存档文件后你就会找到 问题的答案,因为很多问题已经被提问并且得到了回答。如果你忽略这个建议的话,那么 当你的问题没有得到回答的话就不必惊讶了---因为人们被要求重复回答同样的问题的时候 是很厌烦的---特别是答案就在存档文件中或者在已有的文档中的时候。不过这并不意味着 你应该避免提问,只是不要滥用别人的帮助,在寻求帮助之前RTFM(Read the Fucking Manual,阅读手册)(你一定已经听过那个声名狼藉的狼来了的寓言...)。如果你在邮件列表 提问的话,在主题栏描述你的问题,不要仅仅是``Help''---如果人们可以直接看到你的问题, 那么你就更有可能得到回复。

如果你发现本文中有错误,或者你打算为这篇文档贡献些什么的话,请不吝写一封email给我 (stas@stason.org)

[ TOC ]


运行mod_perl的大型网站

Rex Staples于1999年10月14号(周四)的报告

[ TOC ]


参考说明和感谢

书写本文我使用以下这些参考资料:

我从FAQ和email中引用了很多的片断,但是我没有一一指明。但是我并不是要将这些 据为己有。只是我试图记录这些作者,但是搞得很混乱,所以与其分散指明,不如将 他们全部列在一起。如果你想要把你的名字列在原始引用处,请告诉我,我会为你添加。

主要贡献者:

其他有贡献者(字母排序):

我想感谢所有花费了时间和精力将mod_perl的构想实现的人。包括:Doug MacEachern,mod_perl的作者,和所有贡献了补丁程序、模块和帮助的开发人员。 当然还有世界上众多的看不见的用户,帮助推进mod_perl,使它成为更好的工具。 [ TOC ]


Your corrections of the technical and grammatical errors are very welcome. You are encouraged to help me improve this guide. If you have something to contribute please send it directly to me.
The Writing Apache Modules with Perl and C book can be purchased online from O'Reilly and Amazon.com.

[ TOC ]
Written by Stas Bekman.
Last Modified at 06/12/2002

mod_perl icon
Use of the Camel for Perl is
a trademark of O'Reilly & Associates,
and is used by permission.