为什么 Apache 还没有一个可行的 mod_ruby ?
-
09-06-2019 - |
题
尽管 Ruby 和 Rails 很流行,但这个问题似乎已经得到解决。JRuby 和 mod_rails 都很好而且很漂亮,但是为什么没有一个专门针对 Ruby 的 Apache mod 呢?
解决方案
基本问题是这样的:很长一段时间,MRI 是唯一可行的 Ruby 实现。MRI 有许多问题,使其很难将其嵌入到另一个应用程序中(这基本上就是 红宝石模组 做:它在 Apache 中嵌入了 MRI),尤其是多线程(Apache 就是)。它并不是特别线程安全,并且具有相当多的全局状态。
这种全局状态意味着,例如,如果一个 Rails 应用程序修改了某个类,那么 所有其他 在同一 Apache 服务器上运行的 Rails 应用程序将 还 请参阅这个修改后的类。
另一个问题是 MRI 源代码不容易被破解。MRI 已有 15 年多的历史,并且已经开始显现出它的作用。
由于这些问题,mod_ruby 从未 真的 工作正常,但在某些时候维护者干脆放弃了。
另一方面,基于 C 的 PHP 解释器从第一天起就被设计为在 Apache 中作为 mod_php 运行。事实上,对于前几个版本,甚至没有解释器的命令行版本,mod_php 是 仅有的 运行 PHP 的方式。
Phusion Passenger(又名 mod_rack 又名 mod_rails) 通过基本上放弃和回避问题来解决这个问题:他们只是在每个应用程序的单独进程中运行单独的 MRI 副本。它非常有效,而且不仅仅适用于 Ruby。它支持 WSGI (Python Web 框架的标准接口), 架子 (Ruby Web 框架的标准接口)以及对 Ruby on Rails 的直接支持。
我的希望就在眼前 mod_rubinius, ,不幸的是还不存在。 鲁比纽斯 从一开始就被设计为线程安全、可嵌入、不受全局状态影响、不使用C堆栈等等。它被设计为能够在一个 Rubinius 进程内运行多个 Rubinius 虚拟机。这使得 mod_rubinius 比 mod_ruby 更容易实现和维护。当然,不幸的是,Rubinius 还没有发布,mod_rubinius 的真正工作甚至要等到 Rubinius 发布后才能开始。好消息是 mod_rubinius 背后的人力已经比 mod_ruby 多,因为它已经向 Rails 托管公司支付开发人员费用, 拼命地 自己想用。
其他提示
有 Phusion 乘客, ,一个强大的 Apache 模块,可以运行 架子 具有最低配置的应用程序。它对共享主机越来越有吸引力,并且将任何程序变成 Rack 应用程序都非常简单:
Rack 应用程序是 Ruby 目的(不是一个类)响应
call
。正好需要 一个论点, ,环境并返回一系列的数组 三个值:状态,标头和身体。
也许值得双重澄清米斯拉夫的观点,即 mod_rails 实际上根本不限于 Rails 代码。新名称 mod_rack 更好了。微不足道的小应用程序也可以安装在机架上——它们的例子是:
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
有一个: 红宝石模组, ,但已经有大约2年没有维护了。