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

人气:1,034 发布:2022-10-16 标签: apache apache2 ruby-on-rails ruby passenger

问题描述

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

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

推荐答案

一般来说,Passenger通过派生ApplicationSpawner或FrameworkSpawner来生成新进程,前者将框架和应用程序代码预先加载到内存中,后者只包含框架代码。

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

如果Passenger以某种方式配置(我相信通过选择"智能"的派生方法),它将创建一个FrameworkSpawner,它加载Rails代码,但不加载应用程序代码,然后可以派生这些代码,以使用该版本的Rails加载和应用程序。

所以回答您的问题:

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

否。一个进程只能属于单个Rails应用程序。

我对这个问题有点粗略,但你的实验是有意义的。Passenger应该足够聪明,能够意识到即使它是从服务器配置中的不同位置运行的,您谈论的是同一个应用程序。它可能基于应用程序的文件系统路径。

编辑:我去阅读了一下这篇文章。事实证明,我基本上是正确的,但技术细节有点不对劲。请参阅Passenger documentation

784