加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何指定Rack处理程序

发布时间:2020-12-17 03:35:10 所属栏目:百科 来源:网络整理
导读:Rackup通过Rack的默认处理程序成功运行任何Rack应用程序.例如.: class RackApp def call(environment) [ '200',{'Content-Type' = 'text/html'},["Hello world"] ] end endrun RackApp.new 但是当最后一行被改为使用Rack的内置CGI处理程序时,rackup给出了“
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序.例如.:

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在默认模式下选择的处理程序).

这里的语法是什么?

解决方法

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).停止Thin后(例如使用Ctrl-C),默认的机架式服务器(Mongrel或Webrick)将开始侦听端口9292,同样没有指定应用程序,因此您将获得NoMethodError.

如果您将修改后的“config.ru”作为普通的Ruby脚本而不是使用rackup运行,您将看到相同的行为,但没有启动Rackup服务器. (你需要先要求机架,所以请使用ruby -rrack config.ru).在CGI的情况下,对您的应用程序的单个调用的输出将打印到控制台,在Thin case 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运行并自动使用正确的处理程序

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读