10

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

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

2 回答 2

12

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

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

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

所以回答你的问题:

  • 它将按顺序为它们提供服务,然后在确定负载足够高时生成其他进程。

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

  • 我对这个有点粗略,但你的实验是有道理的。乘客应该足够聪明,可以弄清楚即使它在服务器配置中的不同位置运行,您正在谈论的是同一个应用程序。它可能基于应用程序的文件系统路径。

编辑:我去读了一点。事实证明我基本上是对的,但技术细节有点不对劲。请参阅乘客文件

于 2009-05-05T05:49:10.660 回答
6

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

于 2009-05-21T20:49:40.197 回答