为什么还没有适用于Apache的mod_ruby?
像Ruby和Rails一样受欢迎,看来这个问题已经解决了。 JRuby和mod_rails都很好,但是为什么没有一个仅用于纯Ruby的Apache mod?
解决方案
回答
有一个:mod_ruby,但是大约2年没有得到维护。
回答
有Phusion Passenger,这是一个功能强大的Apache模块,可以用最少的配置运行Rack应用程序。它对共享主机越来越有吸引力,将任何程序转换为Rack应用程序都非常容易:
A Rack application is an Ruby object (not a class) that responds to call. It takes exactly one argument, the environment and returns an Array of exactly three values: The status, the headers, and the body.
回答
也许有必要再次澄清一下mislav的观点,即mod_rails实际上并不仅限于Rails代码。新名称mod_rack更好。小型应用程序可以是可机架式的-其示例为:
class HelloWorld def call(env) [200, {"Content-Type" => "text/plain"}, ["Hello world!"]] end end
回答
有mod_rails,它可以运行Rack应用程序,我们还需要什么?
回答
基本问题是这样的:长期以来,MRI是唯一可行的Ruby实现。 MRI有很多问题,很难将其嵌入到另一个应用程序中(这基本上是mod_ruby所做的:它将MRI嵌入到Apache中),尤其是多线程应用程序(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框架的标准接口),并直接支持Ruby on Rails。
我的希望是在mod_rubinius上,不幸的是它还不存在。 Rubinius从一开始就被设计为线程安全的,可嵌入的,没有全局状态,不使用C堆栈等。它旨在能够在一个Rubinius进程中运行多个Rubinius VM。这使得mod_rubinius比mod_ruby更加容易实现和维护。不幸的是,当然,Rubinius尚未发布,并且在Rubinius发布之前,mod_rubinius的实际工作甚至无法开始。令人欣慰的是,mod_rubinius拥有比mod_ruby强大的人力资源,因为它已经向Rails托管公司的开发人员付费,后者急切地希望自己使用它。