如何指定Rack处理程序

时间:2011-09-27 22:13:41

标签: ruby cgi webserver rack

Rackup 通过Rack的默认处理程序成功运行任何 Rack 应用程序。 e.g:

class RackApp  
  def call(environment)    
  [
    '200', 
    {'Content-Type' => 'text/html'}, 
    ["Hello world"]
  ]
  end 
end
run RackApp.new

但是,当最后一行被改为使用Rack的内置CGI处理程序时,Rackup给出了“nil:NilClass的/ undefined方法`call'的NoMethodError”:

Rack::Handler::CGI.run RackApp.new

Rack的其他内置处理程序也提出了同样的异议。例如Rack :: Handler :: Thin,Rack :: Handler :: FastCGI,甚至是Rack :: Handler :: WEBrick(这是处理程序Rack在默认模式下选择的处理程序)。

这里的语法是什么?

2 个答案:

答案 0 :(得分:7)

rackup命令读取配置文件并启动服务器。 Rack::Handler::XXX.run方法启动服务器,与rackup命令无关(CGI略有不同,因为它实际上不是服务器)。< / p>

更改行时会发生什么

run RackApp.new

Rack::Handler::CGI.run RackApp.new

并运行rackup如下。服务器启动并解析配置文件。当达到Rack::Handler::CGI.run RackApp.new行时,它将像任何其他Ruby代码一样执行。在CGI处理程序的情况下,它调用应用程序并将输出写入标准输出,如果它作为CGI脚本运行(在运行rackup时查看终端)。之后'rackup'服务器正常启动,但没有运行应用程序。当您尝试访问该页面时,您将获得NoMethodError,因为该应用程序为零。

使用Rack::Handler::Thin是类似的,但在这种情况下,由于Thin实际上是一个Web服务器,它已启动并将提供RackApp,但侦听Thin的默认端口8080(不是机架默认端口) 9292)。停止Thin后(例如使用Ctrl-C),默认的机架式服务器(Mongrel或Webrick)将开始侦听端口9292,同样没有指定应用程序,因此您将获得NoMethodError。

如果您将修改后的'config.ru'作为普通的Ruby脚本运行而不是使用rackup,您将看到相同的行为,但没有启动Rackup服务器。 (您需要先要求机架,因此请使用ruby -rrack config.ru)。在CGI的情况下,对您的应用程序的单个调用的输出将打印到控制台,在Thin的情况下,Thin将开始为您的应用程序提供服务。

为了指定要与rackup一起使用的服务器,您可以使用-s选项,例如rackup -s thin将使用Thin启动应用程序(这次是在rackup默认端口9292上)。您也可以执行rackup -s cgi但这不会以任何有用的方式工作 - 它只是将错误页面的html打印到控制台。

CGI

如果您尝试将应用程序作为CGI运行,则有几种选择。您需要创建一个CGI脚本,使用CGI处理程序调用您的应用程序。这本身就是一个直接调用Rack::Handler::CGI.run的ruby脚本,事实上你可以直接使用修改后的config.ru(你可能想先重命名它并添加一个明确的require 'rack'行)。 / p>

或者,您可以使用shell脚本,然后调用rackup config.ru。在这种情况下,rackup检测到它作为CGI运行并自动使用正确的处理程序

答案 1 :(得分:1)