【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…...

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

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)
前言 最近开始准备秋招,打算做一个个人主页,以便在秋招市场上更有竞争力。 目前,现有的一些搭建主页的博文教程存在以下一些问题: 使用Github Page进行部署,这在国内访问容易受阻使用宝塔面板等框架,功能…...
语音合成的预训练模型
语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单
一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置,在爬虫爬取网站文章时候,会输入给爬虫一个配置文件,里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...

Swagger生成Api文档的增强解决方案--knife4j
方法一: 使用步骤 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(Hypertext Transfer Protocol,超文本传输协议)是客户端和服务器之间通信的基础协议。HTTP 请求是由客户端(通常是浏览器、手机应用或其他网络工具)发送给服务器的消息,用来请求资源或执行…...
LangChain学习笔记2 Prompt 模板
安装 langchain 库 pip install langchain1、概念:提示和提示工程 在大语言模型(LLMs)时代,通过简单地更改提示中的指令,同一个模型可以执行多种任务。这一特性让 LLMs 在各类应用场景中都显得非常灵活和强大。然而&…...
如何在gitlab cicd中实现每月10号上午执行
在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…...
SimpleFOC |SimpleFOC学习笔记汇总
在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代,对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来,接着结合实践与理论才能真正掌握技术。 入门FOC,我认为最合适是…...

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

数据储存与管理【大数据导论】
这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:大数据入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…...
《从零到一:搭建高效体育直播网站的全流程技术指南》
搭建一个体育直播网站需要综合考虑技术架构、数据来源、用户体验、安全性等多个层面。从整体到细节,搭建这样一个网站的流程比较复杂,但可以分成几个重要的步骤和技术环节。以下是搭建体育直播网站的技术层面准备全流程: 一、需求分析与规划 …...
松散比较(PHP)(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...

SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...