2012-02-08 84 views
0

我是一个绝对新手清漆&缓存在一般情况下,所以这个问题可能是一些微不足道!清漆/鱿鱼内容缓存与饼干

我正在构建一个Web应用程序(在rails中),我正在寻找一些选项来缓存生产服务器上的内容。到目前为止,我一直在研究Varnish,并且非常关心cookie的非缓存请求。我明白为什么这样的行为是有意的,但有一个用例可以真正有益于如果有某种方法通过cookie来缓存内容。

在我的特殊情况下,很多网址的数据与登录用户无关。例如,tripadvisor可能会将每个登录用户返回的酒店列表的相同数据(至少大部分数据)。所以本质上,尽管cookies会伴随请求/响应,但大约90%的页面对于每个用户来说都是通用的。

在这种情况下,是否可以使用Varnish来缓存这样的URL /页面(可能只是公共部分)。如果是,那么如何。

谢谢!

回答

2

如果我正确理解您的用例。即使存在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,因为它是supported(的支持是有限的,但足够)的清漆,但是这需要你来重写你的应用程序的一部分,恕我直言,使用ESI是真的PITA从长远来看(更难维护)。

0

默认Varnish vcl将'传递'请求与cookie,但使用默认的vcl只适用于测试您的Varnish服务器启动并运行。几乎从来没有默认的VCL没有经过一些修改就可以按需要工作。

您不一定需要删除cookie。更改vcl_recv()中cookie的处理方式更容易。默认情况下,vcl_hash()不会对cookie进行散列。

另外vcl_fetch()不再存在于光油4中。