Не удается загрузить «C:/Apache/Perl/site/lib/auto/Apache2/ModSSL/ModSSL.dll»

Я использую Windows Server 2008 R2 Enterprise с установленным Apache Server и mod_perl и mod_ssl. Я только что установил Apache2::ModSSL, но я не смог использовать для этого cpan, и мне пришлось скомпилировать его с помощью nmake. CPAN работает неправильно на этом сервере, и я не могу это изменить. Perl-скрипт, вызываемый через https, позже должен иметь доступ к сертификату, который клиенты использовали для аутентификации, поэтому я хочу использовать 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?

Состояние Readme сервера

Это бинарный дистрибутив Perl 5.8.7 и Apache 2.0.54 для Win32 вместе с 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


person chenino    schedule 01.07.2016    source источник
comment
Ваши модули perl и XS должны быть скомпилированы одним и тем же компилятором.   -  person Sinan Ünür    schedule 01.07.2016
comment
Как указано в файле readme, Apache Server и Perl были созданы с использованием VC++ 6.0 (SP5). Итак, nmake должен быть тем же компилятором, или я ошибаюсь?   -  person chenino    schedule 01.07.2016
comment
Ну, этот компилятор установлен? Вы проверили, какой nmake вызывается? Что cl дает вам как номер версии? Вы единственный человек, который может знать эти вещи, поэтому обновите свой вопрос информацией.   -  person Sinan Ünür    schedule 01.07.2016
comment
Обновлено информацией, которую вы хотели. Но даже если это может быть никогда не построено, действительно ли это основная проблема? Для меня это больше походило на проблему переменной среды, даже если я не так опытен в этом   -  person chenino    schedule 01.07.2016
comment
Просто вопрос, может ли это быть проблемой, когда я могу загрузить модуль в командной строке, но не в Apache? Просто для моего понимания, так как я не эксперт в этом. Что касается сервера: он используется только для внутреннего использования и не доступен для публики. Я согласен с проблемами безопасности, но думаю, что они не являются главной проблемой, пока это не выходит за рамки   -  person chenino    schedule 01.07.2016


Ответы (1)


Если не вникать слишком глубоко, наиболее вероятная причина вашей проблемы заключается в том, что perl, OpenSSL, mod_ssl и т. д. были скомпилированы с помощью компилятора, отличного от того, который вы использовали для сборки Apache::ModSSL.

Мне кажется, что модуль пробует версию XS, только если думает, что работает под mod_perl. Вы можете увидеть это в Apache2/ModSSL.pm< модуля. /а>:

XSLoader::load __PACKAGE__, $VERSION
  if( exists $ENV{MOD_PERL} and $ENV{MOD_PERL}=~/mod_perl/ );

Он пытается загрузить компонент XS, только если переменная окружения MOD_PERL существует и содержит mod_perl. Я предполагаю, что если бы вы сделали:

C:\> set MOD_PERL=mod_perl
C:\> perl -MApache2::ModSSL -e "print $Apache2::ModSSL::VERSION"

вы бы столкнулись с проблемами.

Кроме того, я чувствую, что должен подчеркнуть тот факт, что ваша версия OpenSSL в дополнение к perl и php кажется слишком старой для безопасного использования.

person Sinan Ünür    schedule 01.07.2016
comment
Извините за задержку в моем ответе. Я попробовал это с вашими командами и получил более дифференцированное сообщение об ошибке, что MSCVR90.dll отсутствует. Сейчас я пытаюсь интегрировать его в путь и попробую еще раз. Это делает меня еще на один шаг вперед, так что это уже было полезно. Когда я закончу с этим, я отмечу ваш ответ - person chenino; 01.07.2016