55、mod_perl 2.0:安装与配置全解析

mod_perl 2.0:安装与配置全解析

一、mod_perl 2.0 优化概述

mod_perl 的重写为我们提供了一个基于多年经验构建更智能、更强健、更快速实现的机会。优化可在 mod_perl 源代码层面进行,也可通过优化 Perl 语法树在 Perl 空间实现,还可以是两者的结合。

二、mod_perl 2.0 安装指南

由于截至目前 mod_perl 2.0 尚未发布,安装说明可能会有一些变化,但基本步骤应该是相同的。在安装时请始终参考 mod_perl 文档以获取正确信息。

(一)从源代码安装
  1. 下载所需源代码
  2. 构建 Apache 2.0
    • 提取源代码
panic% tar -xzvf httpd-2.0.xx
如果你没有 GNU tar(1),请使用适当的工具和标志来提取源代码。
- **配置**:
panic% cd httpd-2.0.xx
panic% ./configure --prefix=/home/httpd/httpd-2.0 --with-mpm=prefork
调整 `--prefix` 选项到你希望安装 Apache 2.0 的目录。如果你想使用不同的 MPM,请调整 `--with-mpm` 选项。运行 `./configure --help` 可以查看 Apache 2.0 的所有配置选项。
- **构建并安装**:
panic% make && make install
  1. 构建 Perl(如果需要)
    如果你没有安装 Perl 5.6.0 或更高版本,或者需要重新构建它以启用某些编译时功能,或者要运行需要 Perl 5.8.0 的线程 MPM,则需要构建 Perl(这里假设构建 Perl 5.8.0)。
    • 提取源代码
panic% tar -xzvf perl-5.8.0.tar.gz
- **配置**:
panic% cd perl-5.8.0
panic% ./Configure -des -Dprefix=$HOME/perl/perl-5.8.0 -Dusethreads
此配置接受 Configure 脚本建议的所有默认值并生成简洁的输出。`-Dusethreads` 选项启用 Perl 线程。`-Dprefix` 选项指定自定义安装目录,你可以根据需要进行调整。
- **构建、测试并安装 Perl**:
panic% make && make test && make install
在继续安装 mod_perl 2.0 之前,建议至少将 LWP 包安装到新安装的 Perl 发行版中,以便稍后可以全面测试 mod_perl 2.0。可以使用 CPAN.pm 来完成此操作:
panic% $HOME/perl/perl-5.8.0/bin/perl -MCPAN -e 'install("LWP")'
  1. 安装 mod_perl 2.0
    • 提取源代码
panic% tar -xzvf mod_perl-2.0.x.tar.gz
- **配置**:
panic% cd mod_perl-2.0.x
panic% perl Makefile.PL MP_AP_PREFIX=/home/stas/httpd/prefork \
       MP_INST_APACHE2=1
`MP_AP_PREFIX` 选项指定已安装的 Apache 2.0 的基本目录,在该目录下可以找到包含 Apache C 头文件的 `include/` 目录。`MP_INST_APACHE2` 选项仅在同一 Perl 树中安装了 mod_perl 1.0 时才需要。
- **构建、测试并安装 mod_perl 2.0**:
panic% make && make test && make install
在 Win32 上,你必须使用 `nmake` 而不是 `make`,并且 `&&` 链在所有 Win32 平台上可能不起作用,因此应该这样做:
C:\modperl-2.0\> nmake
C:\modperl-2.0\> nmake test
C:\modperl-2.0\> nmake install
(二)安装二进制文件
  • Apache 2.0 二进制文件 :可从 http://httpd.apache.org/dist/binaries/ 获取。
  • Perl 5.6.1 或 5.8.0 二进制文件 :可从 http://cpan.org/ports/index.html 获取。
  • mod_perl 2.0 二进制文件 :截至目前,仅提供 Win32 平台的二进制文件,由 Randy Kobes 精心准备和维护。mod_perl 2.0 发布后,各种操作系统发行版将为其平台提供二进制版本。

对于 Win32 平台,有两种获取二进制 mod_perl 2.0 包的方法:
1. PPM 方式
对于 ActivePerl 用户,可以通过 PPM 进行安装。前提是你已经安装了 ActivePerl(版本 6xx 或更高),可从 http://www.activestate.com/ 获取,以及 Win32 Apache 2.0 二进制文件,可从 http://www.apache.org/dist/httpd/binaries/win32/ 获取。
- 一种简单的安装方法是:

C:\> ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl-2.ppd
- 如果你计划安装其他 Apache 模块,另一种方法是在 PPM  shell 实用程序中设置存储库:
PPM> set repository theoryx5
      http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer
