从清漆服务多个站点

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 vcl_hash documentaion

您的 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" 没有被缓存...但是似乎重定向被缓存了,发生的事情是来自桌面版本的重定向响应被缓存,下一个客户端被缓存页面,以便将他重定向到移动版本...我将重定向逻辑移到了客户端,一切似乎都有效