2009-05-04 17 views
11

我使用Phusion Passenger設置了運行多個Ruby on Rails Web應用程序的Apache2 Web服務器。我知道Passenger會產生處理請求的Ruby進程。我有以下問題:Phusion Passenger如何重用線程和進程?

  • 如果有多個請求必須同時處理,Passenger會產生多個進程或多個(Ruby)線程嗎?我如何配置它,因此它總是產生單線程的進程?
  • 如果我有兩個Rails應用程序,想象一下對應用程序A的請求進入進程1,則稍後請求應用程序B到達。進程1是否也可以處理這個請求?何時以及如何可能?換句話說,一個進程是否允許處理多個Rails應用程序的請求?
  • 我有多個URL和多個虛擬主機(如http://和https://)導出的Rails應用程序相同。同一個進程是否能夠爲不同的虛擬主機提供服務? (答案似乎是肯定的,我已經設置了一個全局變量來回答對虛擬主機A的請求,並且我能夠在虛擬主機B中檢索該值。)

回答

12

一般來說,乘客通過分派一個ApplicationSpawner來產生新的進程,這個ApplicationSpawner的框架和應用程序代碼被預先加載到內存中,或者一個FrameworkSpawner,它只有框架代碼。

就我所知,乘客並不處理線程。相反,隨着應用程序中的負載增加,它將分叉該應用程序的ApplicationSpawner並初始化另一個實例。當負載減少時,會關閉一個或多個應用程序實例。

如果Passenger以某種方式配置(我相信通過選擇「智能」spawn方法),它將創建一個FrameworkSpawner,它加載rails代碼,但沒有應用程序代碼,然後可以分叉加載並使用該版本的Rails的應用程序。

因此,要回答你的問題:

  • 它將成爲他們按順序,然後產生其他進程,如果它決定負荷足夠高。

  • 第一個進程只能屬於一個Rails應用程序。

  • 我對這個很粗略,但你的實驗是有道理的。乘客應該足夠聰明,即使它在服務器配置中的不同位置運行,你也在討論同一個應用程序。它可能基於應用程序的文件系統路徑。

編輯:我去讀了這一點。事實證明,我大部分都是對的,但技術細節有點偏離。看到Passenger documentation

+0

Passenger的付費版本現在可以選擇產生線程和進程。 – Kris 2015-09-22 08:36:19

6

是的,伯克是正確的。在第三個問題的情況下,Phusion Passenger通過其應用程序根路徑識別應用程序。因此,即使您有兩臺虛擬主機,如果它們都指向相同的DocumentRoot,那麼Phusion Passenger也會認爲它們是同一個應用程序。

相關問題