对于 PPM3:
PPM> rep add theoryx5
      http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer
然后安装 mod_perl 2.0:
PPM> install mod_perl-2
此方法将必要的模块安装在 Perl 树的 `Apache2/` 子目录下,以免干扰 mod_perl 1.0 现有的 `Apache/` 目录。
  1. Apache/mod_perl 二进制文件
    ftp://theoryx5.uwinnipeg.ca/pub/other/ 可以找到一个名为 Apache2.tar.gz 的存档,其中包含带有 mod_perl 2.0 的 Apache 2.0 二进制版本。该存档解压到 Apache2 目录下,其中的 blib 子目录包含必要的 mod_perl 文件(通过 httpd.conf 中的 PerlSwitches 指令启用)。需要对 httpd.conf 进行一些编辑以反映安装目录的位置。
  2. Apache/mod_perl/Perl 5.8 二进制发行版
    由于 mod_perl 2.0 在诸如使用 win32 MPM 的 Apache 2.0 等线程环境中与 Perl 5.8 配合使用效果最佳,因此有一个包含 Perl 5.8、Apache 2.0 和 mod_perl 2.0 的包。在 ftp://theoryx5.uwinnipeg.ca/pub/other/ 中查找 perl-5.8-win32-bin.tar.gz 包,并将其解压到 C:\ ,这将为你提供一个包含 Apache 2.0 安装和 mod_perl 2.0 的 Apache2 目录,以及一个包含 Perl 安装的 Perl 目录(你应该将此 Perl 目录添加到你的路径中)。
三、mod_perl 2.0 配置详解

与 mod_perl 1.0 类似,要使用 mod_perl 2.0,需要在 httpd.conf 中添加一些配置设置。这些设置与 1.0 版本的设置非常相似,但有些指令被重命名,并且添加了新的指令。

(一)启用 mod_perl

要将 mod_perl 作为 DSO 启用,请在 httpd.conf 中添加以下内容:

LoadModule perl_module modules/mod_perl.so

此设置指定了 mod_perl 模块相对于 ServerRoot 设置的位置,因此你应该将其放在指定 ServerRoot 之后的某个位置。

Win32 用户需要确保 Perl 二进制文件的路径(例如 C:\Perl\bin )在 PATH 环境变量中。你还可以在 httpd.conf 中添加以下指令来加载你的 Perl DLL:

LoadFile "/Path/to/your/Perl/bin/perl5x.dll"
(二)访问 mod_perl 2.0 模块

为了防止你意外加载 mod_perl 1.0 模块,mod_perl 2.0 的 Perl 模块安装在 Apache2/ 下的专用目录中。 Apache2 模块会将 mod_perl 2.0 库的位置添加到 @INC 前面: @INC 与核心 @INC 相同,但前面添加了 Apache2/ 。此模块必须在启用 mod_perl 后立即加载。可以在启动文件中使用以下代码实现:

use Apache2 ( );

如果你不使用启动文件,可以在 httpd.conf 中添加:

PerlModule Apache2
(三)启动文件

通常会加载一个包含 Perl 代码的启动文件:

PerlRequire "/home/httpd/httpd-2.0/perl/startup.pl"

它用于调整 @INC 中的 Perl 模块搜索路径、预加载常用模块、预编译常量等。以下是一个典型的 mod_perl 2.0 的 startup.pl 文件示例:

use Apache2 ( );
use lib qw(/home/httpd/perl);
# enable if the mod_perl 1.0 compatibility is needed
# use Apache::compat ( );
# preload all mp2 modules
# use ModPerl::MethodLookup;
# ModPerl::MethodLookup::preload_all_modules( );
use ModPerl::Util ( ); #for CORE::GLOBAL::exit

在这个文件中,加载了 Apache2 模块,这样就可以找到 2.0 模块。之后,调整 @INC 以包含包含 Perl 模块的非标准目录:

use lib qw(/home/httpd/perl);

如果你需要使用向后兼容层以获取尚未移植到与 mod_perl 2.0 一起使用的 1.0 模块,请加载 Apache::compat

use Apache::compat ( );

接下来,预加载常用的 mod_perl 2.0 模块并预编译常用常量。你可以通过取消注释以下两行来预加载所有 mod_perl 2.0 模块:

use ModPerl::MethodLookup;
ModPerl::MethodLookup::preload_all_modules( );

最后, startup.pl 文件必须以 1; 结尾。

(四)Perl 的命令行开关

