【问题标题】:Is Varnishd the right caching solution to use with Rails?Varnishd 是与 Rails 一起使用的正确缓存解决方案吗?
【发布时间】:2011-06-04 08:31:51
【问题描述】:

我想在我们的 Web 应用程序中缓存由 Rails 堆栈呈现但不经常更改的完整页面(数千个页面)。每次渲染在资源方面都非常昂贵。

我对 Varnishd 工作原理的理解是,当对 URL 进行初始调用时,Varnishd 将检查其缓存存储,会发生未命中,因此请求将传递给 Rails,生成的结果页面是然后添加到 Varnishd 缓存中。

对该 URL 的任何后续调用,然后从 Varnishd 缓存中提供服务,都不涉及 Rails 堆栈。

这是正确的还是我错了?

如何让我的应用在特定页面已更新并反映其缓存存储中所做的任何更改时告诉 Varnishd?

Varnishd 是一个很好的选择吗?

感谢您的帮助 - 我知道这些是非常基本的问题,但文档并没有说明这一点(至少对我而言)。

【问题讨论】:

    标签: ruby-on-rails caching varnish


    【解决方案1】:

    我建议阅读 Mark Nottingham 的 HTTP 缓存指南:http://www.mnot.net/cache_docs/

    为了使用带缓存的反向代理,您需要在 http 响应中指定到期时间。当有新内容可用时,通常不可能“告诉”缓存服务器,因为该协议旨在通过互联网联合起来,当你有新的小猫图片时,你不希望告诉世界各地的服务器:- )

    Rails 页面缓存根本不是一回事。这只是将工作卸载到 Web 服务器以静态地提供文件,但不涉及决策中的 http 协议。

    警告:我应该指出我没有亲自尝试过 Varnish。这个答案是基于(我认为正确的)Varnish 是一个 http 缓存反向代理的假设。

    【讨论】:

    • 正确,Varnish 是一个带有 HTTP 缓存并针对 HTTP 缓存进行了优化的 HTTP 反向代理。如果您尝试过 Heroku,那么您已经尝试过 Varnish。
    • 大多数反向代理实际上都有办法“告诉”缓存有新内容可用,但是您是正确的,您需要知道要刷新哪些服务器,并配置一种向它们发出信号的方式。 Varnish 有一个管理界面,一个控制通道,您可以从应用程序或手动连接到它,因此如果您知道要刷新哪些服务器,那么很容易做到。
    【解决方案2】:

    如 noodl 的回答中所述,如果使用反向代理,通常会使页面过期超出您的控制范围。另一种方法是您需要管理过期将是使用 rails page caching(参见第 1.1 节),这使得 rails 在第一次调用操作时将响应呈现到磁盘(进入公共目录),您可以使用您的前端网络服务器直接提供这些 html 文件。我为此使用 nginx,并有一个指令来提供任何存在的静态文件(通常是图像,但也适用于 html 页面,并通过正确的重写来解释 .html 扩展名)。使用由 rails 管理的缓存,您可以自己过期,就像在指南页面上的示例中那样,当创建新项目时索引过期。

    我的理解是反向 http 代理的目的是在吞吐量非常高时提高性能,因为它允许缓存传播到您无法控制的网络部分,但是如果它是您建议的渲染时间,那么rails 页面缓存对您来说可能是一个不错的选择。

    【讨论】:

    • 实际上...如今,在达到 TTL 之前找到不支持缓存失效的专用反向代理非常罕见。这是一个重要的用例。它只是通常不使用标准的 HTTP 缓存头来完成。
    • 啊,很高兴知道,我看到有一个新的答案提到了如何做到这一点。
    【解决方案3】:

    要进行动态缓存失效,您可以通过管理通道从应用服务器发送purge.url {some regexp}。例如,purge.url "^/some/page/$"。然而,在 Rails 中,使用PURGE HTTP 方法可能是最简单的。因此,您可以针对同一个 URI 执行PURGE,而不是执行 HTTP GET

    PURGE /some/page/ HTTP/1.0
    Host: example.com
    

    此请求必须来自 localhost,除非您在配置中覆盖它。

    一些链接:

    【讨论】:

      【解决方案4】:

      页面缓存可能是您想要的。它会比 Varnish 更容易设置和维护。当您开始扩展到多个应用程序服务器时,使用反向代理缓存确实有一些优势,因为您可以在一个地方而不是在每个应用程序服务器上使缓存无效。

      您可以配置 Varnish 以响应 HTTP PURGE 请求,当页面发生更改时,Rails 会告诉 Varnish。这是pluginarticle

      【讨论】:

      • 如果您有简单的缓存需求,可以。如果你需要用你的缓存系统做任何远程复杂的事情,Rails 页面缓存可能是不够的。 Varnish 在大多数人超越 Rails 页面缓存这一点上确实大放异彩。
      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2014-04-26
      • 2011-03-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多