我希望我的 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"
- 遗漏的主要 URL 是... /health.html。该转发到后端的配置是否正确?
- 禁用健康检查命中率增加到 0.45。现在大部分“/crossdomain.xml”都丢失了(来自许多域,因为它是通配符)。我该如何避免这种情况?
- 我是否应该继续使用其他标头,例如 User-Agent 或 Accept-Encoding?我认为默认哈希机制使用 url + host/IP。后端使用压缩。
- 还有什么可以提高性能?
答案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 将无助于缓解问题。