我正在尝试按照此处指定的方式设置mod_perl:Modperl设置手册,但我一开始就陷入困境,因为我还不太了解如何配置。将 Apache24 与 Strawberry Perl 5.32.1.1、Apache24 的 mod_perl 和 StrawberryPerl 5.32.1.1 一起使用,预编译的二进制文件均为 64 位。事实上,perl 二进制文件正在加载,但在尝试加载某些 .pm 时在运行时失败。我得到的错误来自 Perl。
在 Apache httpd.conf 中我添加以下部分
LoadFile "e:/perlpath/perl\bin\perl532.dll"
LoadModule perl_module modules/mod_perl.so
#SetHandler modperl
#PerlOptions +SetupEnv
以下配置用于加载PrintEnv模块:
PerlModule Apache::PrintEnv1
<Location /print_env1>
SetHandler perl-script
PerlResponseHandler Apache::PrintEnv1
</Location>
我在 e:/apache/Apache 中添加示例模块 PrintEnv1.pm。 Apache 无法启动并显示以下错误日志:
[Mon Nov 20 14:14:41.698220 2023] [perl:error] [pid 1148:tid 352]
Can't locate Apache/PrintEnv1.pm in @INC (you may need to install the Apache::PrintEnv1 module)
(@INC contains:
e:/perlpath/perl/site/lib
e:/perlpath/perl/vendor/lib
e:/perlpath/perl/lib
e:/apache) at (eval 2) line 1.\n
[Mon Nov 20 14:14:41.698220 2023] [perl:error] [pid 1148:tid 352]
Can't load Perl module Apache::PrintEnv1 for server localhost:80, exiting...
当我在 httpd.conf 中注释掉以下行
PerlModule Apache::PrintEnv1
时,apache 启动正常。但是当我在浏览器中运行 http://localhost/print_env1
时,我收到另一个运行时错误,需要 RequestRec.pm
[Mon Nov 20 14:25:17.540560 2023] [perl:error] [pid 25088:tid 1196] [client ::1:62051]
failed to resolve handler `Apache::PrintEnv1':
Can't locate Apache/RequestRec.pm
in @INC (you may need to install the Apache::RequestRec module)
(@INC contains:
e:/perlpath/perl/site/lib
e:/perlpath/perl/vendor/lib
e:/perlpath/perl/lib
e:/apache) at (eval 2) line 1.\n
#PerlModule Apache::PrintEnv1
<Location /print_env1>
SetHandler perl-script
PerlResponseHandler Apache::PrintEnv1
</Location>
RequestReq.pm 位于此处
e:/perlpath/perl\site\lib\Apache2
在 Modperl 安装手册中,模块被指定为 Apache/PrintEnv1.pm
,问题可能就在那里 use Apache::RequestRec ()
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;
例如指定了一些启动文件,但是当我添加启动文件时
PerlRequire "C:\apache\perl\startup.pl"
我收到以下错误[perl:error] [pid 27768:tid 336] Can't locate Apache2.pm in @INC
更新1:
我在这两个地方找到了Apache2.ph
e:/perlpath/perl\site\lib\APR\Request
e:/perlpath/perl\site\lib\Bundle
文件不相同,627 与 1868 字节。
这里是来自 Modperl 设置手册
的startup.pluse 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
use Apache::RequestRec ( );
use Apache::RequestIO ( );
use Apache::RequestUtil ( );
use Apache::Server ( );
use Apache::ServerUtil ( );
use Apache::Connection ( );
use Apache::Log ( );
use APR::Table ( );
use ModPerl::Registry ( );
use Apache::Const -compile => ':common';
use APR::Const -compile => ':common';
1;
为 Apache24 x64 和 StrawBerryPerl5.32.1.1 安装 mod_perl2 x64 时,部署在两个主文件夹中,例如 e: pachepath 和 e:\perlpath,它们是 Apache24 和 StrawberryPerl 5.32.1.1 的根目录。只是为了保持环境清洁,没有使用安装包,全部从 zip 存档预编译的二进制文件中解压。
我觉得发布我的解决方案是正确的事情,因为写了太多的事情而要做的事情太少,无法使其发挥作用。首先,它不再是 mod_perl,而是 mod_perl2。并且应该使用 mod_perl2 文档 来代替。对于以前从未处理过任何版本的 mod_perl 的用户来说,这并不是那么明显。
面临两个不同的问题,一个是关于使用 .pm 处理程序,另一个是关于加载startup.pl,通常命名为 Problem1 和 Problem2。请注意,问题1不需要使用startup.pl。
注意,不再需要关心
Can't locate blabla.pm in @INC
,一切都会自动消失,无需添加任何路径。
问题1
运行 .pm 处理程序。以下是添加到 httpd.conf 的更改
LoadFile "e:\perlpath\perl\bin\perl532.dll"
LoadModule perl_module modules/mod_perl.so
<Location /print_env1>
SetHandler perl-script
PerlResponseHandler MyApache2::PrintEnv1
</Location>
<Location /print_env2>
SetHandler modperl
PerlResponseHandler MyApache2::PrintEnv2
</Location>
PrintEnv1.pm 位于 e:pachepath\MyApache2
package MyApache2::PrintEnv2;
use strict;
use warnings;
use Apache2::RequestRec ( ); # for $r->content_type
use Apache2::Const -compile => ':common';
sub handler {
my $r = shift;
$r->content_type('text/plain');
for (sort keys %ENV) { print "$_ => $ENV{$_}\n"; }
return Apache2::Const::OK;
}
1;
PrintEnv2.pm 位于 e:pachepath\MyApache2
package MyApache2::PrintEnv2;
use strict;
use Apache2::RequestRec (); # for $r->content_type
use Apache2::RequestIO (); # for $r->print
use Apache2::Const -compile => ':common';
sub handler
{
my $r = shift;
$r->content_type ('text/plain');
$r->subprocess_env;
for (sort keys %ENV) { $r->print("$_ => $ENV{$_}\n"); }
return Apache2::Const::OK;
}
1;
问题解决了。现在从浏览器运行 http://localhost/print_env1 和 http://localhost/print_env2 将执行,不会记录错误。
如果我添加 PerlModule,几乎是一样的,但是 .pm 脚本是在 Apache 启动时解析的。因此,如果脚本出现问题,Apache 将无法启动。现在有什么是httpd.conf
LoadFile "e:\perlpath\perl\bin\perl532.dll"
LoadModule perl_module modules/mod_perl.so
PerlModule MyApache2::PrintEnv1
<Location /print_env1>
SetHandler perl-script
PerlResponseHandler MyApache2::PrintEnv1
</Location>
PerlModule MyApache2::PrintEnv2
<Location /print_env2>
SetHandler modperl
PerlResponseHandler MyApache2::PrintEnv2
</Location>
问题2
另一个问题是关于使用startup.pl。这是httpd.conf
LoadFile "e:\perlpath\perl\bin\perl532.dll"
LoadModule perl_module modules/mod_perl.so
#almost same as same as PerlRequire
PerlPostConfigRequire "e:\apachepath\perl\startup.pl"
注意,以上改动与问题1无关,可以单独考虑,也可以不考虑。 现在startup.pl应该对应于mod_perl2而不是mod_perl,并且可以从这里完全获取
use lib qw(/home/httpd/perl);
use ModPerl::Util ( ); #for CORE::GLOBAL::exit
use Apache2::RequestRec ( );
use Apache2::RequestIO ( );
use Apache2::RequestUtil ( );
use Apache2::ServerRec ( );
use Apache2::ServerUtil ( );
use Apache2::Connection ( );
use Apache2::Log ( );
use APR::Table ( );
use ModPerl::Registry ( );
use Apache2::Const -compile => ':common';
use APR::Const -compile => ':common';
1;
特别是关于 过渡到 mod_perl2 的信息也很有用。