使用 cookie 缓存 Varnish / Squid 内容

发布于 2025-01-03 21:05:51 字数 418 浏览 1 评论 0原文

我是清漆和清漆的绝对新手。一般来说缓存,所以这个问题对某些人来说可能是微不足道的!

我正在构建一个网络应用程序(在 Rails 中),并且正在研究一些在生产服务器上缓存内容的选项。到目前为止,我已经研究了 Varnish,并且有点担心带有 cookie 请求的非缓存。我理解为什么会出现这样的行为,但是如果有某种方法可以通过 cookie 缓存内容,那么有一个用例确实可以受益。

在我的特定情况下,无论登录用户如何,许多网址都具有相同的数据。例如,tripadvisor 可能会向每个登录用户返回酒店列表的相同数据(至少大部分数据)。因此,本质上,尽管 cookie 会伴随请求/响应,但大约 90% 的页面对于每个用户来说都是通用的。

在这种情况下,是否可以使用 Varnish 来缓存此类 url/页面(也许只是公共部分)。如果是,那么如何。

非常感谢!

I'm an absolute newbie to Varnish & caching in general, so this question might be trivial to some !

I'm building a web app (in rails), and I was looking at some options to cache content on production servers. I've so far looked at Varnish, and am slightly concerned about the non-caching of with-cookie requests. I understand why such a behaviour is intended, but there is one use-case that could really benefit if there was some way to cache content over cookies.

In my particular case, a lot of urls have data that is same irrespective of the logged-in user. For example, tripadvisor would possibly be returning every logged-in user the same data (at least majority of the data) for a hotel listing. So essentially, although cookies would accompany the request / response, about 90% of the page would be common for each user.

In such scenarios, is it possible to use Varnish to cache such urls / pages (maybe the common part only). And if yes, then how.

Thanks a ton !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

书信已泛黄 2025-01-10 21:05:51

如果我正确理解你的用例。即使存在 cookie,您也希望缓存页面的子集,因为这些页面对于所有用户来说都是相同的。

执行此操作的最佳方法是识别要始终缓存的页面,例如 /foo.html 和 /bar.html。对于这些页面,您可以删除 VCL 中的 Cookie 请求标头,以便 Varnish 可以缓存该页面。

您可以使用以下 VCL 代码作为示例:

sub vcl_fetch {
    [...]
    if(req.url ~ "/foo.html" || req.url ~ "/bar.html") {
        unset req.http.Cookie
    }

    [...]
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
}

如果您有更多页面,您可以在 if 条件中使用正则表达式来匹配您的页面名称。

如果您只想缓存页面的部分内容,则可以使用 ESI 因为它是 支持(支持有限但足够),但这需要你重写你的部分应用程序和恕我直言,从长远来看,使用 ESI 实际上是一个 PITA(更难维护)。

If I understood your use case correctly. You would like to cache a subset of pages even in presence of cookies because those pages will be the same for all users.

The best way to do this would be to identify the pages you want to cache all the time, let's say /foo.html and /bar.html. For those pages you can remove the Cookie request header in VCL so Varnish can cache the page.

You can use the following VCL code as an example:

sub vcl_fetch {
    [...]
    if(req.url ~ "/foo.html" || req.url ~ "/bar.html") {
        unset req.http.Cookie
    }

    [...]
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
}

If you have much more pages you can use a regular expression in the if condition to match you page names.

If you want to only cache parts of a page then you can use ESI since it is supported (the support is limited but sufficient) by Varnish but this requires you to rewrite part of your application and IMHO using ESI is really a PITA in the long run (harder maintenance).

み青杉依旧 2025-01-10 21:05:51

默认的 Varnish vcl 将“传递”带有 cookie 的请求,但使用默认的 vcl 仅适用于测试您的 Varnish 服务器是否已启动并运行。如果不进行一些修改,默认的 vcl 几乎永远不会按需要工作。

您不一定需要删除 cookie。在 vcl_recv() 中更改使用 cookie 处理请求的方式会更容易。默认情况下,vcl_hash() 不会对 cookie 进行哈希处理。

此外,Varnish 4 中不再存在 vcl_fetch()。

The default Varnish vcl will 'pass' requests with cookies but using the default vcl is only good for testing that your Varnish server is up and running. Almost never does the default vcl work as desired without some modification.

You do not necessarily need to remove the cookie. It is easier to change how you handle requests with cookies from within vcl_recv(). vcl_hash() does not hash over a cookie by default.

In addition vcl_fetch() no longer exists in Varnish 4.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文