gpt4 book ai didi

ruby - 如何指定 Rack 处理程序

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:53 29 4
gpt4 key购买 nike

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/undefined method `call' for nil:NilClass”:

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,因为该应用程序为 nil。

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

如果您将修改后的“config.ru”作为普通 Ruby 脚本而不是使用 rackup 来运行,您会看到相同的行为,但不会启动 rackup 服务器。 (您首先需要 require rack,因此请使用 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' 行)。

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

关于ruby - 如何指定 Rack 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7576295/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com