与Varnish返回错误的后端有问题。 我有几个后端在Apache的虚拟主机上监听端口8080到8095。 我configuration了我的Varnish后端,如下所示:
acl purge { "localhost"; "192.168.0.1"; } backend default { .host = "192.168.0.1"; .port = "8094"; .connect_timeout = 20s; #600s; .first_byte_timeout = 20s; #600s; .between_bytes_timeout = 20s; #600s; } backend default_mobile { .host = "192.168.0.1"; .port = "8093"; .connect_timeout = 20s; #600s; .first_byte_timeout = 20s; #600s; .between_bytes_timeout = 20s; #600s; } backend secondary { .host = "192.168.0.1"; .port = "8082"; .connect_timeout = 20s; #600s; .first_byte_timeout = 20s; #600s; .between_bytes_timeout = 20s; #600s; } backend secondary_mobile { .host = "192.168.0.1"; .port = "8083"; .connect_timeout = 20s; #600s; .first_byte_timeout = 20s; #600s; .between_bytes_timeout = 20s; #600s; }
这在大多数情况下都能正常工作,但经过一段时间(几个小时)之后,我们会收到用户在错误的URL下看到错误网站的报告。 例如,他们将访问www.example.com并从secondary_mobile后端获取一个页面。 它始终是不正确返回的相同后端,并且浏览器中的URL将显示目标网站(www.example.com)。 我们在Apache中没有任何redirect,所以我不确定它是如何变得困惑的。 以下是我如何设置后端的示例:
.... if ( req.http.host ~ "example.com$" ) { set req.backend = default; set req.http.host = "www.example.com"; } else if ( req.http.host ~ "^(www.)?example2.com$" ) { set req.backend = secondary; set req.http.host = "www.example2.com"; } else if ( req.http.host ~ "^(m.)?example2.com$" ) { set req.backend = secondary_mobile; set req.http.host = "m.example2.com"; ....
我认为手动指定主机是足够的,但显然不是。 清漆文件也没有太多关于这个问题。