用Perl编写Apache模块

前言

Apache被许多大流量网站所嫌弃,但很多企业级的场景则更为适用。

 

Apache httpd 从 2.0 之后,已经不仅仅局限于一个 http 的服务器,更是一个完善而强大、灵活而健壮且容易扩展的开发平台。

开发人员通过定制 Apache 模块,可以几乎无限制的扩展 Apache httpd,使其更好的与实际应用场景匹配,而又无需考虑底层的网络传输细节。这样既可以提高开发效率,节省开发成本,又能充分利用 Apache 本身的健壮性及可靠性。

普遍意义上的理解,Apache的模块开发,分为两种途径:C、Perl。

 

Apache/Perl 集成计划, 将 Perl 程序设计语言的强大功能, 与 Apache HTTP 服务器 紧密地结合到了一起。 通过 mod_perl 模块, 可以完全使用 Perl 来撰写 Apache 模块。 此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl 脚本的启动所造成的性能损失,编码难度与普通CGI基本相同,运 行速度仅比API C略逊一些。

 

MOD_PERL技术的介绍

MOD_PERL技术将PERL解析器编译到APACHE服务器中一起等待客户端请求。


MOD_PERL技术在APACHE中一共有三种代码运行方式:


PerlRun模式:这个模式主要兼容旧式CGI程序,仅仅使用APACHE中的PERL解析器对代码进行解析不进行缓冲。
Registry模式:这个模式的Perl代码在被访问过以后会被编译成为APACHE API模块并且存储在缓冲之中,为了保证运行APACHE会选择性的产生、不只一个副本在内存中。
APACHE API模式:这个模式在APACHE启动的时候就直接将代码编译驻留在缓冲之中。

配置完Apache和Perl模块后,可以用perlinfo函数查看系统环境相关变量。下图是在虚拟机中跑出来的效果,用的是XAMPP套件的老版本。

看到这图,您有何感想?是不是觉得太像phpinfo了,不!是phpinfo太像他了。

 

编写APACHE模块代码

example.pm:

package example;

use strict;
use Apache::Request;
use Apache::Constants qw(:common);

sub handler {
  my $r = shift;
  my $req = Apache::Request->new($r);

  $req->send_http_header('text/html');
  $req->print('Hello World!');

return OK;
} 

 


在HTTPD.CONF里做以下设置:

PerlModule example;
<LocationMatch "(service)$">
        SetHandler perl-script
        PerlHandler example
</LocationMatch> 

 


这样当用户访问http://yourhost/service的时候会被这个APACHE模块处理。

 

有什么用

其实这个话题是接续上篇文章 svn代码版本管理工具的,利用mod_perl 可以编写apache模块来实现自定义的authn与authz模块,以实现符合实际情况的鉴权功能。

posted @ 2014-06-06 08:30  x3d  阅读(1450)  评论(0编辑  收藏  举报