Varnish 5如何处理HTTP/2 Server Push?资源取缓存还是转发至Apache?
关于Varnish 5中HTTP/2 Server Push的资源获取逻辑及性能影响
针对你在HAProxy → Varnish → Apache架构下探索HTTP/2 Server Push优化的疑问,我来拆解下Varnish 5的实际处理逻辑,以及对应的性能影响:
Varnish 5对Server Push头的核心处理逻辑
首先明确:Varnish 5本身不原生支持解析或触发HTTP/2 Server Push。它不会识别响应中的Link: rel=preload这类Push相关的头,也不会主动发起资源推送动作——只会把后端Apache返回的包含Push头的响应原封不动地透传给客户端(经过HAProxy中转)。
推送资源的实际获取路径
当客户端浏览器收到透传的Link头后,会触发对指定资源的请求(因为Varnish不主动推送,所以还是走常规请求流程),这时候资源的获取遵循Varnish标准缓存规则:
- 如果目标资源已经在Varnish缓存中,Varnish会直接从缓存返回资源,完全不会转发请求到Apache;
- 如果资源不在缓存中,Varnish会把请求转发给Apache获取,同时将资源缓存起来,供后续请求复用。
不处理Push头对性能的影响
你担心的“拖慢页面加载”其实分两种情况:
- 如果需要Push的资源已经在Varnish缓存里:客户端触发请求后能快速拿到资源,虽然没享受到Push减少RTT(往返时间)的最大优势,但性能不会比没有Push时差;
- 如果资源不在缓存:客户端还是要等Varnish去Apache拉取资源,这时候Push头的存在只是让客户端更早发起请求,和主页面请求并行处理,不会明显拖慢,但也没真正发挥Push的性能提升作用——毕竟原本Push的核心是在返回主页面的同时把资源推给客户端,避免额外的请求往返。
优化建议
如果想充分利用HTTP/2 Server Push的优势,有两个方向可以考虑:
- 升级Varnish版本:Varnish 6.0及以上版本原生支持HTTP/2 Server Push的处理,可以通过VCL配置来解析
Link头并主动触发推送,同时结合缓存逻辑,让推送的资源直接从缓存获取; - 调整架构权衡:如果暂时无法升级Varnish,可以考虑让Apache直接处理HTTP/2请求并发起Push,但这样会绕开Varnish的缓存优势,需要评估缓存收益和Push收益的平衡点。
内容的提问来源于stack exchange,提问作者Birb
相关产品推荐
相关产品推荐

