Varnish提供错误的文件

时间:2016-05-15 07:40:08

标签: varnish varnish-vcl

我正在使用nging背后的清漆3将多个网站代理到一个域中。 基本设置工作正常但我现在有一个问题,如果文件名已存在于其缓存中,清漆提供错误的文件。 基本上我在default.vcl中所做的就是:

   if(req.url ~ "^/foo1") {
        set req.backend = foo1;
        set req.url = regsub(req.url, "^/foo1/", "/");
    }
    else if(req.url ~ "^/foo2") {
        set req.backend = foo2;
        set req.url = regsub(req.url, "^/foo2/", "/");
    }

如果我现在调用/foo1/index.html,/foo2/index.html将提供相同的文件。在重新启动清漆并调用/foo2/index.html后,/ foo1 / index.html将为foo2的index.html提供服务。

据我所知,这是一个创建哈希的问题,它不尊重使用的后端,只有网址(缩短后)和域名:

    11 VCL_call     c hash
    11 Hash         c /index.html
    11 Hash         c mydomain

我现在通过改变我的vcl_hash来解决这个问题也使用了后端,但我确信必须有更好,更方便的方法:

    sub vcl_hash {
      hash_data(req.url);
      hash_data(req.backend);
    }

任何提示都将不胜感激,非常感谢!

1 个答案:

答案 0 :(得分:1)

你有两种不同的方法。第一个是通过在req.backend中添加额外值(例如vcl_hash)来执行您的建议。

sub vcl_hash {
   hash_data(req.url);
   hash_data(req.backend);
}

第二种方式,是不更新req中的vcl_recv,而只更新bereq中的vcl_miss/pass

sub vcl_urlrewrite {
    if(req.url ~ "^/foo1") {
        set bereq.url = regsub(req.url, "^/foo1/", "/");
    }
    else if(req.url ~ "^/foo2") {
        set bereq.url = regsub(req.url, "^/foo2/", "/");
    }
}
sub vcl_miss {
    call vcl_urlrewrite;
}
sub vcl_pass {
    call vcl_urlrewrite;
}
sub vcl_pipe {
    call vcl_urlrewrite;
}

第二种方法需要更多的VCL,但它也有优势。例如,在使用varnishlog分析日志时,您可以看到vanilla请求(c列)以及更新的后端请求(b列)。

$ varnishlog /any-options-here/
(..)
   xx RxURL        c /foo1/index.html
(..)
   xx TxURL        c /index.html
(..)
$