根据服务器请求重写来清除负载平衡

我试图使用Varnish来平衡第三方Web应用程序,而这个第三方应用程序需要“真正”的服务器名称(它似乎是通过后台连接到这个服务器的名字(而localhost不起作用) :()在查询string传递,我也需要故障转移,这意味着我想使用董事,所以我的configuration可以是简单的,将扩展。

以下是我想要做的一个基本示例:

sub vcl_pass { set bereq.http.X-Varnish-Backend = bereq.backend.name } 

但是,我们已经提出请求后,backend.name只能在beresp中使用。 看起来Varnish并没有决定 vcl_pass结束之前使用哪个后端,而且在请求被发送到后端之前没有其他的钩子。

它是否正确? 如果是这样,是否有另一种解决scheme(除了固定在Web服务器,我不控制)? 没有循环,即使我在VCL中实现了一个replace的客户端主pipe,它也不会扩展到几台服务器之外。

首先,你必须制定一个战略来区分使用的应用程序。 您可以使用不同的主机名(全部指向您的Varnish代理服务器),也可以使用不同的URL来决定哪个请求应由哪个后端系统处理。 如果你有你的策略,设置你的清漆:

示例A)不同的主机名称

准备好所有需要的后端。 它可以是一台服务器或多台服务器通过使用导演:

 backend example1 { .host = "..."; .port = "..."; ... } 

为传入请求设置正确的后端(在Varnish:req中)。 我设置了一个额外的值req.http.backend,在稍后的步骤中使用它。 在这里,您可以replace或取消设置客户端请求的任何HTTP标头:

 sub vcl_recv { ... if (req.http.host == "example1.mysite.com") { set req.backend = example1; set req.http.backend = "example1"; set req.http.host = "application1.internal.mysite.com"; unset req.http.Cache-Control; ... } ... } 

使用返回的后端响应进行一些修改(在Varnish:beresp中)。 如果您的应用程序有不同的主机名,则可能需要更改redirect。 通常我删除一些X-header或者replace后端的caching头:

 sub vcl_fetch { ... if (req.http.backend == "example1") { ... unset beresp.http.X-Powered-By; ... if ((beresp.status == 301 || beresp.status == 302) && beresp.http.Location ~ "^http://application1\.internal\.mysite\.com") { set beresp.http.Location = regsub(beresp.http.Location, "^http://[^/]+", "http://example1.mysite.com"); } } ... } 

例子B)不同的URL

在varnish中,区别在于方法vcl_recv。 请注意,您的应用程序可以使用path名“/ example1”。 其他解决scheme是可能的,但我不会推荐它:

 sub vcl_recv { ... if (req.http.host == "www.mysite.com") { if (req.url ~ "(?i)^/example1/") { set req.backend = example1; set req.http.backend = "example1"; set req.http.host = "application1.internal.mysite.com"; unset req.http.Cache-Control; ... } ... } ... } 

你可以实现A或B或A和B(或多或less)。