Skip to content

Instantly share code, notes, and snippets.

@mostalive
Created December 17, 2010 07:57

Revisions

  1. mostalive created this gist Dec 17, 2010.
    150 changes: 150 additions & 0 deletions default.vcl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,150 @@
    #varnish cache server configuration file, used with drupal 6 and apache
    #inspiration from https://wiki.fourkitchens.com/display/PF/Configure+Varnish+for+Pressflow
    #with change from obj to beresp of
    #http://www.mail-archive.com/[email protected]/msg02911.html
    #and cache HIT or MISS header from somewhere else
    backend default {
    .host = "127.0.0.1";
    .port = "80";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    }

    sub vcl_recv {
    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);
    }

    if (req.request != "GET" && req.request != "HEAD") {
    /* We only deal with GET and HEAD by default */
    return (pass);
    }

    // Remove has_js and Google Analytics cookies.
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+)=[^;]*", "");

    // To users: if you have additional cookies being set by your system (e.g.
    // from a javascript analytics file or similar) you will need to add VCL
    // at this point to strip these cookies from the req object, otherwise
    // Varnish will not cache the response. This is safe for cookies that your
    // backed (Drupal) doesn't process.
    //
    // Again, the common example is an analytics or other Javascript add-on.
    // You should do this here, before the other cookie stuff, or by adding
    // to the regular-expression above.


    // Remove a ";" prefix, if present.
    set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
    // Remove empty cookies.
    if (req.http.Cookie ~ "^\s*$") {
    unset req.http.Cookie;
    }

    if (req.http.Authorization || req.http.Cookie) {
    /* Not cacheable by default */
    return (pass);
    }

    // Skip the Varnish cache for install, update, and cron
    if (req.url ~ "install\.php|update\.php|cron\.php") {
    return (pass);
    }

    // Normalize the Accept-Encoding header
    // as per: http://varnish-cache.org/wiki/FAQ/Compression
    if (req.http.Accept-Encoding) {
    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
    # No point in compressing these
    remove req.http.Accept-Encoding;
    }
    elsif (req.http.Accept-Encoding ~ "gzip") {
    set req.http.Accept-Encoding = "gzip";
    }
    else {
    # Unknown or deflate algorithm
    remove req.http.Accept-Encoding;
    }
    }


    //https://wiki.fourkitchens.com/display/PF/Modules+that+break+caching,+and+how+to+fix+them
    //prevent page generation with global redirect
    if (req.url ~ "node\?page=[0-9]+$") {
    set req.url = regsub(req.url, "node(\?page=[0-9]+$)", "\1");
    return (lookup);
    }


    // Let's have a little grace
    set req.grace = 30s;

    return (lookup);
    }

    sub vcl_hash {
    if (req.http.Cookie) {
    set req.hash += req.http.Cookie;
    }
    }

    // Strip any cookies before an image/js/css is inserted into cache.
    sub vcl_fetch {
    if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
    // This is for Varnish 2.0; replace obj with beresp if you're running
    // Varnish 2.1 or later.
    unset beresp.http.set-cookie;
    }
    }

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

    sub vcl_error {
    // Let's deliver a friendlier error page.
    // You can customize this as you wish.
    set obj.http.Content-Type = "text/html; charset=utf-8";
    synthetic {"
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    <title>"} obj.status " " obj.response {"</title>
    <style type="text/css">
    #page {width: 400px; padding: 10px; margin: 20px auto; border: 1px solid black; background-color: #FFF;}
    p {margin-left:20px;}
    body {background-color: #DDD; margin: auto;}
    </style>
    </head>
    <body>
    <div id="page">
    <h1>Page Could Not Be Loaded</h1>
    <p>We're very sorry, but the page could not be loaded properly. This should be fixed very soon, and we apologize for any inconvenience.</p>
    <hr /> <h4>Debug Info:</h4>
    <pre>
    Status: "} obj.status {"
    Response: "} obj.response {"
    XID: "} req.xid {"
    </pre>
    <address><a href="http://www.varnish-cache.org/">Varnish</a></address>
    </div>
    </body>
    </html>
    "};
    return(deliver);
    }