Назад | Перейти на главную страницу

Varnish: кешированные и некэшированные поддомены

У нас есть сайт на Plone, который проходит через кеш внешнего интерфейса Varnish. Мы хотели бы выделить для этого сайта два разных поддомена www.site.com и editors.site.com. Последний всегда будет обслуживать некэшированные версии страниц и использоваться разработчиками сайта для обновления содержимого.

Каким будет самый простой способ добиться этого?

Varnish 2.x - на основе шаблона Debian по умолчанию

Конфигурация ниже:

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

Самый простой способ - полностью настроить лак на сайте www.site.com. Затем добавьте эти три строки в начало файла vcl_recv.

#changed single quotes to double quotes throws error for single quotes in varnish 3.0
if (req.http.host == "editors.site.com") {
    return (pass);
}

Просто подвернуть возврат (пас); в редакторе все Varnish не будет кэшировать эти запросы.

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

Внизу вашего vcl_recv вы «return (lookup)», вместо этого выполните:
"если host = editors.site.com, вернуть (пройти) .... еще возврат (поиск) "

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


Вот ваш конфиг отредактирован

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