varnish是一个性能十分优越,配置语法又比较灵活的cache软件。当然在对站点做cache的时候,遇到的比较多的一个问题就是对ctrl+F5强制刷新的处理 。例如,有时候想让更新过的内容立即可以启用,就可以在varnish上配置ctrl+F5强制刷新后立即去后端服务器上检测文件的更改,如果更改了,立即取最新的数据过来。其配置如下:

1sub vcl_recv {
2    if (req.http.Cache-Control ~ "no-cache" && client.ip ~ editors) {
3         set req.hash_always_miss = true;
4    }
5}

不过,该语法只最新的varnish 3.0.2 ,具体见varnish的官方WIKI页面。低版本的也可以去官网找到相关的配置方法。

当然,这样做有两个坏处。一是:命中率会下降,后端的服务器压力会略高;二是:当后端出问题时(如宕机),前端cache取到的也是有问题的页面或错误页面。而要解决这个问题也很容易。varnish可以提供了一个类似于密码认证的cookie认证功能,可以通过该功能,配置varinish的基他规则实现。具体如下:

一、在sub vcl_recv里对源域名设置backend

1if (req.http.host ~ "^img.361way.com$") {
2     set req.backend = rescngold;
3#    remove req.http.Cookie;
4     return(lookup);
5}

注:此处我将remove cookie的功能去除了(开启了该功能以后,cache control为no-cache的也将缓存),因为此处这样设置了以后,无论是按官网的方法设置crtl+F5通过或者下面的cookie认证的方法都会没有用。因为其在移除cookie了以后,已经将里面的cache-crontol等信息也清除了。具体原理可以看下面的流程图。

image001

二、在sub vcl_fetch里配置cookie移除和过期时间

1if (req.http.host ~ "^img.361way.com$") {
2    remove beresp.http.Set-Cookie;
3    set beresp.ttl = 1d;
4    set beresp.http.Cache-Control = "max-age=86400";
5    return(deliver);
6}

三、在sub vcl_hit规则里配置cookie认证与cache-control双认证

1if ( req.http.Cookie ~ "pwd=123456" && req.http.Pragma ~ "no-cache" ) {
2   set obj.ttl = 0s ;
3   return (pass);
4}

四、实现cookie认证的方法

1、firefox 浏览器插件

firefox下有一个插件Modify Headers,可以设置相关的cookie值来模拟以上认证的过程。操作步骤为依次点击:工具——附加组件——搜索“modify header”——安装并重启浏览器。

重启后,打开WEB开发人员->Modify Headers,进入Modify Headers的设置页面。如下图所示,其比较人性化的一个功能是带有自动补全功能。

firefox-modify

设置完并start以后,再去打开页面,在web控制台上看查看。发现其会按header value里的值发送给服务器。如下图:

firefox-cookie

通过以上方法设置就可以实现,对需要立即更新的页面里,启用该插件,并ctrl+F5强制刷新。varnish就会从后端重新获取页面而不必等到页面过期再去查看。

2、chrome插件

目前chrome已经变成了firefox最强劲的对手。一般firefox上有的插件在chrome上也能找到相应的插件。其上也一个ModHeader的插件,提供了类似的功能。不过不类从界面还是从自动补全这个功能来看,都比firefox上的那个插件有些逊色。但功能上还是一样的。

chrome-modify

chrome-cookie

3、curl实现

往往最好的方法都在最后提及,该方法是利用linux下的curl工具,通过在参数中set cookie vaule,并向服务器提交。来模拟强制刷新和密码认证的功能。

1curl -I -H Cookie:pwd=123456 -H Pragma:no-cache $url

这样实现起来就可以不经cache server实现更新cache的功能。而且在php、java等编程语言中也有curl相关的函数可以调用。可以通过该方法,自建页面,实现批量更新。

参考页面:

http://zhangxugg-163-com.iteye.com/blog/1075206

http://curl.haxx.se/docs/httpscripting.html

http://blog.csdn.net/zzulp/article/details/8018751