【问题标题】:Infinite redirection loop in varnish cache清漆缓存中的无限重定向循环
【发布时间】:2012-06-06 13:58:18
【问题描述】:

我们最近将 Varnish 放在了 Drupal 前面,因为服务器负载很重,总的来说我们很高兴。

剩下的唯一问题是我们有时在缓存数据中存在无限重定向循环。我们通过 HTTP 监控发现了这一点。我们每分钟检查一次首页。缓存中的页面有时包含完整的首页,但设置了 Location 标头,这会将用户再次发送到首页。

我们不太确定是什么原因造成的,但也不知道如何追踪它。当然,处理这种情况的最佳方法是在 drupal 方面,但我们无法真正说出为什么会发生这种情况。

有没有办法记录发生这种情况的案例?或者是否可以在 varnish 中检测到这一点并将当前缓存内容标记为无效?

当然,我们不希望总是将有意的重定向传递给源服务器,而是那些会导致无限循环的重定向。

我希望听到一些想法,我们可以如何进一步追踪这一点。非常感谢各种提示。

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

    我找到了解决方法:

    sub vcl_fetch {
      // Fix a strange problem: HTTP 301 redirects to the same page sometimes go in$
      if (beresp.http.Location == "http://" + req.http.host + req.url) {
        if (req.restarts > 2) {
          unset beresp.http.Location;
          #set beresp.http.X-Restarts = req.restarts;
        } else {
          return (restart);
        }
      }
    }
    

    我给后端第二次(也是第三次)机会返回正确的页面。如果同样失败,则 Location 标头将被删除。这是可行的,因为正确的页面只提供了一个额外的无效 Location 标头。

    【讨论】:

    • 这需要在什么文件中更改?为了澄清起见。谢谢,从长远来看这是如何解决的?
    • beresp?那代表什么
    • beresp 是后端响应。您需要将其添加到您的 vcl 文件中的某处(即 default.vcl)。由于这是一个非常基本的问题,因此您应该确保在生产中使用 Varnish 之前阅读一些有关 Varnish 的文档,因为它是一个很棒的工具,但正确设置可能很复杂
    • "来自 VCC 编译器的消息:默认值:名为 'vcl*' 的 VCL 子程序是保留名称。默认值:('/etc/varnish/default.vcl' 第 39 行第 5 行)默认值:sub vcl_fetch {"
    • 这在 Varnish 4 上不起作用——请参阅下面的答案以获取更新
    【解决方案2】:

    @philip 接受的答案已针对 Varnish 4 更新:

    sub vcl_backend_response {
    
    #Fix a strange problem: HTTP 301 redirects to the same page sometimes go in$
    if (beresp.http.Location == "http://" + bereq.http.host + bereq.url) {
        if (bereq.retries > 2) {
          unset beresp.http.Location;
          #set beresp.http.X-Restarts = bereq.retries;
        } else {
          return (retry);
        }
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2018-01-26
      • 2013-03-13
      • 2014-01-09
      • 1970-01-01
      • 2012-04-03
      • 2017-02-22
      • 2015-02-16
      相关资源
      最近更新 更多