Как настроить FastCGI на IIS 6 для правильной загрузки модулей Perl - PullRequest
0 голосов
/ 12 августа 2010

Я добился нескольких частичных успехов, но не могу преодолеть последнее препятствие.

Симптом: в тестовом режиме FastCGI работает отлично. При запуске простых сценариев Perl в режиме eval или do он работает отлично. Как только я пытаюсь получить доступ к объекту FCGI :: Request () или к объекту CGI :: Fast-> new, он зависает бесконечно. Вот мой конфиг:

[Types]
fcgi=FCGI
cgi=FCGI
pl=FCGI
pm=FCGI

[FCGI]
ExePath=C:\perl\bin\perl.exe
;ExePath=C:\strawberry\perl\bin\perl.exe
Arguments="-MFCGI::IIS=eval"
;Arguments=d:\inetpub\cgi-bin\hello.fcgi
;Arguments=d:\inetpub\cgi-bin\h2.fcgi
ActivityTimeout=5
QueueLength=999
MaxInstances=20
InstanceMaxRequests=500

Вы можете видеть вещи, на которые я пробовал ссылаться выше; Использование ActiveState или Strawberry приводит к тому же поведению. Если я установлю аргумент -MFCGI :: IIS равным «test», он отлично выполнит тесты. Эвал, делай, а без настроек все висят на неопределенный срок.

Наиболее показательно, что если я установлю Аргументы = в допустимый файл FCGI (или .pl / .cgi / .pm), то этот единственный скрипт будет работать отлично. Экземпляр perl сохраняется во всех вызовах точно так же, как и должен, и работает с заявленной скоростью. Все вызовы методов FCGI :: Request () или CGI :: Fast-> new возвращают объекты, которые они должны. Все положительно чертовски дорого, но это не правильный конфиг. У меня есть куча файлов CGI, и мне нужно создать отдельную запись сопоставления для каждого файла CGI, чтобы этот уродливый kludge работал.

Я подозреваю, что мне не хватает параметра, который заставляет имя сценария отправляться в качестве аргумента в perl, но я не вижу этот параметр. Спасибо за любую помощь.

Редактировать: мои подозрения неверны. FCGI определенно вызывает правильные сценарии, но вызывает их в неправильной среде. Если я использую аргумент -MFCGI :: IIS, я вызываю точно такой же сценарий, как если бы я использовал явный аргумент пути, но когда я использую явный аргумент пути, скрипты могут найти свои библиотеки. Моя задача - заставить скрипты правильно идентифицировать свои библиотеки.

При использовании -MFCGI :: IIS этот скрипт завершается ошибкой:

#!c:/perl/bin/perl
use CGI::Fast; 

Ошибка:

Error! 
Can't locate object method "FILENO" via package "FCGI::Stream" at 
C:/Perl/lib/CGI.pm line 822. 
Compilation failed in require at C:/Perl/lib/CGI/Fast.pm line 20. 
BEGIN failed--compilation aborted at C:/Perl/lib/CGI/Fast.pm line 20.
Compilation failed in require at (eval 4) line 4. 
BEGIN failed--compilation aborted at (eval 4) line 4.

При использовании явной ссылки на сценарий этот сценарий полностью выполняется. Он поддерживает тот же PID perl, поддерживает его счет и возвращает точные значения. В основном, однако, он может импортировать свои модули.

#!c:/perl/bin/perl -w
use strict; 

use CGI::Fast; 
my $count = 1; 
while (my $q = CGI::Fast->new) 
{ 
        print("Content-Type: text/plain\n\n"); 
        print("Process ID: $$; Count is: " . ++$count); 
} 

Просто должен быть какой-то вариант ENV, который я могу установить, чтобы perl смог найти его модули.

1 Ответ

0 голосов
/ 13 октября 2010

Microsoft сообщает, что их инструмент FastCGI не тестировался с Perl.Вы не можете добраться отсюда.С другой стороны, вы можете добиться прогресса, используя IIS 7 и PerlEx30.dll.Мне повезло с этим, прежде чем меня вызвали в другой проект.

...