现在你可以在 httpd.conf 中使用 PerlSwitches 指令传递 Perl 的命令行开关,而无需使用复杂的变通方法。
- 例如,要启用警告和污点检查,请添加:

PerlSwitches -wT
  • -I 命令行开关可用于调整 @INC 值:
PerlSwitches -I/home/stas/modperl

你可以使用此技术为不同的虚拟主机设置不同的 @INC 值。

四、mod_perl 2.0 核心处理程序

mod_perl 2.0 提供了两种类型的核心处理程序: modperl perl-script

(一)modperl 处理程序

modperl 处理程序的配置如下:

SetHandler modperl

这是一种基本的 mod_perl 处理程序类型,它只是调用 Perl*Handler 的回调函数。如果你不需要 perl-script 处理程序提供的功能,使用 modperl 处理程序可以获得更高的性能(此处理程序在 mod_perl 1.0 中不可用)。

除非在 modperl 处理程序下运行的 Perl*Handler 回调配置为:

PerlOptions +SetupEnv

或者调用:

$r->subprocess_env;

否则,通过 %ENV 只能访问以下环境变量:
- MOD_PERL GATEWAY_INTERFACE (始终可用)
- PATH TZ (如果你在 shell 或 httpd.conf 中定义了它们)

因此,如果你只是想从 httpd.conf 传递一些配置变量而不想增加填充 %ENV 的开销,请考虑使用 PerlSetVar PerlAddVar 而不是 PerlSetEnv PerlPassEnv

(二)perl-script 处理程序

perl-script 处理程序的配置如下:

SetHandler perl-script

大多数 mod_perl 处理程序使用 perl-script 处理程序。以下是一些需要注意的事项:
- 除非指定 PerlOptions -GlobalRequest ,否则 PerlOptions +GlobalRequest 生效。
- 除非指定 PerlOptions -SetupEnv ,否则 PerlOptions +SetupEnv 生效。
- STDOUT STDIN 绑定到请求对象 $r ,这使得可以通过 print() 直接从 STDIN 读取并打印到 STDOUT ,而无需使用隐式调用(如 $r->print() )。
- 在调用处理程序之前,会保存几个特殊的全局 Perl 变量,并在处理程序调用后恢复(与 mod_perl 1.0 相同),这些变量包括 %ENV @INC $/ 以及 STDOUT $| END 块。

(三)简单响应处理程序示例

以下是一个简单的 mod_perl 响应处理程序示例,用于演示 modperl perl-script 核心处理程序之间的差异。

perl-script 处理程序配置

PerlModule Apache::PrintEnv1
<Location /print_env1>
    SetHandler perl-script
    PerlResponseHandler Apache::PrintEnv1
</Location>

Apache::PrintEnv1.pm 文件内容如下:

package Apache::PrintEnv1;
use strict;
use warnings;
use Apache::RequestRec ( ); # for $r->content_type
use Apache::Const -compile => 'OK';
sub handler {
    my $r = shift;
    $r->content_type('text/plain');
    for (sort keys %ENV){
        print "$_ => $ENV{$_}\n";
    }
    return Apache::OK;
}
1;

现在向 http://localhost/print_env1 发出请求,你应该会看到所有环境变量被打印出来。

modperl 核心处理程序配置

PerlModule Apache::PrintEnv2
<Location /print_env2>
    SetHandler modperl
    PerlResponseHandler Apache::PrintEnv2
</Location>

Apache::PrintEnv2.pm 文件内容如下:

package Apache::PrintEnv2;
use strict;
use warnings;
use Apache::RequestRec ( ); # for $r->content_type
use Apache::RequestIO ( );  # for $r->print
use Apache::Const -compile => 'OK';
sub handler {
    my $r = shift;
    $r->content_type('text/plain');
    $r->subprocess_env;
    for (sort keys %ENV){
        $r->print("$_ => $ENV{$_}\n");
    }
    return Apache::OK;
}
1;

http://localhost/print_env2 发出请求,你应该会看到与 http://localhost/print_env1 相同的环境变量被打印出来。

五、PerlOptions 指令

PerlOptions 指令为第一代 mod_perl 中仅在编译时可用的选项提供了细粒度的配置。它还可以控制为 <VirtualHost> 或使用 <Location> <Directory> 等配置的位置使用哪种类型的 PerlInterpreter

