2017 年 11 月 27 日,星期一

Rails 5.2.0 测试版:Active Storage、Redis 缓存存储、HTTP/2 早期提示、CSP、凭据

由 dhh 发布

长期以来,处理 Rails 中的文件上传一直十分困难。当然,有很多优秀的插件可用,但我们极需要将某些功能直接整合到框架中。现在我们做到了!

借助 Rails 5.2 中新的 Active Storage 框架,我们已经找到了直接将文件上传到云端的现代化方法。开箱即用,该方法支持 Amazon 的 S3、Google 的 Cloud Storage 和 Microsoft Azure Cloud File Storage。

如果您正在处理图像,您可以实时创建变体。如果您正在处理视频或 PDF,您可以实时创建预览。无论处理哪种类型,您都可以异步分析上传内容以提取元数据。

Active Storage 是由 George Claghorn 和本人从 Basecamp 3 中提取的。因此,该框架不仅已用于生产,还诞生于生产中。这是 Extraction Design 的保证印章没跑了!

说到提取,Jeremy Daer 已经解开了我们之前在 Basecamp 使用的、无比复杂的破解方法的纠葛,这些方法使用 Redis 来执行通用部分、片段和其他 Rails 缓存作业。有一个闪亮的 Redis Cache Store,该存储将这些年来经过实践检验的破解方法整合到一个任何人都可以使用的统一单元中。

此新的 Redis 缓存存储支持 Redis::Distributed,以实现类似 Memcached 的跨 Redis 分片。它具有容错能力,因此会将故障当做未命中来处理,而不是通过异常中断请求。它甚至支持分布式 MGET 以获得完整的部分集合缓存效果。

这与缓存效率大幅提升并驾齐驱,得益于 密钥回收压缩 在默认情况下均可用。对于 Basecamp 而言,这意味着将缓存生命期提高了两个数量级!我们的缓存不再像以前那样即使在一天之内也会被破坏,而是能够持续几个月。如果您正在使用部分缓存和嵌套 dolls 策略,这两个改动之间会大幅提高您的缓存生命期。

借助 Aaron Patterson 和 Eileen Uchitelle 的工作,我们还采纳了 HTTP/2 的精华 —— 早期提示。这意味着我们可以自动指示 Web 服务器尽早发送所需的样式表和 JavaScript 资源。这意味着可以更快地交付整个页面,试问谁会不想要呢?

在性能话题上,Rails 现在在默认 Gemfile中附带 Bootsnap,它是由我们在 Shopify 的朋友创建的。它通常将应用程序启动时间缩短 50% 以上。

Rails 始终走在让您的 Web 应用程序更安全的道路上,它通过内置 CSRF 和 XSS 保护引领着道路,而在 Rails 5.2 中我们通过添加一个 新的 DSL 进一步增强了它,这个 DSL 允许您为自己的应用程序配置一个 内容安全策略。您可以配置一个全局默认策略,然后在每个资源基础上重写它,乃至使用 lambda 来将基于请求的值注入到标题中,比如多租户应用程序中的帐户子域。

但是它并非全然都是一些令人目眩神迷的奇迹。在 Rails 5.1 中,我们添加了 加密后的密钥。这些密钥就像那些老密钥一样,但是,呃,更安全,因为,您知道,加密!很困惑?是的。您为何会想要那些实际上并不安全的秘密?当然,您不会。

在 Rails 5.2 中,我们通过弃用两种不同的密钥,引入一个叫 Credential 的新共享概念,来纠正了这个混乱的局面。Credential,比如 AWS 访问密钥和其他形式的登录信息和密码,是密钥的主要用例,所以为什么不直接把它们称其为 Credential 呢?因此就称它们为 Credential 吧!

Credential 总是被加密的。这意味着它们可以安全地检入版本控制中,只要您让密钥置身其外。这意味着原子部署,无需忙于大量的环境变量和其他好处,而好处就是将应用程序需要的所有 Credential 集中在一处,既安全又有保障。

此外,我们已经开放了 Credential 下面的 API,这样您就可以轻松处理其他加密的配置项、密钥和文件。

自 Rails 5.1 以来,我们还在 Webpacker 方面取得了长足的进步。因此,Rails 5.2 旨在与新的 Webpacker 3.0 版本完美匹配。Rails 已经完全接受现代 JavaScript,采用由 Webpack 运行的预配置构建管道。我们一直在加强这种关系。

当然在这个全新的大版本当中还有 约有 50 亿的其他修复、改进和调整。自 Rails 5.1 起,它在过去大约 7 个月中得到了亲切的问候。我们非常高兴与您分享所有这些,一如既往地感谢 众多的贡献者,他们为让 Rails 成为一个精彩的框架所做出的不懈努力。

这是 Rails 5.2 的第一个测试版。我们仍在为每一项工作添加最后的润色,但我们强烈鼓励您尝试一下!请尝试升级现有应用,并在此基础上启动新的应用。我们需要您的帮助,以实现一个可靠的版本。请注意,Basecamp 已经在生产中运行其最新代的应用程序,因此虽然可能仍然会存在一些问题,但它已经处于一个令人满意的状态。

另请注意,这很可能就是 5 系列的最后一个“次要”版本(如果你问我,对于一个次要版本来说,它意义重大!)。我们的下一个目标将是 Rails 6.0!