使用Phusion Passenger和Rails时,服务器启动缓慢的问题解决方法

88
为了跟上Phusion Passenger的潮流,我们已经为一个小的Rails应用程序设置了一个staging服务器进行测试。
目前为止,使用它非常好,它使安装/配置和部署应用程序变得轻松。问题是我们使用的网站并没有经常被访问,似乎在后台关闭了服务器。这意味着当有人访问网站时,他们需要等待很长时间,直到启动一个新的服务器来处理请求。我们已经阅读了文档,尝试了许多不同的设置(智能/智能lv2模式,passengeridletime等),但仍然没有找到真正的解决方案。
在浏览谷歌搜索结果后,我们并没有找到有用的信息。目前,我们有一个cron job定期发出请求,以尝试保持服务器运行。
是否还有其他人遇到过这个问题,你对修复有什么建议?

我还在Passenger Doc网站上找到了这个小贴士:http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart - dewrich
@dewrich,我找到了一个工具(http://wekkars.com),它可以完全替代你的cronjob。 - SteenhouwerD
7个回答

120
发生的情况是您的应用程序和/或应用程序生成器由于超时而关闭。为了处理您的新请求,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将始终在内存中保留1个应用程序副本(在启动Apache后的第一次请求之后)。单个侦听器将从此副本中fork出来,这是一个非常便宜的操作。它发生得如此之快,以至于您无法判断您的应用程序是否必须生成侦听器。
如果您的应用程序与智能生成不兼容,我建议保持较大的PassengerPoolIdleTime,并使用curl和cronjob或monit等定期访问您的站点,以确保侦听器保持活动状态。 Passenger用户指南是这些及更多配置选项的绝佳参考。
编辑:如果您的应用程序与智能生成不兼容,则有一些非常好的新选项。
# 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的英雄们!

我已经尝试过这个设置并没有看到任何性能提升,但我们的应用程序正在使用RMagick。是否有任何解决方法?为什么它不能与RMagick一起工作? - Chip Castle
1
RailsSpawnMethod已被弃用,建议使用PassengerSpawnMethod。详情请参考http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerSpawnMethod。 - paulus
1
嗨,我遇到了同样的问题,我想尝试那个配置,但我不知道该配置必须放在哪里。谢谢! - joseramonc
@JoseRamonCamacho 所有这些都可以放置在您的全局 Apache 配置文件中。其中一些选项也可以放置在 vhost 配置块或其他位置。所有细节都可以在 Passenger 文档中找到,该文档链接在答案中。 - John Douthat
请提及配置文件的名称,以便将所有内容放置在其中。 - Paul
显示剩余3条评论

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;

祝一切顺利!

编辑:rails_spawn_method在Passenger 3中已被弃用,改用

passenger_spawn_method smart; 

直到现在为止,其他一切都很好。


7
谢谢。需要注意的一点是,我不得不将"passenger_pool_idle_time"这个参数和其他全局设置一起放在我的主要nginx.conf文件中,而不仅仅是在启用了Rails的特定站点配置中。请注意保持原意并使翻译尽可能通俗易懂。 - Scott Arrington
但是乘客4出现错误:“passenger_max_preloader_idle_time”指令重复 - TangMonk

5

从文档中得知:“如果您想避免网站长时间闲置后启动时间过长,应将此选项设置为非零值。” 看起来这是 OP 问题的完美答案。 - Chuck

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”,它跳过了框架生成器,因此设置框架生成器超时时间也没有效果,除非您将生成方法明确设置为“smart”。

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


1

如果您的主机是共享服务器,就像我的一样,您无法更改设置,并且只能使用cron job。


对于这个特定的应用程序,谢天谢地它不是。但是我会记住这一点,感谢您提醒。 - tsdbrown

1

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


0

检查Passenger的版本。对于旧版本,它是RailsSpawnMethod <string>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接