Rackup正在通过Rack的默认处理程序成功运行任何Rack应用程序。例如:
class RackApp
def call(environment)
[
'200',
{'Content-Type' => 'text/html'},
["Hello world"]
]
end
end
run RackApp.new但是,当最后一行更改为使用Rack内置的CGI处理程序时,rackup提供了"NoMethodError at /un定义的方法‘调用’nil:NilClass‘“:
Rack::Handler::CGI.run RackApp.newRack的其他内置处理程序也遭到了同样的反对。例如,Rack:: handler ::Thin,Rack::Handler::FastCGI,甚至是Rack::Handler::WEBrick (该处理程序Rack在默认模式下选择上面的处理程序)。
这里正确的语法是什么?
发布于 2011-09-28 03:27:34
rackup命令读取配置文件并启动服务器。Rack::Handler::XXX.run方法还独立于rackup命令启动服务器(CGI略有不同,因为它实际上不是服务器本身)。
当你改变线路时会发生什么?
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)。在停止使用瘦(例如使用Ctrl)之后,默认的rackup服务器(Mongrel或Webrick)将开始监听端口9292,同样没有指定任何应用程序,因此您将得到NoMethodError。
如果您将修改后的'config.ru‘作为普通Ruby脚本运行,而不是使用rackup,您将看到相同的行为,但没有启动rackup服务器。(您需要首先要求机架,所以请使用ruby -rrack config.ru)。在CGI情况下,对应用程序的单个调用的输出将被打印到控制台,在瘦情况下,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'行)。
或者,您可以使用一个shell脚本,然后调用rackup config.ru。在这种情况下,rackup检测到它作为CGI运行,并自动使用正确的处理程序
发布于 2011-09-27 22:21:50
http://guides.rubyonrails.org/rails_on_rack.html (见3.5点)
同样有趣的是:
http://railscasts.com/episodes/151-rack-middleware
http://railscasts.com/episodes/222-rack-in-rails-3
https://stackoverflow.com/questions/7576295
复制相似问题