使用Phusion Passenger和Rails时,初始服务器启动缓慢


87

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

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

浏览了Google的搜索结果后,我们实际上找不到有用的信息。当前,我们有一个cron作业,经常发出一个请求,以保持服务器运行。

还有其他人遇到此问题吗?您对修复有任何建议吗?


我也发现了乘客文档网站这块金块:modrails.com/documentation/...
dewrich

@dewrich我发现一个工具(wekkars.com)确实可以执行您的cronjob所做的工作
SteenhouwerD 2012年

Answers:


119

发生的情况是您的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将始终在内存中保留您的应用程序的1个副本(在启动Apache之后的第一个请求之后)。Applicationfork从此副本中获得个人侦听器,这是一个超低价的操作。它发生得如此之快,以至于您无法判断您的应用程序是否必须生成监听器。

如果您的应用与智能生成不兼容,我建议您保留一个较大的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的英雄们!


非常感谢您的回答。我相信我们已经尝试了大多数设置,但可能组合不正确。我明天将进行测试并还原。
tsdbrown

这太棒了。我的Nginx / Phusion Passenger安装遇到相同的问题,这对我有很大帮助。
Scott Anderson

我尝试了此设置,但未看到任何性能改进,但我们的应用程序正在使用RMagick。有什么解决方法吗?为什么它不能与RMagick一起使用?
Chip城堡

1
RailsSpawnMethod不赞成使用PassengerSpawnMethod modrails.com/documentation/…–
paulus

1
嗨,我遇到了同样的问题,我想尝试该配置,但是我不知道该配置必须放在哪里。谢谢!
joseramonc

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;

HTH!

rails_spawn_method乘客3不推荐使用EDIT ,而是使用

passenger_spawn_method smart; 

到目前为止一切都很好。


7
谢谢你 需要注意的一件事是,我必须在main nginx.conf中将passenger_pool_idle_time与其他全局设置一起填充,而不是仅在启用了rails的特定站点配置中填充。
Scott Anderson

但旅客4出现错误:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk 2015年


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作业。


对于这个特定的应用程序,它不是。但是我对未来的感谢将其遗忘。
tsdbrown

1

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


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.