当前位置: 首页 > news >正文

【Varnish】:解决 Varnish 7.6 CDN 静态资源缓存失效问题

项目场景:

在一个使用Varnish作为反向代理的Web应用中,我们依赖CDN(内容分发网络)来缓存静态资源(如图片、CSS、JavaScript文件等),以提高全球用户的访问速度并减轻源站服务器的负载。然而,在实际运行中,我们遇到了一个问题:CDN缓存的静态资源全部一直回源,导致源站服务器负载过高,响应时间延长,用户体验下降。

问题描述:

症状表现

  • 高源站流量: 监控数据显示源站接收到大量本应由CDN处理的请求。
  • 低缓存命中率: CDN平台中显示静态资源的缓存命中率远低于预期。
  • 响应时间延长: 用户体验到比预期更长的页面加载时间。
  • Via 头部异常: 在响应头中发现了额外的 Via 信息,例如 1.1 yjcm-varnish-0 (Varnish/7.6), cache14.l2et135-6[2,0],这可能是导致CDN失效的原因之一。

产生影响

这些症状直接影响了用户体验和网站性能,增加了服务器负载,当时LB带宽几乎要达到上限。随着系统响应时间逐渐变慢,用户体验急剧下降。因此,解决这个问题对于提升网站的整体性能至关重要。

原因分析:

经过详细的日志分析和技术排查,我们确定以下因素可能导致了上述问题:

1. Via 头部的影响:

  • 标准的 Via 响应头用于标识请求经过的代理服务器链。如果Varnish保留或添加了这个头部,某些CDN可能会误判请求路径,进而影响缓存决策。
  • 特别是当 Via 头部包含多个代理服务器的信息时,可能会使CDN认为每个请求都是唯一的,从而阻止了缓存的有效利用。

2. 自定义VCL逻辑:

  • 如果Varnish配置中有特定的逻辑来决定何时缓存内容或如何处理请求,这些逻辑可能会与CDN的预期行为相冲突,导致缓存策略不再适用。

3. Cookie处理:

  • 默认情况下,如果请求包含 Cookie 头部,Varnish通常不会缓存该请求。这可能导致静态资源因为会话信息而被视为独特的,从而绕过了缓存。

4. 缓存控制头部不一致:

  • Varnish可能修改了来自后端服务器或CDN的关键HTTP头部信息(如 Cache-Control, Expires),导致CDN认为这些资源不应该被缓存。

解决方案:

为了解决这些问题,我们采取了一系列措施,确保Varnish与CDN之间顺畅协作,最大化缓存效率并提升整体网站性能。同时,我们也针对系统性能进行了优化,以改善响应时间。

1. 修改 vcl_deliver 子程序

通过调整 vcl_deliver 子程序,可以实现更清晰的缓存状态指示,并避免不必要的头部冲突:

# 交付子程序 (vcl_deliver)
sub vcl_deliver {# 显示缓存命中/未命中信息# 这个逻辑用于在响应头中添加一个自定义的头部 X-Varnish-Cache,# 以便后续可以通过这个头部判断请求是否被缓存命中。if (obj.hits > 0) {set resp.http.X-Varnish-Cache = "hit";  # 如果缓存命中(即该对象已被缓存并再次访问),则设置 X-Varnish-Cache 为 hit} else {set resp.http.X-Varnish-Cache = "miss";  # 如果缓存未命中(即该对象是第一次访问或缓存已过期),则设置 X-Varnish-Cache 为 miss}# 将 Via 头的内容复制到 X-Varnish-Via 头# Via 是一个标准的HTTP头部,用来标识请求经过的代理服务器链。# 为了避免影响CDN对缓存决策的理解,我们将原始的 Via 头内容复制到一个新的头部 X-Varnish-Via,# 并删除原来的 Via 头,确保CDN不会因为额外的代理信息而误判请求路径。if (resp.http.Via) {set resp.http.X-Varnish-Via = resp.http.Via;  # 将原始 Via 头内容复制到新的 X-Varnish-Via 头unset resp.http.Via;  # 删除原来的 Via 头,避免干扰CDN的缓存决策}
}

解释:

  • 显示缓存状态: 通过添加 X-Varnish-Cache 响应头,提供了关于缓存命中的明确指示,这对于调试和理解缓存行为非常有用。
  • 清理 Via 头: Via 头通常用于标识请求经过的代理服务器链。将其内容复制到 X-Varnish-Via 并删除原始 Via 头,可以帮助减少混淆,并确保CDN能够正确解析响应。

2. 同步缓存控制头部

确保Varnish不会覆盖或修改来自后端服务器或CDN的关键缓存控制头部,如 Cache-Control 和 Expires。可以通过以下方式同步这些头部:

sub vcl_backend_response {# 同步 Cache-Control 和 Expires 头部if (beresp.http.Cache-Control && beresp.http.Expires) {set beresp.http.Cache-Control = beresp.http.Cache-Control;set beresp.http.Expires = beresp.http.Expires;}
}

3. 确保缓存一致性

确保Varnish和CDN之间的缓存策略一致,特别是对于静态资源的缓存控制头部:

  • 标准化响应头部: 保持所有响应头部的一致性,有助于维持整个系统的稳定性和性能。
  • 检查缓存标签: 确认Varnish和CDN都支持并正确处理缓存标签(如 ETag, Last-Modified)。

