Varnish host_header不会发送到后端

时间:2017-06-21 13:45:03

标签: varnish varnish-4

我尝试使用两个需要正确主机名的后端来运行清漆。但我的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参数不适用于常规请求。但健康检查运作良好。

2 个答案:

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