mod_perl 无法在 apache 下找到模块

问题描述 投票:0回答:1

我正在尝试按照此处指定的方式设置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.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

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;
apache perl mod-perl2
1个回答
0
投票

为 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 的信息也很有用。

© www.soinside.com 2019 - 2024. All rights reserved.