Varnish

Varnish:記憶體和非記憶體子域

  • September 8, 2016

我們擁有通過 Varnish 前端記憶體的 Plone 站點。我們想為此站點提供兩個不同的子域 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 來配置 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);
}

只是掖回(通過);在編輯器部分,所有 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);
       }
}

引用自:https://serverfault.com/questions/297541