以下是一些常用的 PerlOptions 选项:
| 选项 | 描述 |
| ---- | ---- |
| +Enable | 默认开启,可用于禁用给定 <VirtualHost> 的 mod_perl。 |
| +Clone | 共享父 Perl 解释器,但为 <VirtualHost> 提供自己的解释器池。 |
| +Parent | 为给定 <VirtualHost> 创建一个新的父 Perl 解释器,并为其提供自己的解释器池(隐含 Clone 选项)。 |
| -Perl*Handler | 禁用特定的 Perl*Handler (默认情况下,所有编译的处理程序都已启用)。 |
| +AutoLoad | 在启动时解析 Perl*Handler ;如果模块尚未加载,则从磁盘加载它们。 |
| +GlobalRequest | 设置全局 Apache::RequestRec 对象以供 Apache->request 使用。 |
| +ParseHeaders | 扫描输出以查找 HTTP 标头。 |
| +MergeHandlers | 开启 Perl*Handler 数组的合并。 |
| +SetupEnv | 为每个请求设置环境变量。 |

六、线程模式特定指令

以下指令仅在使用线程 MPM 的 mod_perl 中启用:
- PerlInterpStart :启动时克隆的解释器数量。
- PerlInterpMax :如果所有正在运行的解释器都在使用中,mod_perl 将克隆新的解释器来处理请求,直到达到此解释器数量。达到 PerlInterpMax 后,mod_perl 将阻塞,直到有一个解释器可用。
- PerlInterpMinSpare :在请求到来之前,此参数将克隆的可用解释器的最小数量。
- PerlInterpMaxSpare :当正在使用的解释器可用时,mod_perl 将解释器数量减少到这个数量。
- PerlInterpMaxRequests :一个解释器应该处理的最大请求数。达到此数量后,解释器将被销毁并替换为一个新的克隆。
- PerlInterpScope :在使用线程 MPM 的请求由 mod_perl 处理时,必须从解释器池中取出一个解释器。该解释器随后仅对选择它的线程可用,直到它被释放回解释器池。默认情况下,解释器将在请求的生命周期内保持占用,相当于配置为 PerlInterpScope request 。也可以将解释器范围配置为每个子请求: PerlInterpScope subrequest

通过以上详细的安装和配置步骤,你可以成功部署和使用 mod_perl 2.0,并根据自己的需求进行灵活配置。希望这些内容对你有所帮助!

mod_perl 2.0:安装与配置全解析

七、配置示例及流程梳理

为了让大家更清晰地理解整个 mod_perl 2.0 的安装与配置过程,下面梳理一下流程并给出一个综合配置示例。

(一)安装与配置流程
graph TD
    A[下载源代码] --> B[构建 Apache 2.0]
    B --> C{是否需要构建 Perl}
    C -- 是 --> D[构建 Perl]
    C -- 否 --> E[安装 mod_perl 2.0]
    D --> E
    E --> F{是否为 Win32 平台}
    F -- 是 --> G[选择二进制安装方式]
    F -- 否 --> H[配置 httpd.conf]
    G --> H
    H --> I[启用 mod_perl]
    I --> J[访问 mod_perl 2.0 模块]
    J --> K[设置启动文件]
    K --> L[设置 Perl 命令行开关]
    L --> M[配置核心处理程序]
    M --> N[设置 PerlOptions 指令]
    N --> O{是否为线程 MPM}
    O -- 是 --> P[设置线程模式特定指令]
    O -- 否 --> Q[完成配置]
    P --> Q
(二)综合配置示例

假设我们要在一个使用 prefork MPM 的 Apache 2.0 服务器上安装 mod_perl 2.0,并配置一个简单的响应处理程序。

  1. 安装步骤
    • 下载 Apache 2.0、mod_perl 2.0 和 Perl 5.8.0 的源代码。
    • 构建 Apache 2.0:
tar -xzvf httpd-2.0.xx
cd httpd-2.0.xx
./configure --prefix=/home/httpd/httpd-2.0 --with-mpm=prefork
make && make install
- 构建 Perl 5.8.0:
tar -xzvf perl-5.8.0.tar.gz
cd perl-5.8.0
./Configure -des -Dprefix=$HOME/perl/perl-5.8.0 -Dusethreads
make && make test && make install
- 安装 LWP 包:
$HOME/perl/perl-5.8.0/bin/perl -MCPAN -e 'install("LWP")'
- 安装 mod_perl 2.0:
tar -xzvf mod_perl-2.0.x.tar.gz
cd mod_perl-2.0.x
perl Makefile.PL MP_AP_PREFIX=/home/stas/httpd/prefork \
       MP_INST_APACHE2=1
make && make test && make install
  1. 配置 httpd.conf
# 启用 mod_perl
LoadModule perl_module modules/mod_perl.so

