2013-03-22 27 views
4

摘要:無法運行任何最簡單的「Hello World」FastCGI腳本,任何請求總是終止爲超時。似乎服務器和FastCGI腳本之間沒有任何通信(使用動態FastCGI腳本)。apache2 FastCGI通信與動態服務器中止首次讀取空閒超時

環境

  • Ubuntu的精確(12.04)
  • apache2.2-bin
  • apache2-mpm-prefork
  • libapache2-mod-fastcgi
  • libfcgi-perl
  • python-flup
  • 多個站點配置爲虛擬主機上127.0.0.1
  • 由所有(所有者,組等)
  • 存在一個/var/lib/apache2/fastcgi/dynamic目錄,由www-data擁有,被限制爲存在一個/var/lib/apache2/fastcgi目錄,由www-data擁有,可讀所有者(可讀,可寫和由www-data僅訪問)
  • 有存在於/var/lib/apache2/fastcgi/目錄

FastCGI的相關配置一個inode /插座文件:

目錄/etc/apache2/mods-enabled/保存對fastcgi.conffastcgi.loadmod_fastcgi已啓用)的引用。

文件fastcgi.conf包含以下(原封不動,我沒有編輯):

<IfModule mod_fastcgi.c> 
    AddHandler fastcgi-script .fcgi 
    #FastCgiWrapper /usr/lib/apache2/suexec 
    FastCgiIpcDir /var/lib/apache2/fastcgi 
</IfModule> 

/etc/apache2/sites-enabled/相關的配置文件包含以下(沒有什麼更多的其他地方有關FastCGI的具體配置):

<DirectoryMatch /fcgi-bin> 
    Options +ExecCGI 
    <FilesMatch "^[^\.]+$"> 
     SetHandler fastcgi-script 
    </FilesMatch> 
</DirectoryMatch> 

測試虛擬主機上的測試材料:

存在着一個fcgi-bin/test-perl.fcgi,其內容是(該文件是由所有的可執行文件,並通過所有者和組可讀):

#!/usr/bin/perl 

use CGI::Fast qw(:standard); 
    $COUNTER = 0; 
    while (new CGI::Fast) { 
    print header; 
    print start_html("Fast CGI Rocks"); 
    print 
     h1("Fast CGI Rocks"), 
     "Invocation number ",b($COUNTER++), 
      " PID ",b($$),".", 
     hr; 
     print end_html; 
    } 

存在着一個fcgi-bin/test-python.fcgi,其內容是(該文件是由所有的可執行文件,並通過所有者和組可讀):

#!/usr/bin/python 

def myapp(environ, start_response): 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['Hello World!\n'] 

try: 
    from flup.server.fcgi import WSGIServer 
    WSGIServer(myapp).run() 
except: 
    import sys, traceback 
    traceback.print_exc(file=open("errlog.txt","a")) 

問題

雖然在命令行中執行通常當兩個fcgi-bin/test-perl.fcgifcgi-bin/test-python.fcgi運行,似乎沒有被調用時上班,如如http://test.loc/fcgi-bin/test-perl.fcgihttp://test.loc/fcgi-bin/test-python.fcgi

什麼都沒有發生,有的延遲之後,我得到一個錯誤500,和Apache的錯誤日誌中包含多個條目看起來像:

[<date>] [error] [client <IP>] FastCGI: comm with (dynamic) server "/<…>/fcgi-bin/<script>.fcgi" aborted: (first read) idle timeout (30 sec), referer: <referrer> 
[<date>] [error] [client <IP>] FastCGI: incomplete headers (0 bytes) received from server "<…>/fcgi-bin/<script>.fcgi", referer: <referrer> 

我花了幾個小時在網上搜索試圖瞭解爲什麼它不起作用,最後決定放棄並在這裏尋求幫助。

歡迎任何指針和檢查列表。隨時索要任何您可能認爲相關或值得檢查的遺漏細節。

享受美好的一天。

- 編輯 -

問題更新

my own reply to my own question,我提到那裏的東西正在尋找沒有理由突然罰款古怪的案例。後來我發現這只是部分好的。

在同一個虛擬主機中,如果服務器配置完全相同,則某些腳本(它們完全相同(具有完全相同的訪問權限))根據其位置而失敗。

由於餘,這裏是什麼在站點配置:

<DirectoryMatch /fcgi-bin> 
    Options +ExecCGI 
    <FilesMatch "^[^\.]+$"> 
     SetHandler fastcgi-script 
    </FilesMatch> 
</DirectoryMatch> 

上述規定,只有在/fcgi-bin腳本,腳本的FastCGI的處理。但我在其他地方也有一些(仍用於測試):/cgi-bin中的一個和/中的一個(即在public_html目錄中)。爲此,.htaccess包含此項:

Options +ExecCGI 
AddHandler fastcgi-script .fcgi 

所以兩個人的FastCGI腳本應該工作一樣之一/fcgi-bin,但他們不這樣做,而且當時,他們都不約而同地用一個聯接時間終止-out,就像第一次做的/fcgi-bin一樣。

這讓我覺得mod_fastcgi模塊(已知bug?else?)可能有問題。到目前爲止,這個模塊似乎是相當隨機的。

- 編輯2 -

第一編輯以上,是我的一個錯誤:該組是不對的其他腳本,它必須是www-data,但事實並非如此。所以有些事情是錯誤的,堅持我給出的答案,那就是試着看看FastCgiConfig,看看它是否能解決任何問題,或者至少是否能夠解決超時問題。

回答

4

我會回答我自己的問題,因爲它似乎現在正在工作。然而,結語仍然看起來很奇怪。

雖然默認配置應該沒問題,但我仍想再次查看the 「Module mod_fastcgi」 document。由於我只想要一個動態的FastCGI,我只專注於FastCgiConfig指令,因此目的不在於FastCgiServerFastCgiExternalServer指令。

由於缺省fastcgi.conf文件中完全沒有FastCgiServer,我開始嘗試設置自己的文件。對於第一次測試,我想使用-appConnTimeout選項,至少要求服務器在返回錯誤500之前不要等太久。

所以我只是在網站配置中添加了這個(我沒有觸摸fastcgi.cong),在同一文件中,其中虛擬主機被配置:

FastCgiConfig -appConnTimeout 2 

這是爲了告訴服務器等待不超過2秒,而不是30秒它正在等待。我試圖調用FastCGI腳本來查看至少這個配置是否工作。我希望在2秒內得到一個錯誤,但是腳本沒有錯誤地運行。

有什麼奇怪的是,我試圖刪除這個選項,以檢查它是否只是缺少使FastCGI腳本工作的添加。但是在我評論了這個選項後,它仍然在工作,而且在完全重新啓動之後仍然如此。

不能說更多,這看起來很奇怪,但這是我做的唯一的事情,我沒有編輯任何其他東西。我只是建議可能遇到類似問題的人,只是嘗試以上。

對不起,如果我不能解釋它到底做了什麼。我真的很想知道。它現在只是在工作,但我不知道爲什麼。

+0

最後它並不總是工作。還有一個問題。看到最新的消息是更新來說明這個新問題。我對自己的問題的回答僅僅是部分內容。 – Hibou57 2013-03-22 08:43:22

+0

最後確定(請參閱第一篇文章)。答案雖然沒有說明如何,但確實足以解決這個問題。 – Hibou57 2013-03-22 10:08:25

2
#############

fastcgi.conf FastCgiWrapper關

0

peng.rl的回答解決我的問題。

我的ceph radosgw根本無法獲得apache的輸入。在設置FastCgiWrapper關閉後,我可以在wireshark中捕獲數據。