我们的 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") { 返回(查找); } 返回(通过); }