当前位置: 首页 > 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;…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...