12

与 Ruby 和 Rails 一样流行,似乎这个问题已经得到解决。JRuby 和 mod_rails 都很好而且花花公子,但是为什么没有一个 Apache mod 只适用于纯 Ruby 呢?

4

5 回答 5

23

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

Rack 应用程序是一个 响应call. 它只接受一个参数,即环境并返回一个恰好包含三个值的数组:状态、标题和正文。

于 2008-09-16T18:07:25.087 回答
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(又名 mod_rack aka mod_rails)通过基本上放弃和回避这个问题来解决这个问题:他们只是在每个应用程序的单独进程中运行单独的 MRI 副本。它工作得很好,而且不仅适用于 Ruby。它支持WSGI(Python Web 框架的标准接口)、Rack(Ruby Web 框架的标准接口)并直接支持 Ruby on Rails。

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

于 2008-09-20T21:42:21.830 回答
5

或许值得再次澄清 mislav 的观点,即 mod_rails 实际上根本不限于 Rails 代码。新名称 mod_rack 更好。微不足道的小应用程序可以机架化——他们的例子是:

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end
于 2008-09-16T18:46:08.100 回答
4

有一个: mod_ruby,但大约 2 年没有维护了。

于 2008-09-16T17:56:27.093 回答
0

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

于 2008-09-16T19:37:53.060 回答