为啥 Rails 不能与 mod_ruby 一起工作?

Posted

技术标签:

【中文标题】为啥 Rails 不能与 mod_ruby 一起工作?【英文标题】:Why can't Rails work with mod_ruby?为什么 Rails 不能与 mod_ruby 一起工作? 【发布时间】:2010-10-28 02:27:45 【问题描述】:

如果这听起来像一个愚蠢的问题,我很抱歉,因为它似乎是那些“不废话”的事情之一,但有人可以向我解释为什么 Rails 需要自己的服务器(Mongrel、WEBrick、mod_rails 等)并且不能简单地使用 mod_ruby?

【问题讨论】:

【参考方案1】:

所有运行 mod_ruby 的 apache 实例共享一个 Ruby 解释器。这意味着它根本不能在共享主机上使用,或者在每台机器运行多个 Rails 应用程序的任何环境中使用。可能可以在一台机器上运行同一应用程序的多个副本,但您也可能很容易遇到难以追踪的错误。因为 rails 是单线程的,所以每台机器只运行一个 ruby​​ 进程是不可想象的。

此外,它的性能也不是那么好。

如需更深入的讨论,请查看this Phusion employee's blog

【讨论】:

【参考方案2】:

"mod_ruby 每个 Apache 进程使用一个解释器,这意味着应用 在命名空间中互相遍历。至少对于 Rails,这是 不可接受,所以如果你想要 mod_ruby,每个 Apache 设置只有 1 个应用程序。" - David Heinemeier Hansson

现在已经被嘲讽了一些,如果你还想用的话,看看mod_ruby FAQ

Dreamhost 确实尝试将 ruby​​ 包含到他们的托管环境中,这来自他们的博客,关于他们从这项努力中得出的结论。

【讨论】:

【参考方案3】:

已经回答了 mod_ruby 会导致共享的 Ruby 解释器,但是这特别成问题的原因是它意味着类相互践踏。例如,考虑定义到某个数据库的连接的 ActiveRecord::Base。这个类的状态在不同的 Rails 应用程序之间是不同的,所以一旦在同一个解释器上运行多个 Rails 应用程序,就会发生严重的类冲突。

另一个答案说 Rails 是单线程的,但在 Rails 2.2.2 中不一定如此。我会将此作为对该答案的评论,但我穿着业力紧身衣:)

【讨论】:

以上是关于为啥 Rails 不能与 mod_ruby 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rails 找不到我的资产?

为啥 NSFileManager 不能与 UIDocumentBrowserViewController 一起使用?

为啥 TransactionScope 不能与 Sqlite 一起使用?

为啥 FileProvider 不能与广播一起使用?

为啥 ByRef 不能与 WithEvents 一起使用?

为啥我的 UICollectionViewController 不能与两个 CollectionView 一起运行?