首页 > 编程语言 > rack是什么

rack是什么

2020年10月22日 发表评论 阅读评论

rack 是一种中间件,它工作在你的 web 应用程序和 web 服务器之间。可能是由于大家都主要使用框架,所以介绍 rack 的中文文档比较少。

rack 处理所有服务器特定的 API 调用,将 HTTP 请求和所有环境参数通过 hash 传递应用程序,然后把应用程序的响应返回给服务器。换句话说,应用程序不需要知道如何与 HTTP 服务器通信,而是需要知道如何与 Rack 通信。rack 抽象了底层的 web 服务器交互代码(不论底层的web服务器是什么),只需要按照 rack 约定格式写程序,就可以快速提供 web 服务。

如何判断一个 ruby 程序是不是 rack 应用,可同通过看有没有 config.rb文件。如果有这个文件基本可以判断是 rack 应用。

rack 和 rake 的区别。

不要将Rake与Rack混淆,它们的名称非常相似,但却完全不同。

rack 是 ruby 服务器和 ruby 框架之间的桥梁,是一些协同服务。

rake 是类 make 程序,是任务执行程序。他的规则文件是 Rakefile,规则文件中的目标和依赖都是用 ruby 语法来编写,通过racke可以把一些零散的任务统一通过 rake 来管理。

如何使用 Rack

一个 Rack 应用程序是一个 Ruby 对象用来响应 call 方法调用,该方法接收一个 hash 参数,返回一个字符串列表,列表由三步分组成:http 响应状态码,https 响应头,http 响应体。

下面我们通过一个 hello world 例子来展示 rack 应用程序的编写。我们定义了一个类型对象 HelloWorld ,它处理所有的 http 请求并返回 200 状态码并输出“hello world”作为响应体。

连接底层的 web 服务器

上面我写好了一个应用层代码,现在我们把它与底层的 web 服务器关联。WEBrick 是 ruby 自带的 Http 服务器。我们通过给 Rack::Handler::WEBrick.run 方法传递一个 HelloWorld 类实例和端口来运行 web 服务器。

执行上面的程序会启动 WEBRick,Rack 的作用是在 HTTP 服务器和 HelloWorld 应用程序之前传递请求和响应。

rack 和 rackup 区别

上面例子中启动的程序基本是不可配置的,我们的启动参数都是硬编码写死的。

比较好的替代是通过 rackup 来启动程序。rackup 是一个命令行运行的工具,通过读取 .ru 为后缀的 Rakup 文件来启动程序,让你的程序以 FastCGI, CGI, 或 WEBrick 方式运行。例如上面的程序通过 rackup 启动的配置如下 helloworld.ru

启动之前还需对 HelloWorld 类进行微小的更改。Rackup 中的 Rack :: Lint 会对响应体做一些基本检查。所有的 HTTP 响应都应具有 Content-Type 标头,所以你看到列表中第二项不再为空。

最后一行仅创建该应用程序的一个实例,并将其传递给 run 方法。理想情况下,应用程序不应完全写在Rackup文件中,可以通过 require 来引入该类。Rackup 文件只是“胶水”,最好不要放实现代码。

如果运行命令 rackup helloworld.ru,它将在端口 9292 上启动服务器。这是默认的 Rackup 端口。

Rackup 具有一些更有用的功能。首先,可以在命令行或脚本的特殊行中更改端口之类的内容。在命令行上,只需传入-p端口参数即可。例如:rackup -p 1337 helloworld.ru。从脚本本身来看,如果第一行以#\开头,则将像命令行一样对其进行解析。因此,您也可以在此处定义选项。如果要在端口1337上运行,Rackup文件的第一行可能显示为#\ -p 1337

详细参数可以通过 rackup --help 查看。

其守护进程方式启动程序

测试程序运行正常

参考:

http://crguezl.github.io/apuntes-ruby/node409.html

https://github.com/rack/rack

https://www.thoughtco.com/using-rack-2908121

https://wendig.io/2019/11/12/how-to-host-a-ruby-on-rails-app-with-apache.html

转载请注明本文地址: https://www.nginx.cn/6066.html

分类: 编程语言 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.