4. 测试与验证

  • 测试清除效果: 在非生产环境中进行更改前,先在一个小范围内测试,确保不会对用户体验产生负面影响。
  • 监控性能变化: 使用性能监控工具来跟踪实施更改后的性能指标,确保问题得到解决且没有引入新的问题。

结论

通过精心调整Varnish配置并遵循最佳实践,我们可以确保Varnish与CDN之间顺畅协作,最大化缓存效率并提升整体网站性能。希望这篇文章能为你和其他开发者提供有价值的参考,帮助解决类似的缓存失效问题。如果有更多复杂的需求或疑问,建议参考官方文档或寻求专业支持。

相关文章:

【Varnish】:解决 Varnish 7.6 CDN 静态资源缓存失效问题

项目场景: 在一个使用Varnish作为反向代理的Web应用中,我们依赖CDN(内容分发网络)来缓存静态资源(如图片、CSS、JavaScript文件等),以提高全球用户的访问速度并减轻源站服务器的负载。然而&…...

【记录】篡改猴插件下载网页m3u8视频

1.打开浏览器【管理扩展】页面(edge://extensions/),打开开发人员模式 2.Edge浏览器添加篡改猴插件 3.下载需要的脚本 可以从篡改猴首页找下载网站 https://www.tampermonkey.net/scripts.php?localezh_CN 4.安装成功重启浏览器&#x…...

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析 目录 PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析1. 引言2. PID控制器的基本概念2.1 PID控制器的定义2.2 PID控制器的核心思想2.3 PID控制器的应用领域 3. PID控…...

【Java设计模式-5】装饰模式:给咖啡加点“佐料”

今天咱们要探索一下Java世界里的装饰模式(Decorator Pattern)。为了让这个过程更加生动易懂,咱们就以大家都熟悉的咖啡饮品来举例吧,想象一下,你就是那个咖啡大师,要给顾客调制出各种独特口味的咖啡哦&…...

C++ using(八股总结)

using作用: 类型别名using声明using指示 类型别名 using 可以用来创建类型别名,替代传统的 typedef。这在定义复杂类型时尤其有用,例如模板类型。 // 使用 typedef 创建类型别名 typedef long long ll;// 使用 using 创建类型别名 using …...

《分布式光纤传感:架设于桥梁监测领域的 “智慧光网” 》

桥梁作为交通基础设施的重要组成部分,其结构健康状况直接关系到交通运输的安全和畅通。随着桥梁建设规模的不断扩大和服役年限的增长,桥梁结构的安全隐患日益凸显,传统的监测方法已难以满足对桥梁结构健康实时、全面、准确监测的需求。分布式…...

C++(5)

1.运算符重载 头文件 #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str;//C风格字符串int size0; public:std::string s_str;//转换构造函数myString(const std::string &a…...

【进程与线程】程序和进程在内存中的表现

在计算机系统中&#xff0c;程序和进程是两个密切相关但又有本质区别的概念&#xff0c;尤其在内存中的表现上有显著不同&#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体&#xff0c;表示一组写好的指令和数据的…...

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…...

语音合成的预训练模型

语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...

Swagger生成Api文档的增强解决方案--knife4j

方法一&#xff1a; 使用步骤 1.导入 knife4j 的maven坐标 在pom.xml中添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</ver…...

Node.js - HTTP

1. HTTP请求 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是客户端和服务器之间通信的基础协议。HTTP 请求是由客户端&#xff08;通常是浏览器、手机应用或其他网络工具&#xff09;发送给服务器的消息&#xff0c;用来请求资源或执行…...

LangChain学习笔记2 Prompt 模板

安装 langchain 库 pip install langchain1、概念&#xff1a;提示和提示工程 在大语言模型&#xff08;LLMs&#xff09;时代&#xff0c;通过简单地更改提示中的指令&#xff0c;同一个模型可以执行多种任务。这一特性让 LLMs 在各类应用场景中都显得非常灵活和强大。然而&…...

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中&#xff0c;可以通过设置定时触发器&#xff08;Schedules&#xff09;和脚本中的时间判断逻辑结合&#xff0c;确保任务只在每月 10 号的上午运行。 以下是实现的步骤&#xff1a; 1. 设置定时触发器 GitLab 提供了 Schedules 功能&#xff0c;可以指定每…...

SimpleFOC |SimpleFOC学习笔记汇总

在机器人领域&#xff0c;掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代&#xff0c;对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来&#xff0c;接着结合实践与理论才能真正掌握技术。 入门FOC&#xff0c;我认为最合适是…...

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域&#xff0c;OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本&#xff0c;专门用于 64 位 Windows 系统。它提供了强大的功能&#xff0c;帮助用户深入分析系统内核、进程、文件、注册表等&a…...

数据储存与管理【大数据导论】

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;大数据入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…...

《从零到一:搭建高效体育直播网站的全流程技术指南》

搭建一个体育直播网站需要综合考虑技术架构、数据来源、用户体验、安全性等多个层面。从整体到细节&#xff0c;搭建这样一个网站的流程比较复杂&#xff0c;但可以分成几个重要的步骤和技术环节。以下是搭建体育直播网站的技术层面准备全流程&#xff1a; 一、需求分析与规划 …...

松散比较(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...