2008-12-03 93 views
4

我不屬於Perl世界,所以這對我來說是新的。我正在運行安裝了apache2和mod_fcgid軟件包的Ubuntu Hardy LTS。我想讓MT4在fcgid下運行,而不是mod-cgi(它對普通的CGI似乎運行良好)。爲什麼我的簡單fastCGI Perl腳本失敗?

我似乎無法得到一個簡單的Perl腳本來運行在fcgid下。我創建了一個簡單的「Hello World」應用程序,幷包含來自this previous question的代碼以測試FCGI是否正在運行。

我將我的腳本命名爲HelloWorld.fcgi(當前fcgid僅設置爲處理.fcgi文件)。代碼:

#!/usr/bin/perl 

use FCGI; 

print "Content-type: text/html\n\n"; 
print "Hello world.\n\n"; 
my $request = FCGI::Request(); 
if ($request->IsFastCGI) { 
    print "we're running under FastCGI!\n"; 
} else { 
    print "plain old boring CGI\n"; 
} 

當在命令行中運行,它打印「普通老式無聊......」當通過HTTP請求來調用apache的,我得到一個500內部服務器錯誤和腳本的輸出打印到Apache錯誤日誌:

Content-type: text/html 

Hello world. 

we're running under FastCGI! 
[Wed Dec 03 22:26:19 2008] [warn] (104)Connection reset by peer: mod_fcgid: read data from fastcgi server error. 
[Wed Dec 03 22:26:19 2008] [error] [client 70.23.221.171] Premature end of script headers: HelloWorld.fcgi 
[Wed Dec 03 22:26:25 2008] [notice] mod_fcgid: process /www/mt/HelloWorld.fcgi(14189) exit(communication error), terminated by calling exit(), return code: 0 

當我運行相同代碼的.cgi版本時,它工作正常。任何想法爲什麼腳本的輸出是去錯誤日誌? Apache配置是默認配置mod_fcgid加,在虛擬主機的指令:

ServerName test1.example.com 
    DocumentRoot /www/example 

    <Directory /www/example> 
    AllowOverride None 
    AddHandler cgi-script .cgi 
    AddHandler fcgid-script .fcgi 
    Options +ExecCGI +Includes +FollowSymLinks 
    </Directory> 

回答

3

我用CGI ::快速比FCGI多,但這個想法是一樣的,我想。快速CGI的目標是加載一次程序,併爲每個請求循環迭代。

FCGI的手冊頁說:

use FCGI; 

my $count = 0; 
my $request = FCGI::Request(); 

while($request->Accept() >= 0) { 
    print("Content-type: text/html\r\n\r\n", ++$count); 
} 

這意味着,你必須Accept能夠打印任何東西,返回到瀏覽器之前的請求。

+0

試過了,結果相似。還嘗試使用簡單的CGI :: Fast Hello World - 也失敗了。很奇怪... – sstrudeau 2008-12-04 18:06:53

2

Movable Type使用CGI :: Fast用於FastCGI。典型的FastCGI腳本循環運行,如所述的mat。使用CGI ::快速是這樣一個循環:

#!/usr/bin/perl 

use strict; 
use CGI::Fast; 

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

我安裝了FCGI和CGI ::快速的模塊和計數增量正如你所期望的服務器上測試了這個腳本。如果進程ID發生變化,count將回到1,然後在該進程內增加。每個進程當然都有自己的可變空間。

對於MT,啓用FastCGI需要將cgi腳本重命名(或符號鏈接)爲'fcgi'(或爲'cgi'腳本創建處理程序fcgid,但對於mt-xmlrpc.cgi不適用FastCGI友好的)。您還需要將一些指令添加到您的mt-config.cgi文件中,以便它知道新的腳本名稱。像這樣:

AdminScript mt.fcgi 
CommentsScript mt-comments.fcgi 

等等。更多有關FastCGI和Movable Type的文檔可在movabletype.org上找到。

3

問題在於,「Content-Type」標題是在請求循環之外發送的。您必須爲每個請求打印「Content-Type」標題。如果你移動

print「Content-type:text/html \ n \ n」;

到請求循環的頂部它應該解決問題。

此外,您還需要循環的要求,或者您會得到任何好處,所以下面的第一張海報的例子:

my $request = FCGI::Request(); 
while($request->Accept() >= 0) { 
    print("Content-type: text/html\n\n"); 
} 
0

無論如何,基於服務器的錯誤日誌,它看起來像FCGI工作,並被正確調用,但腳本不在循環中運行,等待下一個請求出現。因此,您的測試腳本確實完成了任務 - 報告是否配置了FastCGI。所以現在你應該可以重新配置MT來使用FastCGI。

相關問題