2012-04-06 110 views
1

我试图使用清漆缓存提供gzip压缩。但是当我使用下面提到的清漆配置(default.vcl)将content-encoding设置为gzip时。浏览器无法下载我为其设置内容编码的内容。使用清漆缓存的gzip压缩

光油配置文件:

backend default { 
     .host = "127.0.0.1"; 
     .port = "9000"; 
} 

backend socketIO { 
     .host = "127.0.0.1"; 
     .port = "8083"; 
} 

acl purge { 
     "127.0.0.1"; 
     "192.168.15.0"/24; 
} 

sub vcl_fetch { 
    /* If the request is for pictures, javascript, css, etc */ 
     if (req.url ~ "^/public/" || req.url ~ "\.js"){  
     unset req.http.cookie;  
     set beresp.http.Content-Encoding= "gzip"; 
     set beresp.ttl = 86400s; 
     set beresp.http.Cache-Control = "public, max-age=3600"; 
     /*set the expires time to response header*/ 
     set beresp.http.expires=beresp.ttl;  
       /* marker for vcl_deliver to reset Age: */ 
       set beresp.http.magicmarker = "1"; 
    } 

    if (!beresp.cacheable) { 
     return (pass); 
    } 
    return (deliver); 
} 
sub vcl_deliver { 
    if (resp.http.magicmarker) { 
     /* Remove the magic marker */ 
     unset resp.http.magicmarker; 

     /* By definition we have a fresh object */ 
     set resp.http.age = "0"; 
    } 

    if(obj.hits > 0) { 
     set resp.http.X-Varnish-Cache = "HIT"; 
    }else { 
     set resp.http.X-Varnish-Cache = "MISS"; 
    } 

    return (deliver); 
} 

sub vcl_recv { 
    if (req.http.x-forwarded-for) { 
     set req.http.X-Forwarded-For = 
      req.http.X-Forwarded-For ", " client.ip; 
     } else { 
     set req.http.X-Forwarded-For = client.ip; 
     } 
     if (req.request != "GET" && 
      req.request != "HEAD" && 
      req.request != "PUT" && 
      req.request != "POST" && 
      req.request != "TRACE" && 
      req.request != "OPTIONS" && 
      req.request != "DELETE") { 
      /* Non-RFC2616 or CONNECT which is weird. */ 
      return (pipe); 
     } 
    # Pass requests that are not GET or HEAD 
    if (req.request != "GET" && req.request != "HEAD") { 
     return(pass); 
    }   

    #pipe websocket connections directly to Node.js 
    if (req.http.Upgrade ~ "(?i)websocket") { 
     set req.backend = socketIO; 
     return (pipe); 
    } 

    # Properly handle different encoding types 
     if (req.http.Accept-Encoding) { 
     if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|js|css)$") { 
      # No point in compressing these 
      remove req.http.Accept-Encoding; 
     } elsif (req.http.Accept-Encoding ~ "gzip") { 
      set req.http.Accept-Encoding = "gzip"; 
     } elsif (req.http.Accept-Encoding ~ "deflate") { 
      set req.http.Accept-Encoding = "deflate"; 
     } else { 
      # unkown algorithm 
      remove req.http.Accept-Encoding; 
     } 
     } 

    # allow PURGE from localhost and 192.168.15... 
     if (req.request == "PURGE") { 
       if (!client.ip ~ purge) { 
         error 405 "Not allowed."; 
       } 
       return (lookup); 
     } 
    return (lookup); 
} 

sub vcl_hit { 
     if (req.request == "PURGE") { 
       purge_url(req.url); 
       error 200 "Purged."; 
     } 
} 

sub vcl_miss { 
     if (req.request == "PURGE") { 
       purge_url(req.url); 
       error 200 "Purged."; 
     } 
} 

sub vcl_pipe { 
    if (req.http.upgrade) { 
     set bereq.http.upgrade = req.http.upgrade; 
    } 
} 

响应头:

Cache-Control:public, max-age=3600 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Length:11520 
Content-Type:application/javascript 
Date:Fri, 06 Apr 2012 04:53:41 GMT 
ETag:"1330493670000--987570445" 
Last-Modified:Wed, 29 Feb 2012 05:34:30 GMT 
Server:Play! Framework;1.2.x-localbuild;dev 
Via:1.1 varnish 
X-Varnish:118464579 118464571 
X-Varnish-Cache:HIT 
age:0 
expires:86400.000 

上如何解决此问题以及如何使用清漆提供gzip压缩任何建议。

回答

5

Varnish Cache 3.0自动处理Accept-Encoding的大部分内容,你不应该搞砸它。

基本上,如果你想让Varnish在vcl_fetch中设置beresp.do_gzip这个对象,它会在压缩之前将其存储在缓存中。需要时会自动解压缩。

1

内容长度似乎是错误的,请尝试取消设置它。另外,为什么在vcl_fetch中使用beresp而不是obj?

... 
obj.http.Content-Encoding="gzip"; 
remove obj.http.Content-Length; 
... 
0

检查并看看你是否与Apache,并启用mod_deflate, 尝试禁用它。