Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

We havie Plone site coming through Varnish front end cache. We'd like to give two different subdomains www.site.com and editors.site.com for this site. The latter would always be serving non-cached versions of the pages and used by the site maintainers to update the content.

What would be the simplest way to accomplish this?

Varnish 2.x - based on the default Debian template

Config below:

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

sub vcl_recv {
    if (req.http.host ~ "(www\.)?site\.com(:[0-9]+)?$") {
                set req.url = "/VirtualHostBase/http/www.site.com:80/LS/VirtualHostRoot" req.url;
                set req.backend = default;      
    }
        else if (req.http.host ~ "editors.site.com(:[0-9]+)?$") {
                set req.url = "/VirtualHostBase/http/editors.site.com:80/LS/VirtualHostRoot" req.url;
                set req.backend = default;
        }
}



# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.
# 
 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);
     }
     if (req.request != "GET" && req.request != "HEAD") {
         /* We only deal with GET and HEAD by default */
         return (pass);
     }
     if (req.http.Authorization || req.http.Cookie) {
         /* Not cacheable by default */
         return (pass);
     }
     return (lookup);
 }

 sub vcl_pipe {
     # Note that only the first request to the backend will have
     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
     # have it set for all requests, make sure to have:
     # set req.http.connection = "close";
     # here.  It is not set by default as it might break some broken web
     # applications, like IIS with NTLM authentication.
     return (pipe);
 }
# 
 sub vcl_pass {
     return (pass);
 }
# 
 sub vcl_hash {
     set req.hash += req.url;
     if (req.http.host) {
         set req.hash += req.http.host;
     } else {
         set req.hash += server.ip;
     }
     return (hash);
 }
# 
sub vcl_hit {
     if (!obj.cacheable) {
         return (pass);
     }
     return (deliver);
 }
# 
 sub vcl_miss {
     return (fetch);
 }
# 
 sub vcl_fetch {
     if (!beresp.cacheable) {
         return (pass);
     }
     if (beresp.http.Set-Cookie) {
         return (pass);
     }
     return (deliver);
 }
# 
 sub vcl_deliver {
     return (deliver);
 }
# 
share|improve this question

3 Answers 3

up vote 2 down vote accepted

The simplest way is to configure varnish entirely assuming www.site.com. Then add these three lines to the top of your vcl_recv.

if (req.http.host == 'editors.site.com') {
    return (pass);
}
share|improve this answer
    
That's kind of what I already stated, except that if he add it to the top no other rules will apply. –  3molo Aug 4 '11 at 12:56
    
A "return(pass)" in vcl_recv does not prevent caching, it prevents lookup. The result being object cached but never reused. Please correct me if I'm wrong. –  user138214 Apr 18 '13 at 12:21

In the bottom of your vcl_recv, you 'return (lookup)', Instead, do a:
"if host = editors.site.com, return (pass).... else return (lookup)"

     if (!req.http.host == "editors.site.com") {
             return (lookup);
     }
     # default rule here
     return (pass);
}


Here's your config edited

 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);
     }
     if (req.request != "GET" && req.request != "HEAD") {
         /* We only deal with GET and HEAD by default */
         return (pass);
     }
     if (req.http.Authorization || req.http.Cookie) {
         /* Not cacheable by default */
         return (pass);
     }

     if (!req.http.host == "editors.site.com") {
             return (lookup);
     }
    return (pass);
 }

share|improve this answer

Just tuck return(pass); in the editor part, all Varnish won't cache those requests then.

sub vcl_recv {
[... snip ...]
        else if (req.http.host ~ "editors.site.com(:[0-9]+)?$") {
                set req.url = "/VirtualHostBase/http/editors.site.com:80/LS/VirtualHostRoot" req.url;
                set req.backend = default;
                return(pass);
        }
}
share|improve this answer
    
If he does that, no other (default) rules will apply. –  3molo Aug 4 '11 at 12:56

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.