如果Varnish从主服务器获得404,可以配置为某些资源尝试第二个服务器吗?

StackOverflow https://stackoverflow.com/questions/4327874

  •  29-09-2019
  •  | 
  •  

这对我来说将是一个完美的解决方案,因为我需要为Web浏览器提供一些生成的内容。我的计划是按需生成内容并下次存储。我不希望浏览器每次都调用我的服务(生成内容)。我希望他们在可用的情况下直接进入“缓存”资源,仅在没有的情况下才致电该服务。因此,我将Varinsh放在服务器A的前面,该服务器A运行服务和服务器B,该服务器存储先前生成的内容版本。如果它收到资源的请求,它尚未被缓存,它将尝试使用服务器B。在获得404响应后,它将从服务器A请求相同的资源。

可以使用VCL以这种方式配置清漆?如果没有,您知道这样的解决方案吗?

ps我不想将302个重定向发送到浏览器加上我对服务器B的控制权,以使其发送此类重定向,而不是404

有帮助吗?

解决方案

这在清漆中是完全可能的。确保在vcl_fetch(可能在vcl_error中)您检查返回状态代码(例如检查状态> 400),如果失败,请重新启动,然后在VCL_RECV中选择另一个后端,如果req.restarts> 0。

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;
   }
}

但是话虽如此,听起来您正在重新发明高速缓存服务器的概念。 Varnish是出色的高速缓存服务器。为什么不拥有一台后端服务器(Servera)并具有清漆您生成的实体?您可以免费设置复杂的规则,并且可以免费获得(缓存),清除管理和绩效! :)

其他提示

在此示例中,Varnish尝试在6个服务器中找到,如果找不到的话,请显示最后一个味精。

# cat /etc/varnish/default.vcl 
backend serverA {
   .host="10.42.4.104";
   .port = "80";
}

backend serverB {
   .host = "10.42.4.102";
   .port = "80";
}

backend serverC {
   .host = "10.42.4.103";
   .port = "80";
}

backend serverD {
   .host = "10.42.4.101";
   .port = "80";
}

backend serverE {
   .host = "10.42.4.105";
   .port = "80";
}

backend serverF {
   .host = "10.42.4.106";
   .port = "80";
}




sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverA;
   } elseif (req.restarts == 1){
       set req.backend = serverB;
   } elseif (req.restarts == 2){
       set req.backend = serverC;
   } elseif (req.restarts == 3){
       set req.backend = serverD;
   } elseif (req.restarts == 4){
       set req.backend = serverE;
   } else {
       set req.backend = serverF;
   }
}


sub vcl_fetch {
    if (beresp.status >= 400 && req.restarts == 0) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 1) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 2) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 3) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 4) {
        return(restart);
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       return(restart);
   }
   if (req.restarts == 1) {
       return(restart);
   }
   if (req.restarts == 2) {
       return(restart);
   }
   if (req.restarts == 3) {
       return(restart);
   }
   if (req.restarts == 4) {
       return(restart);
   }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top