Varnish:缓存和非缓存子域名

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

答案1

最简单的方法是完全假设 www.site.com 来配置 varnish。然后将这三行添加到 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);
}

答案2

只需将 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);
        }
}

答案3

在 vcl_recv 的底部,您“返回(查找)”,而是执行:
“如果 host = editors.site.com,则返回(传递)...”。别的返回(查找)”

     如果 (!req.http.host == "editors.site.com") {
             返回(查找);
     }
     # 这里是默认规则
     返回(通过);
}


这是你修改后的配置

子vcl_recv{
     如果(req.http.x-forwarded-for){
    设置 req.http.X-Forwarded-For =
        req.http.X-Forwarded-For ", " 客户端.ip;
     } 别的 {
    设置 req.http.X-Forwarded-For = 客户端.ip;
     }
     如果 (req.请求 != "GET" &&
       req.请求 != "HEAD" &&
       req.请求 != "PUT" &&
       req.请求 != "POST" &&
       req.请求 != "跟踪" &&
       req.请求 != “选项” &&
       req.请求 != "删除") {
         /* 非 RFC2616 或 CONNECT,这很奇怪。 */
         返回(管道);
     }
     如果 (req.request != "GET" && req.request != "HEAD") {
         /* 我们默认只处理 GET 和 HEAD */
         返回(通过);
     }
     如果(req.http.Authorization || req.http.Cookie){
         /* 默认情况下不可缓存 */
         返回(通过);
     }

     如果 (!req.http.host == "editors.site.com") {
             返回(查找);
     }
    返回(通过);
 }

相关内容