gzip compression using varnish cache

Posted by Ali Raza on Stack Overflow See other posts from Stack Overflow or by Ali Raza
Published on 2012-04-06T05:00:27Z Indexed on 2012/04/06 5:29 UTC
Read the original article Hit count: 266

Im trying to provide gzip compression using varnish cache. But when I set content-encoding as gzip using my below mentioned configuration for varnish (default.vcl). Browser failed to download those content for which i set content-encoding as gzipped.

Varnish configuration file:

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;
     }
 }

Response Header:

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

Any suggestion on how to fix it and how to provide gzip compression using varnish.

© Stack Overflow or respective owner

Related posts about reverse-proxy

Related posts about varnish