Лак: кешированные и не кешированные субдомены

У нас есть сайт 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);
 }
# 

3 ответа

Решение

Самый простой способ - полностью настроить лак, предполагая 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 вы 'возвращаете (ищите)', вместо этого выполните:
"если host = editors.site.com, return (pass).... else return (lookup)"

     if (! req.http.host == "editors.site.com") {
             возврат (поиск);
     }
     # правило по умолчанию здесь
     возврат (проход);
}


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

 sub vcl_recv {
     if (req.http.x-forwarded-for) {
    set req.http.X-Forwarded-For =
        req.http.X-Forwarded-For ", " client.ip;
     } еще {
    set req.http.X-Forwarded-For = client.ip;
     }
     if (req.request!= "GET" &&
       req.request!= "ГОЛОВА" &&
       req.request!= "PUT" &&
       req.request!= "POST" &&
       req.request!= "TRACE" &&
       req.request!= "ОПЦИИ" &&
       req.request! = "УДАЛИТЬ") {
         /* Не RFC2616 или CONNECT, что странно. */
         возврат (труба);
     }
     if (req.request!= "GET" && req.request!= "HEAD") {
         /* Мы имеем дело только с GET и HEAD по умолчанию * /
         возврат (проход);
     }
     if (req.http.Authorization || req.http.Cookie) {
         /* По умолчанию не кешируется * /
         возврат (проход);
     }

     if (! req.http.host == "editors.site.com") {
             возврат (поиск);
     }
    возврат (проход);
 }

Другие вопросы по тегам