使用 Varnish 缓存和代理传递时,保留客户端请求传递给远程后端的主机名

使用 Varnish 缓存和代理传递时,保留客户端请求传递给远程后端的主机名

我在配置 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,那么只需将行为中的标头列入白名单即可。它将进一步转发主机标头

像这样

相关内容