mod_perl无法在apache下找到模块

mlmc2os5  于 11个月前  发布在  Perl
关注(0)|答案(1)|浏览(168)

我试图设置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\Apache2Modperl 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;

db2dz4w8

db2dz4w81#

在安装mod_perl2 x64 for Apache24 x64和StrawBerryPerl 5.32.1.1时,部署在两个主文件夹中,例如e:\apachepathe:\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处理程序。

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:\apachepath\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:\apachepath\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将无法启动。

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的。

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,可以取entirely from here

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;


特别是关于transition to mod_perl2的信息也很有用。

相关问题