[ 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.
|
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 ]
当你使用如下的配置运行你的CGI脚本时:
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/ |
你是在mod_cgi方式下运行它,尽管你没有显式的申明。当你使用ScriptAlias 的时候,Apache就会隐性的完成配置工作。
顺便说一下,不要将 ScriptAlias
和ExecCGI
混淆。ExecCGI
是
使脚本 可以被执行,而不是作为文本文件返回。例如,要使用mod_perl和
Apache::Registry
可以配置如下: <Location /perl> SetHandler
perl-script PerlHandler
Apache::Registry Options ExecCGI PerlSendHeader On </Location>
[ TOC ]
从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::Registry
用Apache::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"; |
Apache::Registry
会将它转换成:
package Apache::ROOT::perl::project::test_e2pl; |
第一行为代码的使用提供一个唯一的名字空间和一个唯一键值,用来从缓冲区引用这段 代码。
第二行引入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::Registry
和Apache::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 ]
Rex Staples于1999年10月14号(周四)的报告
Macromedia
4,273,000个不重复访问者/月 1999/8
Apache/1.3.4 (Unix) mod_perl/1.18 Solaris
ValueClick: 基于效果的(Results-based)广告网
8千万个页面点阅/天 2000/5 使用45台机器
Apache/1.3.9-dev (Unix) mod_perl/1.21_01 FreeBSD
Deja.com
1亿3千万个页面点阅/月 1999/10
Apache/1.3b5 mod_perl/1.08 Linux
MP3.com
7千7百万个页面点阅/月 1999/8
408,000个不重复访问者/天 1999/8
http://www.mp3.com http://www.mp3.com/pr/990914-keymetrics.html
Apache/1.3.4-9 (Unix) mod_perl/1.18-21 Linux/FreeBSD
IMDB: Internet电影数据库
1.25百万个页面点阅/天 1998/3
* 它们现在是一个amzon.com公司(an Amazon.com company)了。
Apache/1.3.7-dev (Unix) mod_perl/1.19_01-dev
Flash.net: Internet服务提供商
1,603,000个不重复访问者/月 1999/8
http://www.flash.net http://www.mediametrix.com/TopRankings/TopRankings.html
Apache/1.2.4 mod_perl/1.00 Solaris
在线黄页
917,000个不重复访问者/月 1999/8
http://www.athand.com http://www.mediametrix.com/TopRankings/TopRankings.html
Stronghold/2.3 Apache/1.2.6 (Unix) mod_perl/1.15 Solaris
Commissioner.com: 梦想足球
1千2百万个页面点阅/天 1999/10
Apache/1.35b mod_perl/1.10 Linux
Slashdot: 在线新闻
400,000 page个页面点阅/天 1999/10
Apache/1.3.6 (Unix) mod_perl/1.21 Linux
Hot Bot 邮件和会员网页:
同时也被HotWired, WiredNews, Webmonkey, 和 Suck.com广泛使用
Apache/1.3.4 (Unix) mod_perl/1.21 Solaris
Art Today: 提供会员制插图服务
250k点击率/天
Oracle 7 + 1 Sun Ultra w/150GB storage Apache/1.3.4 (Unix) mod_perl/1.17 Solaris
CMPnet: 一个科技信息网
500k点击率/day
Apache/1.3.9 (Unix) mod_perl/1.16
[ TOC ]
书写本文我使用以下这些参考资料:
mod_perl FAQ 作者:Frank Cringle 地址: http://perl.apache.org/faq/ .
mod_perl性能调整指南 作者: Vivek Khera 地址:http://perl.apache.org/tuning/ .
mod_perl插件参考指南 作者: Doug MacEachern 地址:http://perl.apache.org/src/mod_perl.html .
从CGI到mod_perl开速移植指南 地址: http://perl.apache.org/dist/cgi_to_mod_perl.html .
mod_perl简易指南 at http://perl.apache.org/dist/mod_perl_traps.html .
mod_perl邮件列表信件. 是一些Apache/Perl邮件列表中对于一些提出的问题的 答 案。(注册列表可以发信到modperl-subscribe@apache.org)
我的mod_perl的个人经验.
我从FAQ和email中引用了很多的片断,但是我没有一一指明。但是我并不是要将这些 据为己有。只是我试图记录这些作者,但是搞得很混乱,所以与其分散指明,不如将 他们全部列在一起。如果你想要把你的名字列在原始引用处,请告诉我,我会为你添加。
主要贡献者:
Doug MacEachern.本文很大部分建立在他对用户问题的答复上。
Frank Cringle. 他的mod_perl FAQ的一部分被本文使用。
Vivek Khera. 他的mod_perl性能调整指南中,许多有用的部分被本文使用。
Steve Reppucci, 对本文做了彻底的审校,修正了很多拼写和语法错误,使文档可读。
Eric Cholet, 为本文写了一些章节,并指出了一些技术错误。
Ken Williams, 对原文的许多部分进行了。他的许多email片断被本文收入。
Matt Sergeant, 写了``Perl参考''一章中的``mod_perl异常处理''小节,也做了其他很多贡献。
Wesley Darlington 写了一个比较大的小节。
Geoffrey S Young 和 David Harris 书写了关于mod_perl和RPM包的不少章节,提供了 很多注解和修正意见。
Andreas J. Koenig 贡献了他的文档``正确的HTTP header''
Ged W. Haywood 审校了全文,并提供了很多建设性批评意见,帮助重新组织文档以达到更大的 用户友好度。
Mark Summerfield 审校了全文,提高文档的可读性,建议了一些有用的扩展。
Jeffrey W. Baker ,他的``mod_perl数据库性能指南''和许多有用的注解被本文重用。
Richard A. Wells for 审校了本文的大部分内容并纠错。
Randy Harmon 重写了``mod_perl鼓吹''一章。
Dean Fitz 审校了``操作系统和硬件需求''一章。
其他有贡献者(字母排序):
我想感谢所有花费了时间和精力将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.
|
Written
by Stas
Bekman. Last Modified at 06/12/2002 |
|
Use of the Camel for Perl is a trademark of O'Reilly & Associates, and is used by permission. |