如何在多层Varnish缓存服务器中合并X-Cache响应头
多层Varnish缓存合并X-Cache响应头实现方案
要实现第二层缓存服务器合并第一层的X-Cache头信息,只需通过两个VCL阶段的配合即可完成:捕获父层缓存的响应头、拼接当前层的缓存状态。
1. 捕获第一层缓存的X-Cache值
在第二层Varnish的vcl_backend_response阶段(处理后端即第一层缓存返回的响应),将第一层返回的X-Cache值保存到自定义响应头中,避免后续被覆盖:
sub vcl_backend_response { # 保存第一层缓存的X-Cache值到自定义头X-Cache-Parent set beresp.http.X-Cache-Parent = beresp.http.X-Cache; }
2. 拼接当前层与父层的缓存状态
在第二层Varnish的vcl_deliver阶段,判断当前层的缓存命中状态,再与之前保存的父层缓存状态拼接,最终设置到X-Cache头中。同时可选择删除自定义的X-Cache-Parent头,避免返回给客户端:
sub vcl_deliver { # 处理父层缓存头不存在的情况,默认显示ORIGIN表示直达源站 declare local var.parent_cache_status STRING; set var.parent_cache_status = resp.http.X-Cache-Parent ?: "ORIGIN"; if (obj.hits > 0) { set resp.http.X-Cache = "HIT, " + var.parent_cache_status; } else { set resp.http.X-Cache = "MISS, " + var.parent_cache_status; } # 可选:移除自定义头,不暴露给客户端 unset resp.http.X-Cache-Parent; }
扩展说明
如果后续需要扩展到三层及以上缓存,只需在每一层缓存服务器中复用相同逻辑:
- 每层在
vcl_backend_response中保存上一层的X-Cache值到X-Cache-Parent - 在
vcl_deliver中拼接当前层状态与父层状态
最终客户端收到的X-Cache头会呈现类似HIT, HIT, MISS的格式,从左到右依次是最外层到最内层的缓存命中状态。
内容的提问来源于stack exchange,提问作者user19102264
相关产品推荐
相关产品推荐

