为什么Apache没有可行的mod_ruby呢?

时间:2008-09-16 17:47:41

标签: ruby-on-rails ruby apache

像Ruby和Rails一样受欢迎,似乎这个问题已经解决了。 JRuby和mod_rails都很好用,但为什么不用直接Ruby的Apache mod?

5 个答案:

答案 0 :(得分:23)

Phusion Passenger,一个强大的Apache模块,可以以最少的配置运行Rack个应用程序。它对共享主机越来越有吸引力,将任何程序转换为Rack应用程序都非常容易:

  

Rack应用程序是Ruby 对象   (不是一个类)响应call。   它需要一个参数,即   环境并返回一个数组   完全三个值:状态,即   标题和正文。

答案 1 :(得分:18)

基本问题是:长期以来,MRI是唯一可行的Ruby实现。 MRI存在许多问题,使得很难将其嵌入到另一个应用程序中(这基本上是mod_ruby所做的:它将MRI嵌入到Apache中),尤其是多线程应用程序(Apache是​​)。它不是特别是线程安全的,它有相当多的全局状态。

这个全局状态意味着,例如,如果一个Rails应用程序修改某个类,那么在同一个Apache服务器上运行的所有其他 Rails应用程序,看到这个修改过类。

另一个问题是MRI源代码不容易被破解。 MRI已经超过15年了,它已经开始显示了。

由于这些问题,mod_ruby从来没有真正正常工作,并且在某些时候维护者只是放弃了。

另一方面,基于C的PHP解释器从第一天开始设计,在Apache中作为mod_php运行。实际上,对于前几个版本,甚至没有解释器的命令行版本,mod_php是运行PHP的唯一方式。

Phusion Passenger (aka mod_rack aka mod_rails)通过基本放弃和回避问题解决了这个问题:他们只是在每个应用程序的单独过程中运行单独的MRI副本。它非常好用,不仅适用于Ruby。它支持WSGI(Python Web框架的标准接口),Rack(Ruby Web Frameworks的标准接口)和对Ruby on Rails的直接支持。

我的希望在于mod_rubinius,遗憾的是它还不存在。 Rubinius从一开始就设计为线程安全,可嵌入,没有全局状态,不使用C堆栈等。它被设计为能够在一个Rubinius进程中运行多个Rubinius VM。这使得mod_rubinius比mod_ruby更容易实现和维护。不幸的是,当然,Rubinius还没有被释放,而且在Rubinius被释放之前,关于mod_rubinius的真正工作甚至无法开始。好消息是mod_rubinius已经拥有比mod_ruby更多的人力资源,因为它已经为Rails托管公司支付开发人员的费用,绝望希望自己使用它。

答案 2 :(得分:5)

或许值得双重澄清mislav的观点,即mod_rails实际上并不局限于Rails代码。新名称mod_rack更好。简单的小应用程序可以放置 - 例如:

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

答案 3 :(得分:4)

有一个:mod_ruby,但它在大约2年内没有得到维护。

答案 4 :(得分:0)

mod_rails并且它可以运行Rack个应用程序,您还需要什么?