Paw*_*ski 5 http varnish varnish-vcl
这对我来说是一个完美的解决方案,因为我需要将一些生成的内容提供给Web浏览器.我的计划是按需生成内容并将其存储下次.我不希望浏览器每次都调用我的服务(生成内容).我希望他们直接转到"缓存"资源(如果可用),只有在没有的情况下才调用该服务.所以我把Varinsh放在运行服务的服务器A和存储先前生成的内容版本的服务器B的前面.如果它获得了资源的请求,它没有被缓存,它将尝试服务器B.获得404响应后,它将从服务器A请求相同的资源.
可以使用VCL以这种方式配置Varnish吗?如果没有,你知道的解决方案是什么?
PS我不想向浏览器发送302重定向加上我无法控制服务器B使其发送此类重定向而不是404的
这在Varnish完全有可能.确保在vcl_fetch(可能在vcl_error中)检查返回状态代码(例如检查状态> 400),如果失败则重新启动,如果req.restarts> 0,则在vcl_recv中选择另一个后端.例如:
backend serverA {
.host="192.168.0.1";
.port = "80";
}
backend serverB {
.host = "192.168.0.2";
.port = "80";
}
sub vcl_recv {
if (req.restarts == 0) {
set req.backend = serverB;
} else {
set req.backend = serverA;
}
}
sub vcl_fetch {
if (obj.status >= 400 && req.restarts == 0) {
restart;
}
}
sub vcl_error {
if (req.restarts == 0) {
restart;
}
}
Run Code Online (Sandbox Code Playgroud)
但话虽这么说,听起来你正在重塑缓存服务器的概念.而Varnish是很棒的缓存服务器.为什么不拥有一个后端服务器(serverA)并让Varnish缓存生成的实体?您可以设置复杂的规则,您将免费获得(缓存),清除管理和性能的到期!:)