清漆 host_header 未发送到后端

Varnish host_header is not sended to backends

我正在尝试 运行 使用两个需要主机名的后端进行修饰。但是我的 nginx 正在接收 localhost 主机 header.

这是我的配置:

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, like Gecko) Chrome/59.0.3071.104 Safari/537.36" <-> localhost 172.17.0.1, 172.17.0.3

似乎为后端设置 host_header 参数对常规请求不起作用。但是健康检查运行良好。

Varnish 是一个透明的 HTTP 代理。它会将客户端(您的浏览器)发送给它的任何 Host header 转发给后端。因此,如果您通过 http://localhost/ 访问它,那么 localhost 就是您的后端将在 Host header.

中看到的内容

此外,您绝不能在 Varnish 后端定义中使用 DNS 名称。它应该看起来像这样:

backend bimer1 {
    .host = "1.2.3.4";
    # ... etc.

目前您配置的后端解析为同一台机器nginx-proxy。 access.log 的结果也不是来自健康检查。 (您配置的健康检查将显示为对 root 的访问 URL / )

也许你误解了 Varnish 配置。如果您的计划是通过同一台机器为多个网站提供服务,那么您应该只使用一个后端。多个后端用于多台机器。

Danila 的回答是正确的,但是他并没有真正告诉你如何解决原始问题,即如何让 Varnish 使用host_header 常规(非探测)请求中的值

解决方案是使用 unset删除主机 header。但是,内置 vcl_recv(附加到您自己的 vcl_recv)会执行健全性检查,确保已设置此 header,如果 returns 出现 400 错误不是。 所以我所做的就是在 vcl_backend_fetch 中删除这个 header:

sub vcl_backend_fetch {
    unset bereq.http.host;
}