从清漆服务多个站点
Serving multiple sites from varnish
我有几个站点要使用相同的 varnish 实例进行缓存。
我确实使用类似以下内容设置了后端:
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
哈希方法如下所示:
sub vcl_hash {
# Called after vcl_recv to create a hash value for the request. This is used as a key
# to look up the object in Varnish.
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
# hash cookies for requests that have them
if (req.http.Cookie) {
hash_data(req.http.Cookie);
}
}
但是,我注意到移动版本的页面在桌面上提供,反之亦然。这发生在具有相同名称的页面上,例如 "Default.aspx".
据我了解,散列上方的代码应该包括主机部分,这不应该发生。我是否遗漏了什么,或者是否有一些关于如何处理多个站点的建议?
谢谢,
艾伯特
我认为您已经部分复制了默认的 vcl,但您忘记了 return (lookup);
,因此在执行您的代码后,varnish 会执行默认代码,这可能会导致 varnish 出现异常。
您的 varnish 实例是否隐藏在任何其他反向代理、负载均衡器、https 卸载程序等之后?
任何前层都可能破坏主机 header 因此此代码既不会执行第一个条件也不会执行第二个条件:
# unset req.http.host or set req.http.host = "my.varnish.backend";
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
所以req.backend_hint会不会生效并且清漆可以选择后端 non-deterministically。
至少在我重新启动和重新加载后默认后端是不同的。
试试看这个路径,也许有帮助。
我的印象是 "redirects" 没有被缓存...但是似乎重定向被缓存了,发生的事情是来自桌面版本的重定向响应被缓存,下一个客户端被缓存页面,以便将他重定向到移动版本...我将重定向逻辑移到了客户端,一切似乎都有效
我有几个站点要使用相同的 varnish 实例进行缓存。
我确实使用类似以下内容设置了后端:
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
哈希方法如下所示:
sub vcl_hash {
# Called after vcl_recv to create a hash value for the request. This is used as a key
# to look up the object in Varnish.
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
# hash cookies for requests that have them
if (req.http.Cookie) {
hash_data(req.http.Cookie);
}
}
但是,我注意到移动版本的页面在桌面上提供,反之亦然。这发生在具有相同名称的页面上,例如 "Default.aspx".
据我了解,散列上方的代码应该包括主机部分,这不应该发生。我是否遗漏了什么,或者是否有一些关于如何处理多个站点的建议?
谢谢, 艾伯特
我认为您已经部分复制了默认的 vcl,但您忘记了 return (lookup);
,因此在执行您的代码后,varnish 会执行默认代码,这可能会导致 varnish 出现异常。
您的 varnish 实例是否隐藏在任何其他反向代理、负载均衡器、https 卸载程序等之后?
任何前层都可能破坏主机 header 因此此代码既不会执行第一个条件也不会执行第二个条件:
# unset req.http.host or set req.http.host = "my.varnish.backend";
if (req.http.host == "time.ikub.al") {
# Process through time backend
set req.backend_hint = timeserver;
}
if (req.http.host == "m.time.ikub.al") {
# Process through time mobile backend
set req.backend_hint = timemobileserver;
}
所以req.backend_hint会不会生效并且清漆可以选择后端 non-deterministically。 至少在我重新启动和重新加载后默认后端是不同的。
试试看这个路径,也许有帮助。
我的印象是 "redirects" 没有被缓存...但是似乎重定向被缓存了,发生的事情是来自桌面版本的重定向响应被缓存,下一个客户端被缓存页面,以便将他重定向到移动版本...我将重定向逻辑移到了客户端,一切似乎都有效