【问题标题】:Serving multiple sites from varnish从清漆服务多个站点
【发布时间】:2016-09-21 13:09:39
【问题描述】:

我有几个网站要使用同一个 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”。

据我了解,哈希上方的代码应包含主机部分,这不应该发生。我是否遗漏了什么,或者有一些关于如何处理多个网站的建议?

谢谢, 阿尔伯特

【问题讨论】:

    标签: caching reverse-proxy varnish varnish-vcl


    【解决方案1】:

    我认为您已经部分复制了默认 vcl,但您忘记了 return (lookup);,因此在执行您的代码后,varnish 会执行默认代码,这可能会导致 varnish 行为异常。

    Varnish vcl_hash documentaion

    【讨论】:

    • 在您提供的链接中,它说“小心调用 return(查找),因为这将中止默认 VCL 的执行,并且 Varnish 最终可能会根据或多或少的随机输入返回数据。”看来我不应该叫“返回(查找)”,对吧?
    • 视情况而定,我经常编写整个 vcl_hash(如果需要,包括默认代码)并调用 return (lookup); 来确定我的方法在做什么
    • @Albert 我认为你应该在 vcl_hash 中记录 req.http_host,也许问题就在那里
    • 我确实记录了 req.http.host 并且一切看起来都不错...仍然找不到合乎逻辑的答案。
    • 我的印象是“重定向”没有被缓存......但是似乎重定向被缓存了,正在发生的事情是来自桌面版本的重定向响应被缓存并且下一个客户端被提供缓存页面,因此它将他重定向到移动版本...我将重定向逻辑移至客户端,一切似乎都有效
    【解决方案2】:

    您的 varnish 实例是否隐藏在任何其他反向代理、负载平衡器、https 卸载程序等之后?

    任何前端都可能破坏 Host 标头,因此此代码既不会执行第一个条件也不会执行第二个条件:

    # 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 可以不确定地选择后端。 对我来说,在各种重启和重新加载后,至少默认后端有所不同。

    试着检查一下这条路径,也许有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-11
        • 2017-04-05
        • 1970-01-01
        • 2021-07-14
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多