1

我试图用两个需要完全主机名的后端来运行清漆。但是我的 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, like Gecko) Chrome/59.0.3071.104 Safari/537.36" <-> localhost 172.17.0.1, 172.17.0.3

看起来将 host_header 参数设置为后端不适用于常规请求。但是健康检查运行良好。

4

2 回答 2

0

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

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

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

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

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

于 2017-06-21T14:18:24.653 回答
0

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

解决方案是使用 unset 删除主机头。但是,内置的 vcl_recv(附加到您自己的 vcl_recv)执行完整性检查,确保设置了此标头,如果没有设置,则返回 400 错误。所以我所做的是在 vcl_backend_fetch 中删除此标头

sub vcl_backend_fetch {
    unset bereq.http.host;
}
于 2020-03-17T18:27:23.217 回答