在 Varnish 中缓存所有文件

在 Varnish 中缓存所有文件

我希望我的 varnish 服务器缓存所有文件。后端有 lighttpd 仅托管静态文件,还有一个md5在文件更改的情况下,例如/gfx/Bird.b6e0bc2d6cbb7dfe1a52bc45dd2b05c4.swf。但我的命中率很低(大约 0.18)

我的配置:

sub vcl_recv {
    set req.backend=default;

    ### passing health to backend
    if (req.url ~ "^/health.html$") {
        return (pass);
    }

    remove req.http.If-None-Match;
    remove req.http.cookie;
    remove req.http.authenticate;

    if (req.request == "GET") {
        return (lookup);
    }
}

sub vcl_fetch {
    ### do not cache wrong codes
    if (beresp.status == 404 || beresp.status >= 500) {
        set beresp.ttl = 0s;
    }
    remove beresp.http.Etag;
    remove beresp.http.Last-Modified;
}

sub vcl_deliver {
    set resp.http.expires = "Thu, 31 Dec 2037 23:55:55 GMT";
}

我做了一个性能调整:

DAEMON_OPTS="${DAEMON_OPTS} -p thread_pool_min=200 -p thread_pool_max=4000 -p thread_pool_add_delay=2 -p session_linger=100"
  1. 遗漏的主要 URL 是... /health.html。该转发到后端的配置是否正确?
  2. 禁用健康检查命中率增加到 0.45。现在大部分“/crossdomain.xml”都丢失了(来自许多域,因为它是通配符)。我该如何避免这种情况?
  3. 我是否应该继续使用其他标头,例如 User-Agent 或 Accept-Encoding?我认为默认哈希机制使用 url + host/IP。后端使用压缩。
  4. 还有什么可以提高性能?

答案1

需要更多信息才能确定(lighty 响应标头),但我假设您的后端没有设置 Expires 或 Cache-control 标头。

这是必需的,以便 Varnish 知道将数据存储在缓存中多长时间,或者您也可以通过 在 DAEMON_OPTS 中指定默认 ttl -t default_ttl_in_seconds

或者实际上在 VCL 本身内,正如这里所回答的:Varnish Cache-默认 TTL?

然而:这再次假设您的后端轻量级服务器过去没有返回过期时间,并且没有返回阻止缓存的 Cache-control 标头(即 no-cache,must-revalidate iirc),如果是这种情况,设置默认 ttl 将无助于缓解问题。

相关内容