如何使用Varnish,PHP和Cookiescaching网站

我认为在我的网站上开始使用Varnish。 我刚刚尝试了清漆,我想知道如何caching页面,即使我的网站使用Cookie,谷歌分析。 我试图删除它们,但它似乎不清漆。 这是我的configuration看起来像; http://pastie.org/1254664 。 如果有关系,我有一台Debian服务器和一台使用Ubuntu服务器的服务器。 那么,即使我使用cookies,我如何caching网站?

先谢谢你!

另外:我没有得到任何X-Cache:HIT / MISS。 我究竟做错了什么?

对于使用Varnish进行caching,我相当新,但是到目前为止,这是我学到的东西:使用Varnish对应用程序进行caching时需要考虑几个因素。

在你的情况下,知道什么是设置和什么目的。 如果清漆看到您的请求的cookie,您将被传递到后端,导致caching未命中。

Google Analytics Cookie

如果您使用的是Google Analytics(分析)Cookie,则可以安全地将其置于清漆中; 不用担心,您的遗传algorithm报告中的数据仍然存在。 在你的vcl_recv使用这样的东西

 set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[az]+|__utma_a2a)=[^;]*", ""); 

你也可以在vcl_recv尝试更多的清理行

去掉 ”;” 来自Cookies的前缀

 set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); 

取消设置空的Cookie

 if (req.http.Cookie ~ "^\s*$") { unset req.http.Cookie; } 

应用程序特定的Cookie

如果您的应用程序在用户login时设置了一个cookie来执行一个function,那么这些请求不应该被caching并直接发送到后端。 否则,您可以caching通过login用户查看的页面(错误)。

使用这样的东西:

 if (req.http.Authorization || req.http.Cookie) { return (pass); } 

HTH,祝你好运。

编辑

用这个来看清楚什么是清漆曲奇:

 varnishtop -i RxHeader -I Cookie 

如果你是正义错过任何,赶上他们在这里!

我不了解清漆。 但是根据我在服务器pipe理方面的经验,先尝试一下局域网中的东西,而不是移动到互联网上。

这就是http中的Vary-header所用的变体:应该返回相同资源的变体。 清漆理解Vary: cookies

如果你没有得到X-Cache头文件,你根本就不能连接到caching; 你确定它运行在正确的IP /端口?

您可能会将您网站的某些部分传递给后端,而无需caching。

vcl_recv和vcl_fetch块最简单的例子:

 sub vcl_recv { if (req.url ~ "^/somescript.php") { return (pass); } else { unset req.http.Cookie; } return(lookup); } sub vcl_fetch { if (req.url ~ "^/somescript.php") { return (pass); } else { unset req.http.Cookie; } return(deliver); } 

阅读 – 阅读这个了解为什么清漆错过

运行varnishlog ,看看你是否真的要通过清漆

我的build议是检查您确实需要cookies的url(例如pipe理面板),并删除所有其他url的cookie。 看下面的例子:

 sub vcl_recv { if (req.url ~ "^/admin/") { # administration panel set req.http.admin = 1; } else { # public web site, ignore client request for fresh content, remove cookies unset req.http.Cache-Control; unset req.http.Max-Age; unset req.http.Pragma; unset req.http.Cookie; } ... } sub vcl_fetch { if (req.http.admin == 1) { # administration panel return (hit_for_pass); } else { # public web site, not allowed to set cookies unset beresp.http.Set-Cookie; ... } ... }