我在配置 Varnish 时遇到了一些麻烦,而且在线文档不太清楚(至少对我来说)。我目前在 Ubuntu 服务器上设置了 Varnish 缓存。我在同一台服务器上使用本地 Nginx 测试了 Varnish,它运行良好。我想要做的是将 Varnish 用作配置了 Nginx 的远程 Web 服务器的缓存和反向代理。我需要保留客户端请求的主机名并将其传递给远程 Nginx Web 服务器。这可以在 Nginx 中使用 proxy_set_header Host 完成,在 Apache 中可以使用 ProxyPreserveHost On 完成。问题是我的远程 Nginx 上有许多不同的虚拟主机,而服务器的 DNS 没有配置任何虚拟主机。它们都是不同的,所以我需要确保从客户端请求的主机已通过。如果这不清楚,我很抱歉,但我对 Varnish 很陌生,它与我习惯的 Apache 或 Nginx 完全不同。任何帮助都将不胜感激。
这是我的default.vcl:
vcl 4.0;
# Default backend definition. Set this to point to your content
server.
backend default {
.host = "dns.of.remote.nginx.server";
.port = "80";
.probe = {
.url = "/";
.timeout = 30s;
.threshold = 8;
}
}
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you
don't need,
# rewriting the request, etc.
unset req.http.Cookie;
set req.http.x-host = req.http.host;
set req.http.x-url = req.url;
set req.url = req.url;
}
sub vcl_backend_response {
# Happens after we have read the response headers from the
backend.
#
# Here you clean the response headers, removing silly Set-Cookie
headers
# and other mistakes your backend does.
}
sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to
send the
# response to the client.
#
# You can do accounting or modifying the final object here.
}
答案1
首先,您通常不应该在 Varnish 后端定义中指定 DNS 主机名。它仅在启动期间解析,并且永远不会更新。请改为指定删除 Nginx 服务器的 IP。
其次,您问的已经是 Varnish 的默认行为。它是一个透明的缓存 HTTP 代理,因此它将传递Host
客户端通过 HTTP 发送的任何标头。
答案2
如果你在服务器前使用 cloudfront,那么只需将行为中的标头列入白名单即可。它将进一步转发主机标头