# 加载 Perl DLL(Win32 平台需要)
# LoadFile "/Path/to/your/Perl/bin/perl5x.dll"

# 访问 mod_perl 2.0 模块
PerlModule Apache2

# 设置启动文件
PerlRequire "/home/httpd/httpd-2.0/perl/startup.pl"

# 设置 Perl 命令行开关
PerlSwitches -wT -I/home/stas/modperl

# 配置核心处理程序
PerlModule Apache::PrintEnv1
<Location /print_env1>
    SetHandler perl-script
    PerlResponseHandler Apache::PrintEnv1
</Location>

# 设置 PerlOptions 指令
<VirtualHost *:80>
    ServerName example.com
    PerlOptions +AutoLoad +GlobalRequest +SetupEnv
</VirtualHost>
  1. 启动文件 startup.pl
use Apache2 ( );
use lib qw(/home/httpd/perl);
# enable if the mod_perl 1.0 compatibility is needed
# use Apache::compat ( );
# preload all mp2 modules
# use ModPerl::MethodLookup;
# ModPerl::MethodLookup::preload_all_modules( );
use ModPerl::Util ( ); #for CORE::GLOBAL::exit
1;
  1. 响应处理程序 Apache::PrintEnv1.pm
package Apache::PrintEnv1;
use strict;
use warnings;
use Apache::RequestRec ( ); # for $r->content_type
use Apache::Const -compile => 'OK';
sub handler {
    my $r = shift;
    $r->content_type('text/plain');
    for (sort keys %ENV){
        print "$_ => $ENV{$_}\n";
    }
    return Apache::OK;
}
1;
八、性能优化与注意事项

在使用 mod_perl 2.0 时,我们可以通过一些方法来优化性能,并注意一些可能出现的问题。

(一)性能优化
  1. 选择合适的核心处理程序
    • 如果不需要 perl-script 处理程序提供的额外功能,使用 modperl 处理程序可以减少开销,提高性能。
  2. 合理使用 PerlOptions 指令
    • 启用 AutoLoad 选项可以在启动时加载所需的模块,避免在请求时加载模块的延迟。
    • 对于不需要填充 %ENV 的处理程序,禁用 SetupEnv 选项可以减少每个请求的开销。
  3. 线程 MPM 优化
    • 合理设置线程模式特定指令,如 PerlInterpStart PerlInterpMax 等,可以确保在高并发情况下,服务器能够高效地处理请求。
(二)注意事项
  1. 兼容性问题
    • 虽然 mod_perl 2.0 提供了向后兼容层 Apache::compat ,但并不是所有的 mod_perl 1.0 模块都能完全兼容。在使用时需要进行测试。
  2. 环境变量问题
    • 在使用 modperl 处理程序时,要注意 %ENV 的填充情况,避免因环境变量未正确设置而导致的问题。
  3. Win32 平台问题
    • 在 Win32 平台上,要确保 Perl 二进制文件的路径在 PATH 环境变量中,并且正确加载 Perl DLL。
九、常见问题解答

在安装和配置 mod_perl 2.0 的过程中,可能会遇到一些常见问题,下面为大家解答。

(一)安装问题
  1. 问题 :在构建 Apache 2.0 时,出现依赖库缺失的错误。
    解答 :根据错误信息安装相应的依赖库,例如,如果缺少 APR 库,可以从 http://apr.apache.org/ 下载并安装。
  2. 问题 :在安装 mod_perl 2.0 时, make test 失败。
    解答 :检查 Perl 环境是否正确配置,确保 LWP 等必要的模块已经安装。也可以查看测试日志,根据具体错误信息进行排查。
(二)配置问题
  1. 问题 :在启用 mod_perl 后,访问 mod_perl 脚本时出现 500 错误。
    解答 :检查 httpd.conf 中的配置是否正确,确保 LoadModule PerlModule 等指令设置正确。查看 Apache 错误日志,获取更详细的错误信息。
  2. 问题 :在使用 modperl 处理程序时, %ENV 中没有所需的环境变量。
    解答 :可以在 Perl*Handler 回调中调用 $r->subprocess_env 或配置 PerlOptions +SetupEnv
十、总结

mod_perl 2.0 为我们提供了一个强大而灵活的平台,用于在 Apache 服务器上运行 Perl 脚本。通过本文详细的安装和配置指南,你可以成功地在自己的服务器上部署 mod_perl 2.0,并根据实际需求进行优化。在使用过程中,要注意兼容性、环境变量等问题,并根据性能优化建议来提高服务器的性能。希望本文能帮助你更好地使用 mod_perl 2.0。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值