使用varnish cache进行gzip压缩

时间:2012-04-06 05:00:27

标签: reverse-proxy varnish varnish-vcl

我试图使用varnish cache提供gzip压缩。但是当我使用下面提到的varnish配置(default.vcl)将内容编码设置为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压缩的任何建议。

3 个答案:

答案 0 :(得分:5)

Varnish Cache 3.0会自动完成Accept-Encoding的大部分处理,你不应该搞乱它。

基本上,如果你希望Varnish压缩一个对象,只需在beresp.do_gzip中设置vcl_fetch,它会在将其存储在缓存中之前对其进行压缩。无压缩在需要时自动发生。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

检查并查看您是否使用了apache,并启用了mod_deflate, 尝试禁用它。