首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何指定Rack处理程序

如何指定Rack处理程序
EN

Stack Overflow用户
提问于 2011-09-27 22:13:40
回答 2查看 2.9K关注 0票数 5

Rackup正在通过Rack的默认处理程序成功运行任何Rack应用程序。例如:

代码语言:javascript
复制
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‘“:

代码语言:javascript
复制
Rack::Handler::CGI.run RackApp.new

Rack的其他内置处理程序也遭到了同样的反对。例如,Rack:: handler ::Thin,Rack::Handler::FastCGI,甚至是Rack::Handler::WEBrick (该处理程序Rack在默认模式下选择上面的处理程序)。

这里正确的语法是什么?

EN

回答 2

Stack Overflow用户

发布于 2011-09-28 03:27:34

rackup命令读取配置文件并启动服务器。Rack::Handler::XXX.run方法还独立于rackup命令启动服务器(CGI略有不同,因为它实际上不是服务器本身)。

当你改变线路时会发生什么?

代码语言:javascript
复制
run RackApp.new

代码语言:javascript
复制
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运行,并自动使用正确的处理程序

票数 8
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7576295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档