前言:某些目标初始化开销较大,例如从磁盘读取一个大文件,并关联到目标,可能耗时较久.在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<br><br> Copyright <br> Preface <br> What You Need to Know <br> Who This Book Is For <br> How This Book Is Organized <br> Reference Sections <br> Filesystem Conventions <br> Apache ...
6. **持续执行的Perl环境**:mod_perl创建了一个持久的Perl运行环境,使得Perl代码可以在多个请求之间保持状态,这对于开发需要保持会话和数据库连接的应用非常有利。 7. **模块化开发**:mod_perl支持使用Perl模块...
编译好的mod_perl.so v2.0.4 for Apache 2.2.11 and Perl 5.10.0,解决ppm安装无法得到正确mod_perl.so文件的问题。
《实用mod_perl》这本书是Perl开发者和Apache服务器管理员的重要参考资料。mod_perl是Apache HTTP服务器的一个模块,它将Perl语言深度集成到服务器内部,极大地提高了性能和效率,特别是对于处理动态内容时。本书...
然后,他们需要遵循Apache模块的一般构建和安装步骤,包括配置、编译和安装mod_perl到Apache的安装目录。在Apache的配置文件(如httpd.conf)中添加mod_perl的相关指令,使服务器在启动时加载这个模块。配置完成后,...
1. **mod_perl 1.x 和 mod_perl 2.x**: mod_perl 1.x主要面向Apache 1.x,而mod_perl 2.x则为Apache 2.x设计,后者引入了更多的改进和扩展,如支持Perl5.8及以上版本,更好的线程安全性和模块化结构。 2. **...
然后,我们将讨论mod_wl_24.so插件,这是Oracle WebLogic Server的Apache模块,用于在Apache和WebLogic之间建立代理。此插件允许Apache将HTTP请求转发到WebLogic集群,实现负载均衡和安全性增强。下载并安装mod_wl_...
第一步,下载mod_flvx.so和mod_h264_streaming.so并放到apache目录下的modules文件夹下 mod_flvx.so mod_h264_streaming.so 把这两个文件放到,apache的modules目录中,然后查找httpd.conf这个文件,打开编辑,找到...
### 如何实现Apache动态虚拟主机和激活mod_vhost_alias.so模块 #### 一、概述 在实际应用中,为了能够在一个服务器上同时运行多个网站,就需要用到虚拟主机技术。Apache HTTP Server支持多种类型的虚拟主机配置,...
- 脚本运行计数器可能超过5是因为Apache服务器在处理请求时可能会创建多个子进程。每个子进程都可能运行同一个Perl脚本,导致脚本的执行次数看起来超过了预期。 ##### 2. **第二个秘密:在reload时无规律的增长**...
第一步,下载mod_flvx.so和mod_h264_streaming.so并放到apache目录下的modules文件夹下 mod_flvx.so mod_h264_streaming.so 把这两个文件放到,apache的modules目录中,然后查找httpd.conf这个文件,打开编辑,找到...
Apache模块mod_concatx是针对网页优化的一个利器,它专门设计用于提高JavaScript和CSS文件的加载速度。这个模块通过合并多个JS和CSS文件为一个请求,减少了HTTP请求的数量,从而显著提升了网页的加载效率,这对于...
- **mod_perl**:一个使Perl脚本能够以模块的形式嵌入到Apache Web服务器中的工具,极大地提高了执行效率和扩展性。 - **Perl**:一种广泛用于Web开发、系统管理和其他脚本应用的高级编程语言。 #### 部分内容...
Apache的mod_rpaf模块是Apache HTTP服务器的一个扩展,专门用于在反向代理环境中解决服务器无法正确获取客户端真实IP地址的问题。在反向代理配置中,客户端请求首先到达代理服务器,然后代理服务器转发请求到实际的...
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....
该软件包是apache的httpd中mod_proxy.so、mod_proxy_http.so代理模块,分别对应包含linux、windows的版本。
8. **文件列表中的`Apache_mod_wsgi`**:这个文件可能包含Apache和mod_wsgi的安装文件,以及可能的配置示例和教程文档。解压后,按照文件说明进行安装和配置。 在Windows环境下部署Django项目,结合Apache和mod_...
Apache2.4服务器结合mod_jk.so模块是企业级Web应用部署中常见的一种技术组合,主要用于实现动静态资源的分离,提升服务器性能和系统效率。Apache作为强大的HTTP服务器,能够处理静态内容,如HTML、CSS、JavaScript等...