如何在IIS 6上配置FastCGI以正确加载Perl模块

时间:2010-08-12 18:00:46

标签: perl iis-6 fastcgi

我取得了几次部分成功,但无法跨越最后一道障碍。

症状:在测试模式下,FastCGI表现完美。在eval或do模式下运行普通的perl脚本时,它可以完美地运行。一旦我尝试访问FCGI :: Request()对象或CGI :: Fast->新对象,它就会无限期地挂起。这是我的配置:

[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”,它将完美地运行测试。 Eval,do和no设置都无限期挂起。

最明显的是,如果我将Arguments =设置为有效的FCGI文件(或.pl / .cgi / .pm),那么该单个脚本将完美运行。 perl实例在应用程序中保持不变,并以广告速度运行。对FCGI :: Request()或CGI :: Fast->新方法的调用都返回它们应该的对象。一切都是积极的dory,但这不是正确的配置。我有一大堆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.

使用显式脚本引用时,此脚本将完全成功。它保持相同的perl PID,保持其计数,并返回准确的值。但大多数情况下,它可以导入其模块。

#!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 var才能让perl能够找到它的模块。

1 个答案:

答案 0 :(得分:0)

Microsoft报告他们的FastCGI工具未使用Perl进行测试。你不能从这里到达那里。另一方面,您可以使用IIS 7和PerlEx30.dll取得进展。在被叫到另一个项目之前,我有一些运气。