Phusion Passenger如何重用线程和进程?

时间:2009-05-04 20:14:54

标签: ruby-on-rails ruby apache apache2 passenger

我正在建立一个使用Phusion Passenger运行多个Ruby on Rails Web应用程序的Apache2 Web服务器。我知道Passenger会生成处理请求的Ruby进程。我有以下问题:

  • 如果必须同时处理多个请求,Passenger会产生多个进程还是多个(Ruby)线程?如何配置它以便始终生成单线程进程?
  • 如果我有两个Rails应用程序,请想象应用程序A的请求进入进程1,然后稍后请求应用程序B到达。流程1是否也可以处理此请求?何时以及如何实现?换句话说,是否允许一个进程处理多个Rails应用程序的请求?
  • 我在多个URL和多个虚拟主机(例如http://和https://)中导出了相同的Rails应用程序。同一个进程是否能够为不同的虚拟主机提供服务? (答案似乎是肯定的,我在回答虚拟主机A的请求时设置了一个全局变量,并且我能够在虚拟主机B中检索该值。)

2 个答案:

答案 0 :(得分:12)

一般来说,Passenger通过分支ApplicationSpawner来生成新进程,ApplicationSpawner将框架和应用程序代码预加载到内存中,或者FrameworkSpawner,它只有框架代码。

据我所知,乘客不会处理线程。相反,随着应用程序上的负载增加,它将分叉该Application的ApplicationSpawner并初始化另一个实例。当负载减少时,一个或多个应用程序实例将被终止。

如果以某种方式配置Passenger(我相信通过选择“智能”spawn方法),它将创建一个FrameworkSpawner,它加载rails代码,但没有应用程序代码,然后可以分叉加载和应用程序使用该版本的Rails。

所以回答你的问题:

  • 它将依次为它们提供服务,如果它确定负载足够高,则会产生其他进程。

  • 没有。一个进程只能属于一个Rails应用程序。

  • 我对这个有点粗略,但你的实验很有意义。乘客应该足够聪明,即使它从服务器配置中的不同位置运行,你也在谈论相同的应用程序。它可能基于应用程序的文件系统路径。

编辑:我去读了一下这个。事实证明我大部分是正确的,但技术细节有点偏。请参阅Passenger documentation

答案 1 :(得分:6)

是的,伯克是对的。在第三个问题的情况下,Phusion Passenger通过其应用程序根路径识别应用程序。因此,即使您有两个虚拟主机,如果它们都指向同一个DocumentRoot,那么Phusion Passenger会认为它们是相同的应用程序。