从清漆中提供多个站点

时间:2016-05-24 10:56:57

标签: caching reverse-proxy varnish varnish-vcl

我想要使用相同的清漆实例缓存几个网站。

我确实使用类似的东西来设置后端:

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”。

据我所知,哈希上面的代码应该包含主机部分,这不应该发生。我错过了什么,或者是否有关于如何处理多个网站的建议?

感谢名单, 阿尔伯特

3 个答案:

答案 0 :(得分:1)

我认为你已经部分复制了默认的vcl,但是你忘记了return (lookup);,所以在执行你的代码之后,varnish会执行默认代码,这可能会导致varnish行为不端。

Varnish vcl_hash documentaion

答案 1 :(得分:0)

您的varnish实例是否隐藏在任何其他反向代理,负载均衡器,https offloader之后?

任何前端都可能会破坏主机头,因此这段代码不会执行第一个或第二个条件:

# 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 生效并且varnish可以非确定地选择后端。 在重新启动和重新加载后,至少默认后端是不同的。

试着检查这条路径,也许会有所帮助。

答案 2 :(得分:0)

我的印象是“重定向”没有被缓存......但似乎重定向被缓存,而且正在发生的事情是来自桌面版本的重定向响应被缓存,下一个客户端被提供缓存页面以便重定向他移动版本...我将重定向逻辑移动到客户端,事情似乎有效