无法加载“C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll”
Posted
技术标签:
【中文标题】无法加载“C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll”【英文标题】:Can't load 'C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll' 【发布时间】:2016-11-03 22:11:29 【问题描述】:我正在运行 Windows Server 2008 R2 Enterprise,安装了 Apache 服务器并安装了 mod_perl 和 mod_ssl 我刚刚安装了 Apache2::ModSSL,但我无法为此使用 cpan,不得不使用 nmake 编译它。 CPAN 在此服务器上无法正常工作,我无法更改。 通过 https 调用的 perl 脚本稍后应该能够访问客户端用来进行身份验证的证书,这就是为什么我想使用 Apache2::ModSSL 来访问 SSL 变量。
当我在实施后尝试访问我的测试脚本时
use Apache2::ModSSL;
我从服务器收到 HTTP500 错误。 服务器错误日志状态
[Fri Jul 01 15:01:58 2016] [error] [client 10.217.139.184] failed to resolve handler `ssl::hello': Can't load 'C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll' for module Apache2::ModSSL: load_file:The specified module could not be found at C:/Apache/Perl/lib/XSLoader.pm line 68.\n at C:/Apache/Perl/site/lib/Apache2/ModSSL.pm line 8\nCompilation failed in require at ssl/hello.pm line 7.\nBEGIN failed--compilation aborted at ssl/hello.pm line 7.\nCompilation failed in require at (eval 3) line 3.\n
当我检查文件位置时,ModSSL.dll 恰好存储在此路径中。我还检查了文件访问权限,并授予所有用户、系统、管理员等完全访问权限。Apache 被重新启动了多次,它没有改变任何东西。 当我尝试在 cmd 中执行它时,显然没有要检查的连接,但我可以执行
use Apache2::ModSSL;
print Apache2::ModSSL->VERSION;
没有问题。 如何解决在 Apache 中加载模块的问题?
服务器自述文件状态
这是 Perl 5.8.7 的 Win32 和 Apache 的二进制发行版 2.0.54,连同 mod_perl-2.0.1、mod_ssl / OpenSSL (0.9.7g) 和 php-4.3.11,均使用 VC++ 6.0 (SP5) 构建。
cl -version
状态
Microsoft (R) 32 位 C/C++ 优化编译器版本 15.00.30729.01 用于 80x86
nmake -version
状态
Microsoft (R) 程序维护实用程序版本 9.00.30729.01
【问题讨论】:
您的perl
和XS 模块必须使用相同的编译器进行编译。
作为自述文件所述,Apache 服务器和 Perl 是使用 VC++ 6.0 (SP5) 构建的。所以nmake应该是同一个编译器,还是我错了?
那么,编译器安装了吗?你检查过哪个nmake
被调用了吗? cl
给你什么版本号?你是唯一知道这些事情的人,所以用这些信息更新你的问题。
已更新您希望的信息。但即使那些可能永远不会构建,这真的是核心问题吗?这对我来说听起来更像是一个环境变量问题,即使我在这方面没有这种经验
只是一个问题,当我可以在命令行中加载模块但不能在 Apache 中加载模块时,这真的是问题吗?只是为了我的理解,因为我不是这方面的专家。关于服务器:它只是在内部使用,不可公开访问。我同意安全问题,但认为它们不是主要问题,只要这不是外部问题
【参考方案1】:
如果不进行深入调查,您的问题最可能的原因是 perl
、OpenSSL、mod_ssl
等使用与您用于构建 Apache::ModSSL 的编译器不同的编译器进行编译。
在我看来,如果模块认为它在mod_perl
下运行,它只会尝试 XS 版本。您可以在模块的Apache2/ModSSL.pm 中看到这一点:
XSLoader::load __PACKAGE__, $VERSION
if( exists $ENVMOD_PERL and $ENVMOD_PERL=~/mod_perl/ );
如果MOD_PERL
环境变量存在并且它包含mod_perl
,它只会尝试加载XS 组件。我的猜测是如果你这样做了:
你会遇到问题。
此外,我觉得我必须强调一个事实,即您的 OpenSSL 版本除了 perl
和 php
似乎太旧而无法安全使用。
【讨论】:
抱歉我的回复延迟了。我使用您的命令进行了尝试,并得到了一个更明显的错误消息,即缺少 MSCVR90.dll。我现在正在尝试将其集成到路径中,然后再试一次。这让我更进一步,所以它已经很有帮助了。当我尝试完成后,我会标记你的答案以上是关于无法加载“C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll”的主要内容,如果未能解决你的问题,请参考以下文章