1

我正在尝试使用清漆缓存提供 gzip 压缩。但是,当我使用下面提到的清漆配置(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

关于如何修复它以及如何使用 varnish 提供 gzip 压缩的任何建议。

4

3 回答 3

5

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

基本上,如果您希望 Varnish 压缩刚刚设置的对象beresp.do_gzipvcl_fetch它会在将其存储到缓存中之前对其进行压缩。需要时会自动进行解压缩。

于 2012-04-06T11:42:11.863 回答
1

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

...
obj.http.Content-Encoding="gzip";
remove obj.http.Content-Length;
...
于 2012-04-06T05:19:33.550 回答
0

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

于 2015-11-08T16:02:12.843 回答