【问题标题】:Slow initial server startup when using Phusion Passenger and Rails使用 Phusion Passenger 和 Rails 时初始服务器启动缓慢
【发布时间】:2010-10-25 14:37:01
【问题描述】:

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

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

浏览 Google 搜索结果后,我们无法真正找到有用的信息。目前,我们有一个 cron 作业,它会不时发出请求以保持服务器运行。

还有其他人遇到这个问题吗?您有什么建议可以解决吗?

【问题讨论】:

标签: ruby-on-rails deployment passenger phusion


【解决方案1】:

发生的情况是您的应用程序和/或 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 听众将从这个副本中获得forked,这是一个超级便宜的操作。它发生得如此之快,以至于您无法判断您的应用程序是否必须生成侦听器。

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

Passenger User Guide 是这些以及更多配置选项的绝佳参考。

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

# 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的大侠们!

【讨论】:

  • 非常感谢您的回答。我相信我们已经尝试了大多数这些设置,但可能不是正确的组合。明天我将进行测试并恢复。
  • 这太棒了。我在安装 Nginx/Phusion Passenger 时遇到了同样的问题,这对我帮助很大。
  • 我已经尝试过这种设置,但没有看到性能改进,但我们的应用正在使用 RMagick。有什么解决方法吗?为什么它不能与 RMagick 一起使用?
  • RailsSpawnMethod 已弃用,取而代之的是 PassengerSpawnMethod modrails.com/documentation/…
  • 您好,我遇到了同样的问题,我想试试那个配置,但我不知道该配置必须放在哪里。谢谢!
【解决方案2】:

万一有任何 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!

EDIT rails_spawn_method 在乘客 3 中已弃用 而是使用

passenger_spawn_method smart; 

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

【讨论】:

  • 谢谢。需要注意的一件事是,我必须在我的主 nginx.conf 中使用其他全局设置填充passenger_pool_idle_time,而不仅仅是在启用rails 的特定站点配置中。
  • 但乘客 4 出错:"passenger_max_preloader_idle_time" directive is duplicate
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您也可以使用PassengerMinInstances:

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

      这可以与PassengerPreStart结合

      【讨论】:

      • 来自文档:“如果您想避免网站长时间闲置后可能出现较长的启动时间,您应该将此选项设置为非零值。”似乎是 OP 问题的完美答案。
      【解决方案6】:

      回复:

      # 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”,它跳过了框架生成器,所以设置 框架生成器超时无论如何都不会生效,除非你 将 spawn 方法显式设置为“智能”。

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 对于这个特定的应用程序,幸好它不是。但我会在以后记住这一点,谢谢。
        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 2015-01-16
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多