gpt4 book ai didi

Varnish 提供错误的文件

转载 作者:行者123 更新时间:2023-12-03 17:46:26 25 4
gpt4 key购买 nike

我在nging后面使用 Varnish 3将多个站点代理到一个域中。
基本设置可以正常工作,但是如果文件名已存在于缓存中,则我现在无法使用 Varnish 处理错误的文件。
基本上我在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将提供相同的文件。重新启动 Varnish 并调用/foo2/index.html之后,/foo1/index.html将提供foo2的index.html。

据我发现,这是散列创建的问题,该散列不尊重使用的后端,而仅尊重url(缩短后)和域:
    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);
}

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

最佳答案

您有两种不同的方法来执行此操作。第一个是通过在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分析日志时,您可以看到原始请求( c列)以及更新的后端请求( b列)。
$ varnishlog /any-options-here/
(..)
xx RxURL c /foo1/index.html
(..)
xx TxURL c /index.html
(..)
$

关于 Varnish 提供错误的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com