87

为了赶上 Phusion Passenger 的潮流,我们为小型 Rails 应用程序设置了一个登台服务器来测试。

到目前为止,它使用起来非常好,它使安装/配置和部署应用程序变得轻而易举。问题是我们使用的网站并不经常受到攻击,而且它似乎在后台关闭了服务器。这意味着当有人访问该站点时,他们需要等待很长时间才能启动新服务器来处理请求。我们通读了文档,尝试了很多不同的设置(智能/智能 lv2 模式、passengeridletime 等),但仍然没有找到真正的解决方案。

翻遍谷歌搜索结果后,我们真的找不到有用的信息。目前,我们有一个 cron 作业,它经常发出请求以保持服务器运行。

是否还有其他人遇到此问题,您对修复有什么建议吗?

4

7 回答 7

120

发生的事情是您的 Application 和/或 ApplicationSpawners 由于超时而关闭。要处理您的新请求,Passenger 必须启动您的应用程序的新副本,这可能需要几秒钟,即使在快速机器上也是如此。要解决此问题,您可以使用一些 Apache 配置选项来保持应用程序处于活动状态。

以下是我在服务器上所做的具体操作。PassengerSpawnMethod 和PassengerMaxPreloaderIdleTime 是在您的情况下最重要的配置选项。

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

通过使用“智能”生成模式并关闭PassengerMaxPreloaderIdleTime,Passenger 将始终在内存中保留一份应用程序副本(在启动Apache 后的第一个请求之后)。将从该副本中编辑单个Application侦听fork器,这是一种超级便宜的操作。它发生得如此之快,以至于您无法判断您的应用程序是否必须生成侦听器。

如果您的应用程序与智能生成不兼容,我建议您保持较大的 PassengerPoolIdleTime 并定期使用 curl 和 cronjob 或 monit 或其他方式访问您的站点,以确保侦听器保持活跃。

乘客用户指南是这些和更多配置选项的绝佳参考。

编辑:如果您的应用与智能生成不兼容,有一些非常好的新选项

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

因此,如果您结合PassengerPreStart 和PassengerMinInstances,Passenger 将在apache 加载后立即启动3 个实例,并且始终保持至少3 个实例启动,因此您的用户很少(如果有的话)会看到延迟。

或者,如果您已经使用智能生成(推荐)PassengerMaxPreloaderIdleTime 0,您可以添加PassengerPreStart以获得立即启动的额外好处。

非常感谢phusion.nl的英雄们!

于 2009-05-12T16:11:47.667 回答
41

万一有任何 nginx 服务器用户偶然发现这个问题,“PassengerMaxRequests”和“PassengerStatThrottleRate”指令都不会转换为 nginx。但是其他人会这样做:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

EDITrails_spawn_method在乘客 3 中已弃用,而是使用

passenger_spawn_method smart; 

到目前为止,其他一切都很好。

于 2010-02-24T20:24:20.007 回答
4

您还可以使用PassengerMinInstances:

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

这可以与PassengerPreStart 结合使用

于 2011-02-15T23:07:32.133 回答
2

关于:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

只是要添加一些东西,可能会有用。

当前版本中的默认生成方法是“smart-lv2”,它会跳过框架生成器,因此设置框架生成器超时无论如何都不会生效,除非您将生成方法显式设置为“智能”。

来源: http ://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1

于 2009-05-13T07:25:25.427 回答
1

如果您的主机是共享服务器,就像我的一样,您无法更改设置并被 cron 作业困住。

于 2009-05-12T21:04:12.900 回答
1

我也遇到了这个问题,但我无法更改乘客设置,因为我没有对该文件的写权限。我找到了一个工具 ( http://www.wekkars.com ) 可以让我的应用程序快速响应。也许这也可以成为您的解决方案。

于 2012-03-13T14:18:36.730 回答
0

检查乘客的版本。它是<string>旧版本的 RailsS​​pawnMethod。

如果是这样(如果我没记错的话),在所有配置指令中用 Rails 替换乘客或查找旧乘客文档以获取更多详细信息

于 2011-12-15T11:30:02.943 回答