mod_fastcgi和mod_fcgid的區別

Web開發者發表於2011-12-31

mod_fcgid是一個跟mod_fastcgi二進位制相容的Apache module。

原來的mod_fastcgi因為實現方式的限制,所以可能會建立了很多不必要的程式,而實際上只需要更少的程式就能處理同樣的請求。 mod_fastcgi的另外一個問題是每一個CGI的多個程式都共享同一個管道檔案,所有到同一個fastcgi的通訊都通過這個同名的管道檔案進行, 這樣當出現通訊錯誤的時候,根本不知道正在通訊的是哪一個fastcgi,於是也沒有辦法將這個有問題的程式殺死。

mod_fcgid嘗試使用共享記憶體來解決這個問題。共享記憶體裡面有當前每個fastcgi程式的資訊(包括程式號,程式使用的管道檔名等),當 每次嘗試請求fastcgi工作的時候,Apache將會首先在共享記憶體裡面查詢,只有在共享記憶體裡面發現確實沒有足夠的fastcgi程式了,才會建立 新的程式,這樣可以保證當前建立的程式數量剛好能夠處理客戶的請求。另外,由於每一個fastcgi程式使用不同名稱的管道檔案,所以可以在通訊失敗的時 候知道到底哪個fastcgi程式有問題,而能夠儘早的將其剔除。

程式實現的目標

跟mod_fastcgi二進位制相容
只要在Apache中用mod_fcgid替換了mod_fastcgi,就能工作。原來的fastcgi程式不用重新編譯,立即可以工作。


更嚴格的控制程式的建立
Apache中每一個request handler都能通過共享記憶體知道當前系統fastcgi執行的情況,這樣可以防止過度的建立fastcgi程式,無謂的消耗系統的資源。


簡單清晰的程式建立速度控制策略

每一個fastcgi都會維護一個計數器,這個計數器在程式建立和程式結束的時候都會增加,而這個計數器每秒會減1,直到0。當計數器的值高於某個 閥值的時候,程式就會停止建立,直到計數器的值回落。這樣既可以保證在請求突然增多的時候能夠快速反應(特別是Apache剛啟動,需要大量建立程式的時 候),也能保證當fastcgi程式有問題,不斷重起的時候,重起的速度不會過高而消耗過多的系統資源。


自動檢測出有問題的程式

因為每個fastcgi使用自己特定的管道檔案,所以在通訊錯誤的時候可以輕易知道哪一個程式出現問題,而儘早的將其剔除。


可移植性
遵照Apache2的習慣,所有可移植的程式碼都放到一起,所有不可移植的程式碼都在arch目錄下分開存放。當前已經測試過的系統包括 Linux , FreeBSD(已經包含入FreeBSD4和FreeBSD5的port中), Solaris, Windows 2000.


支援FastCGI方式執行的PHP

可以直接支援以FastCGI方式執行的PHP。因為PHP現在還不能保證所有的擴充套件程式碼都是執行緒安全的,所以並不建議在Apache2的執行緒模式 下使用mod_php。而以FastCGI方式執行的PHP則是其中一個解決辦法。另外,使用mod_fcgi還可以在不修改任何PHP程式碼的情況下,獲 得資料庫連線池的功能,大大減少PHP程式到資料庫的連線。