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

pts*_*pts 10 ruby apache ruby-on-rails 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中检索该值.)

小智 12

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

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

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

那么回答你的问题:

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

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

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

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


Hon*_*gli 6

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