我试图设置mod_perl像这里指定的:Modperl setup manual,我在一开始就卡住了,因为我还没有很好地理解如何配置。使用Apache 24与草莓Perl 5.32.1.1,mod_perl为Apache 24和StrawberryPerl 5.32.1.1,预编译的二进制文件都是64位。事实上,perl二进制文件正在加载,但是在运行时尝试加载一些. pm时失败。我得到的错误来自Perl。
在Apachehttpd.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 setup manual中,模块被指定为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字节。
这里是startup.pl从Modperl setup manual
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
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;
型
1条答案
按热度按时间db2dz4w81#
在安装mod_perl2 x64 for Apache24 x64和StrawBerryPerl 5.32.1.1时,部署在两个主文件夹中,例如
e:\apachepath
和e:\perlpath
,它们是Apache24和StrawBerryPerl 5.32.1.1的根文件夹。为了保持环境清洁,没有使用安装包,所有都是从zip存档中解压缩的预编译二进制文件。我觉得是正确的事情来发布我的解决方案,因为太多的东西写了太少的事情要做,使它工作。首先,它不再是mod_perl,而是mod_perl2。应该使用mod_perl2 documentation代替。这对于从未处理过任何版本的mod_perl的用户来说并不明显。
面对两个不同的问题,一个是关于使用.pm处理程序,另一个是关于加载startup.pl,通常命名为Problem1和Problem2。注意,Problem1不需要使用startup.pl。
注意,没有必要再关心
Can't locate blabla.pm in @INC
,所有的都自动消失了,没有任何路径添加。问题1
运行.pm处理程序。
字符串
PrintEnv1.pm位于e:\apachepath\MyApache2
型
PrintEnv2.pm位于e:\apachepath\MyApache2
型
问题解决。现在从浏览器运行http://localhost/print_env1和http://localhost/print_env2将执行,没有错误记录。
如果我添加PerlModule,几乎是一样的,但是.pm脚本是在Apache启动时解析的。所以,如果脚本有任何问题,Apache将无法启动。
型
问题2
另一个问题是关于使用startup.pl的。
型
注意,以上修改与问题1无关,可以单独取,也可以不取。现在的startup.pl,应该对应mod_perl2而不是mod_perl,可以取entirely from here
型
特别是关于transition to mod_perl2的信息也很有用。