我尝试使用两个需要正确主机名的后端来运行清漆。但我的nginx正在接收 localhost 主机头。
这是我的配置:
probe healthcheck {
.url = "/";
.interval = 5s;
.timeout = 15s;
.window = 5;
.threshold = 3;
}
# Define the list of backends (web servers).
# Port 443 Backend Servers for SSL
backend bimer1 {
.host = "nginx-proxy";
.host_header = "site1.example.com.br";
.port = "80";
.probe = healthcheck;
}
backend bimer2 {
.host = "nginx-proxy";
.host_header = "site2.example.com.br";
.port = "80";
.probe = healthcheck;
}
这是我的nginx访问日志:
bimer-cache-nginx-ssl-proxy_1 | 172.17.0.3 - - [21 / Jun / 2017:13:41:47 +0000]“POST /ws/Servicos/Geral/Localizacoes.svc/REST/LocalizarPessoas HTTP / 1.1”502 575“ - ”“Mozilla / 5.0( X11; Linux x86_64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 59.0.3071.104 Safari / 537.36“< - > localhost 172.17.0.1,172.17.0.3
看起来像set back_nd的host_header参数不适用于常规请求。但健康检查运作良好。
答案 0 :(得分:0)
Varnish是一个透明的HTTP代理。无论客户端(您的浏览器)向其发送Host
标头,它都会转发到后端。因此,如果您通过http://localhost/访问了它,那么localhost
就是您的后端将在Host
标题中看到的内容。
此外,您绝不应该在Varnish后端定义中使用DNS名称。它看起来应该是这样的:
backend bimer1 {
.host = "1.2.3.4";
# ... etc.
目前,您配置的后端已解析为相同计算机nginx-proxy。 access.log的结果也不是来自健康检查。 (您配置的运行状况检查将显示为对根URL的访问权限)
也许您误解了Varnish配置。如果您的计划是通过同一台计算机为多个网站提供服务,那么您应该只使用一个后端。多个后端适用于多台机器。
答案 1 :(得分:0)
Danila的答案是正确的,但是,他并没有真正告诉您如何解决原始问题,即如何让Varnish定期使用host_header值(非探测) )请求。
解决方案是使用未设置删除主机头。但是,内置的vcl_recv(附加到您自己的vcl_recv中)执行完整性检查,确保已设置此标头,如果未设置则返回400错误。 所以我要做的是在vcl_backend_fetch中删除此标头:
sub vcl_backend_fetch {
unset bereq.http.host;
}