代码之家  ›  专栏  ›  技术社区  ›  pts

乘客如何重用线程和进程?

  •  11
  • pts  · 技术社区  · 15 年前

    我正在设置一个Apache2WebServer,它运行多个RubyonRails Web应用程序,并带有pFusion passenger。我知道,passenger生成处理请求的Ruby进程。我有以下问题:

    • 如果必须同时处理多个请求,那么passenger会生成多个进程或多个(ruby)线程吗?我如何配置它,使它总是产生单线程进程?
    • 如果我有两个Rails应用程序,假设对应用程序A的请求转到进程1,然后对应用程序B的请求到达。进程1是否也可以处理此请求?何时以及如何实现这一点?换句话说,是否允许一个进程处理多个Rails应用程序的请求?
    • 我在多个URL和多个虚拟主机(如http://和https://)中导出了相同的Rails应用程序。同一进程能否为不同的虚拟主机提供服务?(对此的答案似乎是肯定的,我在回答虚拟主机A的请求时设置了一个全局变量,并且我能够检索虚拟主机B中的值。)
    2 回复  |  直到 15 年前
        1
  •  12
  •   Burke    15 年前

    一般来说,乘客通过将框架和应用程序代码预加载到内存中的应用程序生成器或刚具有框架代码的FrameworksPawer分叉来生成新的进程。

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

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

    所以要回答你的问题:

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

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

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

    编辑:我读了一点。结果发现我基本上是对的,但技术细节有点离题。见 Passenger documentation

        2
  •  6
  •   Hongli    15 年前

    是的,伯克是对的。在第三个问题中,phulsion乘客通过应用程序根路径识别应用程序。因此,即使您有两个虚拟主机,如果它们都指向同一个documentroot,那么phusion passenger会认为它们是同一个应用程序。