我正在使用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);
}
任何提示都将不胜感激,非常感谢!
答案 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
(..)
$