`
sealbird
  • 浏览: 572097 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

定制Apache的防盗链模块 Mod_perl<0> Mod_perl多进程预创建目标

    博客分类:
  • perl
阅读更多
前言:某些目标初始化开销较大,例如从磁盘读取一个大文件,并关联到目标,可能耗时较久.在CGI环境下,每个请求都要new()一次目标,就会性能低下.而mod_perl的多进程预创建目标模式,可以很好的解决这个问题.

(一)安装mod_perl
这里使用主流的apache2.0和modperl2版本.

默认安装的Apache2都支持DSO方式加载第三方模块,在编译modperl2时只须指定对应的apxs即可.

另外Perl对线程的支持一直有问题,因此Apache2在编译时最好指定以prefork方式运行(--with-mpm=prefork).

从http://perl.apache.org/download/下载modperl,解开后进入其目录,如下安装:

perl Makefile.PL MP_APXS=/path/apache2/bin/apxs
make
make test
make install

这里假设apache2.0已安装在/path/apache2下.检查/path/apache2/conf/httpd.conf,确认modperl安装后添加了该行:

LoadModule perl_module modules/mod_perl.so

表示Apache启动时加载mod_perl模块.

(二)安装Apache2::Request
Apache2::Request是包含modperl2下的请求处理方式的类库.它的作用类似于CGI.pm,但用C语言写成,比CGI.pm快很多.

以root用户运行CPAN shell: perl -MCPAN -e shell

然后在CPAN shell里输入: install Apache2::Request 进行安装.安装过程中一般会有提示,须手工指定apache2的apxs文件的路径.如果在make test时不成功,那么force install即可:

cpan>look Apache2::Request
# install Apache2::Request

安装完后修改apache2的httpd.conf,增加一行如下:

LoadModule apreq_module    modules/mod_apreq2.so

表示Apache启动时加载mod_apreq2模块.

另外,设置LD_LIBRARY_PATH环境变量,对Linux系统,最简单的做法是在/etc/ld.so.conf里加进:

/usr/local/lib  #默认make install的libapreq2安装在/usr/local下
/path/apache2/lib  #apache2安装目录

然后执行ldconfig使其生效.

最后restart apache,查看error_log,若有如下提示:

Apache/2.0.59 (Unix) mod_apreq2-20051231/2.6.0 mod_perl/2.0.3 Perl/v5.8.5 configured

则表示modperl2和Apache2::Request已安装成功(当然httpd.conf里的ServerTokens须设置为Full).

(三)开始编程之前
在开始modperl编码之前,需要做一些基本的配置工作.

首先在/path/apache2下创建一个子目录,该目录用于存放自己编写的modperl库文件,并且将该目录添加进modperl运行环境的@INC变量.这个变量包含了modperl需要引用的库路径.

mkdir /path/apache2/run

这里假设创建的子目录名为run.将run添加进modperl的@INC有好几种方法,一般的做法是写进modperl的启动配置文件(通常名为startup.pl).startup.pl还会预加载一些modperl常用类库,这些类库会被多个Apache子进程共享,避免启动后的重复加载.

在run子目录下,创建startup.pl,内容如下:

use strict;

use lib qw(/path/apache2/run);
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Request ();

1;

use lib这一行即将run子目录添加进modperl运行环境的@INC中.
其他三个Apache2::*库是modperl2常用的几个类库.Apache2::*名字空间下有很多类库,除上述外,还有:

Apache2::Connection ();
Apache2::RequestUtil ();
Apache2::ServerUtil ();
Apache2::ServerRec ();
Apache2:og ();

之类...详情可参考它们在cpan上的文档.

不要忘记最后的那个1,它表示返回一个真值给调用者.

修改httpd.conf,增加一行:

PerlPostConfigRequire /path/apache2/run/startup.pl

表示在Apache启动过程中,(尽可能晚的)执行上述modperl配置脚本.

补充一点,在手工运行modperl脚本时,由于@INC不包含这个目录,就会造成问题.可以在运行脚本前,

export PERL5LIB=/path/apache2/run

来解决问题.但每次都敲这个命令也很烦,因此直接将这句写进/etc/profile,就一劳永逸了.

(四)创建一个目标
从CPAN下载安装本人所写的IP::ChinaISP模块,该模块的作用是对指定的中国IP,返回对应的ISP.因为在中国,不同ISP之间的互联互通非常慢,所以利用该模块,可实现一些基于用户访问IP的CDN系统.

模块使用方法很简单:

use IP::ChinaISP;
my $cnisp = IP::ChinaISP->new;
my $isp = $cnisp->ip_isp('12.34.56.78');

$isp变量即存储了12.34.56.78这个IP对应的ISP(如果有的话).

IP::ChinaISP->new表示创建一个对象,这个过程中,会解析IP-ISP的数据文件,并将数据绑定到对象,因此耗时较久.测试了1000次new()过程,平均每次创建对象耗时16.103毫秒.若用该模块提供CGI web服务,则每个用户请求都会创建一个对象,效率无疑低下.

下面描述如何利用modperl来提高效率.

(五)mod_perl的多进程预创建目标
在mod_perl环境下,Apache启动时可以预创建目标,并且该目标在Apache fork子进程时,被所有子进程复制一份.这样在每个子进程里,直接使用已创建好的目标,不用重复创建.

前面已经描述,可以在startup.pl里预加载类库,同样也可以在这个文件里预创建目标.但是,简单在startup.pl里写:

use IP::ChinaISP;
our $cnisp = IP::ChinaISP->new;

不行.由于没有独立的包空间,从外部无法访问这个对象.

因此,有必要把创建目标的陈述放在独立的package里.前面已经定义好/path/apache2/run为modperl运行的库目录,在该目录下创建package即可.如下执行:

cd /path/apache2/run
mkdir IP
cd IP
vi Initdb.pm

Initdb.pm即为初始化目标的package,内容如下:

package IP::Initdb;
use strict;
use IP::ChinaISP;

our $cnisp = IP::ChinaISP->new;
sub initdb { $cnisp }

1;

这里的our $cnisp = IP::ChinaISP->new;即表示创建IP::ChinaISP对象,并将其储藏在包变量$cnisp里.然后在外部可以直接通过包变量来访问这个对象,或通过方法initdb来返回对象.

修改startup.pl,加进一句:

use IP::Initdb;

这样在Apache启动时,对象就被创建好,并复制到所有Apache子进程.

(六)如何使用预创建目标
可以在自定义的Apache处理器里,使用上述对象.假设对目标站点的/iploc路径的请求,都由自己的Apache handler来处理,则如下做.

修改httpd.conf,加进如下配置:

<Location /iploc>
  SetHandler modperl
  PerlResponseHandler IP:uery
</Location>

IP:uery即是一个modperl处理器,它同样位于前面定义好的库目录/path/apache2/run下.

进入/path/apache2/run/IP,创建Query.pm,内容如下:

package IP:uery;

use strict;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Const -compile => qw(OK);
use Apache2::Request ();
use IP::Initdb;

sub handler {
    my $r = shift;
    my $req = Apache2::Request->new($r);
    my $ip = $req->param('ip');

    my $cnisp = IP::Initdb->initdb;
    my $isp = $cnisp->ip_isp($ip);

    $r->content_type('text/plain');
    $r->print($isp);

    return Apache2::Const::OK;
}

1;

my $cnisp = IP::Initdb->initdb;表示获取预创建目标.my $isp = $cnisp->ip_isp($ip);表示调用目标方法,根据IP取得ISP.

配置好上述所有后,restart Apache.然后从浏览器发布请求,例如:

http://example.com/iploc/?ip=202.96.128.68

可看到返回结果.

该WEB服务效率极高,用Apache自带的压力测试工具ab进行测试,共发起100个请求,并发10个,全部处理完只用了0.125秒.测试结果摘录如下:

Document Path:          /iploc/?ip=202.96.128.68
Document Length:        11 bytes

Concurrency Level:      10
Time taken for tests:   0.125 seconds
Complete requests:      100
Failed requests:        0
Broken pipe errors:     0
Total transferred:      19500 bytes
HTML transferred:       1100 bytes
Requests per second:    800.00 [#/sec] (mean)
Time per request:       12.50 [ms] (mean)
Time per request:       1.25 [ms] (mean, across all concurrent requests)
Transfer rate:          156.00 [Kbytes/sec] received
分享到:
评论

相关推荐

    Practical Mod Perl

    Practical Mod Perl&lt;br&gt;&lt;br&gt; Copyright &lt;br&gt; Preface &lt;br&gt; What You Need to Know &lt;br&gt; Who This Book Is For &lt;br&gt; How This Book Is Organized &lt;br&gt; Reference Sections &lt;br&gt; Filesystem Conventions &lt;br&gt; Apache ...

    mod_perl Perl模块

    mod_perl Apache的Perl模块

    mod_perl.so

    编译好的mod_perl.so v2.0.4 for Apache 2.2.11 and Perl 5.10.0,解决ppm安装无法得到正确mod_perl.so文件的问题。

    practical mod_perl

    practical mod_perl, 不用多说了,下就是了

    apache flv mp4伪流模块mod_flvx.so mod_h264_streaming.so(附教程)

    第一步,下载mod_flvx.so和mod_h264_streaming.so并放到apache目录下的modules文件夹下 mod_flvx.so mod_h264_streaming.so 把这两个文件放到,apache的modules目录中,然后查找httpd.conf这个文件,打开编辑,找到...

    apache 采用C语言的模块开发

    &lt;br&gt;我在改造APACHE服务器授权访问时,需要对不合法的客户端请求进行过滤。对不合法请求需要立即发送一个错误提示页面给客户端。&lt;br&gt;发送错误提示页面的程序片断如下:&lt;br&gt; //非法请求作错误跳转&lt;br&gt; char *location...

    Apache2.4的h264和flvx模块(mod_flvx.so和mod_h264_streaming.so)

    apache+Windows配置flv,mp4视频支持随意拖动 配置成功,亲测可用,注意对应版本!!! 压缩包内目录: mod_flvx-0.4-Apache-2.4.x-vc14-x64.zip mod_flvx-0.4-Apache-2.4.x-vc14-x86.zip mod_flvx-0.4-Apache-2.4....

    mysql5.1中文手册

    在同一个数据库中创建多个表的缺陷&lt;br&gt;7.5. 优化MySQL服务器&lt;br&gt;7.5.1. 系统因素和启动参数的调节&lt;br&gt;7.5.2. 调节服务器参数&lt;br&gt;7.5.3. 控制查询优化器的性能&lt;br&gt;7.5.4. 编译和链接怎样影响MySQL的速度&lt;br&gt;7.5.5. ...

    MYSQL

    &lt;br&gt;4.9 MIT-pthreads 注意事项 &lt;br&gt;4.10 Perl 安装说明 &lt;br&gt;4.10.1 在Unix操作系统上安装 Perl &lt;br&gt;4.10.2 在 Win32上安装 ActiveState Perl &lt;br&gt;4.10.3 在 Win32 上安装 MySQL Perl 分发 &lt;br&gt;4.10.4 使用 Perl ...

    spark 并行加载 greenplum 数据

    &lt;groupId&gt;org.apache.spark&lt;/groupId&gt; &lt;artifactId&gt;spark-core_2.11&lt;/artifactId&gt; &lt;version&gt;2.3.1&lt;/version&gt; &lt;/dependency&gt; &lt;!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql --&gt; ...

    Tomcat5027_Apache2048_IMS9_win.zip

    &lt;br&gt;mod_jk2.so&lt;br&gt;这是保证Apache和Tomcat成功运行的关键一步,将它解压到本地硬盘中。从解压文件夹中将mod_jk2.so拷贝到Apache安装目录的modules目录下(C:\ Apache2\modules)。&lt;br&gt;用文本编辑工具打开Apache安装...

    Weblogic整合Apache mod_wl_24.so

    Apache整合Weblogic,针对weblogic12.1.2,apache2.4版的mod_wl_24.so

    apache mod_rpaf模块,获取反响代理真实IP

    apache mod_rpaf模块,获取反响代理真实IP,再也不用担心apache被反向代理获取不到真实IP了。爽歪歪

    apache视频流插件mod_flvx.so mod_h264_streaming.so两个

    第一步,下载mod_flvx.so和mod_h264_streaming.so并放到apache目录下的modules文件夹下 mod_flvx.so mod_h264_streaming.so 把这两个文件放到,apache的modules目录中,然后查找httpd.conf这个文件,打开编辑,找到...

    mod_perl docs

    apache主页上关于mod_perl的离线文档,E文

    mod_wl_22.so

    mod_wl_XX.so是apache用于代理weblogic的编译so文件,压缩包中包含的mod_wl_24和mod_wl_22分别用于apache2.4和apache2.2版本,mod_wl_24又包含有64位和32位版本,mod_wl_22包含32位,安装上传时请选择相应版本。...

    Spring-Boot集成Neo4j结合Spark的朴素贝叶斯分类器实现基于电影知识图谱的智能问答系统

    &lt;groupId&gt;org.apache.spark&lt;/groupId&gt; &lt;artifactId&gt;spark-core_2.12&lt;/artifactId&gt; &lt;version&gt;2.4.0&lt;/version&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-log4j12&lt;/...

    apache+tomcat+mod_jk

    apache+tomcat+mod_jk整合文档,内有安装包。apache+tomcat+mod_jk整合文档,内有安装包。

    php配置+mysqlAdmin配置+apache配置的实现教程

    windows 使用配置总结(此教程的讲解一定要注意版本,不同的版本一下会告诉有不同的配置 )路径也要十分注意&lt;br&gt;&lt;br&gt;&lt;br&gt;1)apache的安装祥解:安装路径为(D:\tianya\www\Apache) 注意:安装路径中尽量不要有空格和...

    Linux环境数据库管理员指南

    DB2 173&lt;br&gt;6.3.1 进行安装 174&lt;br&gt;6.3.2 检验安装 180&lt;br&gt;6.4 配置Control Center 182&lt;br&gt;6.5 安装DB2客户机 184&lt;br&gt;6.6 配置DB2客户机与DB2服务器通信 188&lt;br&gt;6.7 小结 194&lt;br&gt;6.8 常见问答 195&lt;br&gt;第7章 在Linux...

Global site tag (gtag.js) - Google Analytics