我一直在试图像疯了一样找出VCL如何做到这一点,我开始认为这是不可能的。我有几个后端应用服务器,服务于各种不同的主机。我需要清漆来缓存任何主机的页面,并使用请求中的原始主机信息(“www.site.com”)将错过缓存的请求发送到应用服务器。但是,所有VCL示例似乎都要求我为后端服务器使用特定的主机名(例如“backend1”)。有没有办法解决?我只想将缓存未命中指向IP并保持请求主机完好无损。
这就是我现在所拥有的:
backend app1 {
.host = "192.168.1.11";
.probe = {
.url = "/heartbeat";
.interval = 5s;
.timeout = 1 s;
.window = 5;
.threshold = 3;
}
}
backend app2 {
.host = "192.168.1.12";
.probe = {
.url = "/heartbeat";
.interval = 5s;
.timeout = 1 s;
.window = 5;
.threshold = 3;
}
}
director pwms_t247 round-robin {
{
.backend = app1;
}
{
.backend = app2;
}
}
sub vcl_recv {
# pass on any requests that varnish should not handle
if (req.request != "HEAD" && req.request != "GET" && req.request != "BAN") {
return (pass);
}
# pass requests to the backend if they have a no-cache header or cookie
if (req.http.x-varnish-no-cache == "true" || (req.http.cookie && req.http.cookie ~ "x-varnish-no-cache=true")) {
return (pass);
}
# Lookup requests that we know should be cached
if (req.url ~ ".*") {
# Clear cookie and authorization headers, set grace time, lookup in the cache
unset req.http.Cookie;
unset req.http.Authorization;
return(lookup);
}
}
等...
这是我的第一个StackOverflow问题,如果我忽略了重要的事情,请告诉我!感谢。
答案 0 :(得分:3)
这是我实际工作的内容。我相信常春藤,因为他的回答在技术上是正确的,因为其中一个问题是我的主机(他们阻止端口阻止我的正常网络请求通过)。我遇到的真正问题是心跳消息没有主机信息,因此vhost无法正确路由它们。这是一个示例后端定义,其中包含一个完全自定义请求的探针:
backend app1 {
.host = "192.168.1.11";
.port = "80";
.probe = {
.request = "GET /heartbeat HTTP/1.1"
"Host: something.com"
"Connection: close"
"Accept-Encoding: text/html" ;
.interval = 15s;
.timeout = 2s;
.window = 5;
.threshold = 3;
}
}
答案 1 :(得分:0)
我需要清漆来缓存任何主机的页面并发送错过的请求 具有原始主机信息的应用服务器的缓存 请求(“www.site.com”)。但是,所有VCL示例似乎都需要 我为我的后端服务器使用特定的主机名(例如“backend1”)
backend1 不是主机名,它是带有ip-address的后端定义。您在vcl文件中定义了一些路由逻辑(代理请求的后端),但您没有更改请求中的主机名。您要求的(保持主机名相同)是默认行为。