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在默认模式下选择的处理程序)。
这里的语法是什么?
答案 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处理程序调用您的应用程序。这本身就是一个直接调用Rack::Handler::CGI.run
的ruby脚本,事实上你可以直接使用修改后的config.ru
(你可能想先重命名它并添加一个明确的require 'rack'
行)。 / p>
或者,您可以使用shell脚本,然后调用rackup config.ru
。在这种情况下,rackup检测到它作为CGI运行并自动使用正确的处理程序
答案 1 :(得分:1)