Rack 提供了一个最小的、模块化的、适应性强的接口,用于在 Ruby 中开发 Web 应用程序。通过以最简单的方式包装 HTTP 请求和响应,它将 Web 服务器、Web 框架和 Web 应用程序之间的桥梁统一并提炼为单个方法调用。
机架规范中描述了其具体细节,所有机架应用程序都应遵守该规范。
版本 | 支持 |
---|---|
3.1.x | 错误修复和安全补丁。 |
3.0.x | 仅安全补丁。 |
2.2.x | 仅安全补丁。 |
<= 2.1.x | 支持结束。 |
请参阅安全政策以获取更多信息。
这是机架的最新版本。它包含错误修复和安全补丁。请检查变更日志以获取有关特定变更的详细信息。
此版本的机架包含重大更改,升级指南中详细介绍了这些更改。建议尽快升级到机架 3,以获得最新的功能和安全补丁。
此版本的 Rack 仅接收安全补丁,应努力迁移到 Rack 3。
从 Ruby 3.4 开始, base64
依赖项将不再是默认 gem,并且可能会导致有关缺少base64
警告或错误。要纠正此问题,请将base64
作为依赖项添加到您的项目中。
将rack gem 添加到您的应用程序包中,或按照受支持的 Web 框架提供的说明进行操作:
# Install it generally:
$ gem install rack
# or, add it to your current application gemfile:
$ bundle add rack
如果您需要Rack::Session
或bin/rackup
中的功能,请单独添加这些 gem。
$ gem install rack-session rackup
创建一个名为config.ru
的文件,其中包含以下内容:
run do | env |
[ 200 , { } , [ "Hello World" ] ]
end
使用rackup gem 或其他受支持的Web 服务器运行此程序。
$ gem install rackup
$ rackup
# In another shell:
$ curl http://localhost:9292
Hello World
机架受到多种服务器的支持,包括:
您需要查阅服务器文档以了解它们可能具有哪些功能和限制。一般来说,任何有效的 Rack 应用程序都将在所有这些服务器上以相同的方式运行,无需进行任何更改。
Rack 提供了一个单独的 gem,rackup,它是一个通用接口,用于在支持的服务器上运行 Rack 应用程序,其中包括WEBRick
、 Puma
、 Falcon
等。
这些框架和许多其他框架都支持机架规范:
在服务器和框架之间,Rack 可以使用中间件根据您的应用程序需求进行定制。 Rack 本身附带以下中间件:
Rack::CommonLogger
用于创建 Apache 风格的日志文件。Rack::ConditionalGet
用于在响应未更改时返回 Not Modified 响应。Rack::Config
用于在处理请求之前修改环境。Rack::ContentLength
用于根据正文大小设置content-length
标头。Rack::ContentType
用于设置响应的默认content-type
标头。Rack::Deflater
用于使用 gzip 压缩响应。Rack::ETag
用于在可缓冲的实体上设置etag
标头。Rack::Events
。Rack::Files
用于提供静态文件。Rack::Head
用于为 HEAD 请求返回一个空主体。Rack::Lint
用于检查是否符合机架规范。Rack::Lock
用于使用互斥体序列化请求。Rack::MethodOverride
用于根据提交的参数修改请求方法。Rack::Recursive
用于包含应用程序中其他路径的数据,以及执行内部重定向。Rack::Reloader
用于重新加载已修改的文件。Rack::Runtime
,用于包含响应标头以及处理请求所需的时间。Rack::Sendfile
用于使用可对文件系统路径使用优化文件服务的 Web 服务器。Rack::ShowException
用于捕获未处理的异常,并通过可单击的回溯以良好且有用的方式呈现它们。Rack::ShowStatus
用于使用漂亮的错误页面来进行空客户端错误响应。Rack::Static
用于更可配置的静态文件服务。Rack::TempfileReaper
用于删除请求期间创建的临时文件。所有这些组件都使用相同的接口,机架规范中对此进行了详细描述。这些可选组件可以按照您希望的任何方式使用。
如果您想在现有框架之外进行开发、实现自己的框架或开发中间件,Rack 提供了许多帮助程序来快速创建 Rack 应用程序,而无需重复执行相同的 Web 操作:
Rack::Request
还提供查询字符串解析和多部分处理。Rack::Response
用于方便生成 HTTP 回复和 cookie 处理。Rack::MockRequest
和Rack::MockResponse
用于高效、快速地测试 Rack 应用程序,无需真正的 HTTP 往返。Rack::Cascade
用于在应用程序返回未找到或方法不支持的响应时尝试其他 Rack 应用程序。Rack::Directory
,用于在给定目录下提供文件服务,并带有目录索引。Rack::MediaType
用于解析内容类型标头。Rack::Mime
用于根据文件扩展名确定内容类型。Rack::RewindableInput
用于使用临时文件缓冲区使任何 IO 对象可回滚。Rack::URLMap
用于路由到同一进程内的多个应用程序。 Rack 公开了几个配置参数来控制实现的各种功能。
param_depth_limit
Rack :: Utils . param_depth_limit = 32 # default
参数中允许的最大嵌套数量。例如,如果设置为 3,则允许使用以下查询字符串:
?a[b][c]=d
但不允许使用此查询字符串:
?a[b][c][d]=e
限制深度可以防止解析参数时可能出现的堆栈溢出。
multipart_file_limit
Rack :: Utils . multipart_file_limit = 128 # default
请求可以包含的文件名部分的最大数量。接受太多部分可能会导致服务器耗尽文件句柄。
默认值为128,这意味着单个请求不能一次上传超过128个文件。设置为 0 表示无限制。
也可以通过RACK_MULTIPART_FILE_LIMIT
环境变量进行设置。
(为了兼容性,这也被别名为multipart_part_limit
和RACK_MULTIPART_PART_LIMIT
)
multipart_total_part_limit
请求可以包含任何类型的部分的最大总数,包括文件和非文件表单字段。
默认值为 4096,这意味着单个请求不能包含超过 4096 个部分。
设置为 0 表示无限制。
也可以通过RACK_MULTIPART_TOTAL_PART_LIMIT
环境变量进行设置。
请参阅 CHANGELOG.md。
有关如何为 Rack 做出贡献的具体详细信息,请参阅 CONTRIBUTING.md。
请将错误、建议和补丁发布到 GitHub Issues。
请查看我们的安全政策,了解负责任的披露和安全错误报告流程。由于该库的广泛使用,我们强烈建议我们管理时间,以便在披露时提供可行的补丁。非常感谢您在此事上的协助。
rackup
用于从命令行运行 Rack 应用程序的有用工具,包括用于脚本服务器的Rackup::Server
(以前称为Rack::Server
)。
rack-contrib
大量有用的中间件催生了对收集新鲜 Rack 中间件的项目的需求。 rack-contrib
包含各种 Rack 附加组件,可以轻松贡献新模块。
rack-session
为Rack提供便捷的会话管理。
Rack 核心团队包括
和机架校友
感谢:
Rack::Deflater
。Rack::ContentType
作者。Rack::Response
接口。Rack::Response
进行了改进。Rack 是根据 MIT 许可证发布的。