作者:辰舒
使用CDN加速静态资源时,CDN会将源站上的资源缓存到距离客户端最近的CDN节点上。当您访问该静态资源时,可直接从CDN的缓存节点上获取,有效避免通过较长的链路回源,提高资源访问效率。在本章节中,我们共同学习如何通过合理配置CDN缓存功能来提升业务缓存的利用率,实现终端用户访问体验的提升。
在正式开始配置之前,我们需要先了解缓存的形式和原理机制。
Cachekey是一个文件在CDN节点上缓存时唯一的身份ID,每个在CDN节点上缓存的文件都对应一个Cachekey。文件的Cachekey默认为客户端请求的URL(带参数)。
即 默认情况下,缓存内容的索引名(Cachekey)受到 域名、路径、参数 三大因素共同影响。我们可以理解为,对于同一个边缘节点,请求信息中三者完全一致的情况下将使用同一份缓存内容,三者中有任一因素变化则无法使用同一份缓存。

当我们的访问链接中路径变更或参数变更时,均会生成独立缓存。为了提升缓存效率,我们需要对业务思考以下四个问题:
如果您的URL中携带变化的参数,默认会影响缓存命中率和加速效果,推荐关注下文「缓存优化-忽略参数缓存」部分内容。
如果您的文件内容以同名文件覆盖的形式进行更新,推荐关注【缓存时间配置】中的配置引导,针对内容频繁更新的资源降低缓存时间。
如果您的业务中大文件较多,提升缓存及回源效率推荐开启range分片功能,推荐关注下文「缓存优化-range回源」部分内容。
即同一个uri对应的资源有多个版本,例如同一个页面的不同压缩格式,一个图片的不同尺寸(甚至也可能是完全不同的内容),服务端通过收到的请求的uri以及一些决定版本的头部信息来确定应该给客户端返回哪个版本,推荐关注下文「缓存优化-多副本及自定义缓存」。
访问URL的格式和场景和缓存利用效率息息相关,在下文的内容中,我们可以通过忽略参数缓存、cachekey改写等功能,对域名的缓存索引方式进行调整,以适配您的业务场景。
小提示:在CDN使用场景中,推荐您的源站更新资源时,考虑以不同的文件名作为新旧版本区分,例如img-v1.0.jpg、img-v2.1.jpg的方式命名,以实现便捷区分新旧缓存的效果。
CDN缓存更新主要有两种方式:
当CDN节点上的缓存失效后,缓存不会立即被清理,在源站返回last-modified/etag头部情况下,CDN将会回源发起缓存有效性校验(即协商缓存)。
可以通俗地理解为,CDN将之前缓存文件的标识信息带回源站询问是否发生变化。
当CDN节点上的缓存未失效,但源站内容已经发生变化,业务上需要立即更新CDN上资源的缓存时,需要使用CDN的缓存刷新功能,您需要通过 CDN控制台-刷新预热 或者 API接口 下发缓存的刷新任务,详细操作和说明将在下章节为您介绍。
在缓存管理中,可以方便地指定目录和文件后缀名在CDN节点上的缓存时间,缓存时长配置的长短,取决于源站对该文件的变更频率。我们需要分析下业务中以下几个问题:
例如,该加速域名下有html/js/css/mp4/apk等文件类型的内容。
例如,mp4文件的内容一般不会变化,而html是新闻门户的主页,其展示页面中的文本内容平均1小时更新一次。
例如,文件在更新内容时都会使用新的文件名,或 文件更新后仍然使用之前的文件名。
小提示:在下文的内容中,我们将根据此处的分析结果进行缓存时间的配置。
CDN缓存时间主要受两个部分控制:
配置缓存时,我们需要登录CDN控制台。在域名管理中单击目标域名,选择缓存配置。

在缓存过期时间页签下,单击添加即可配置缓存规则。

| 示例场景 | 类型 | 地址/后缀名取值 |
| 对域名下所有文件配置默认缓存时间 | 目录 | / |
| 对域名下/video目录配置缓存时间 | 目录 | /video |
| 对/home/index.html特定文件设置缓存 | 目录 | /home/index.html |
| 对域名下js,css类型文件配置缓存时间 | 文件后缀名 | js,css |
结合上文中的业务分析,推荐您根据业务情况在CDN域名上配置缓存时间。
如果没有明确业务更新周期,可缓存资源推荐配置一个月以上的缓存时间,如果源站的资源发生变更,您可以通过CDN的刷新缓存功能清理节点上的缓存(下章节中会详细说明)。
需要注意的是,如您的业务中有动态请求(如表单提交/登录/评论/上传等交互),需要设置对应路径或文件类型的缓存时间为0。如果您需要对动态请求也进行加速,优先推荐您使用全站加速(DCDN)产品。
补充说明:参考CDN产品文档,CDN节点上的缓存生效优先级如下
正确配置缓存后,您可以通过访问资源URL时,通过CDN响应头中的X-Cache信息判断是否命中缓存,首次访问时可能会显示MISS,可以通过刷新页面或重试请求检查下次请求是否命中。
下图为通过chrome开发者工具抓包的结果,您也可以通过curl进行测试。
X-cache:HIT(命中)/MISS(未命中),此处仅代表边缘节点的命中情况,不代表其父层节点的命中情况。
X-Swift-SaveTime:缓存在节点上保存的时间,零时区(北京时间+8H)。

缓存优化部分致力于帮助您的业务缓存得到合理的利用,此处主要介绍三个常用功能。
CDN缓存时忽略全部或部分URL中的参数内容,提高缓存利用率,针对URL中携带随机变化参数但不影响缓存内容的场景,推荐开启。
针对业务中平均文件大小超过20M,在源站允许range的情况下,开启该功能允许CDN分片进行回源,不仅能够降低回源带宽,也可以提升缓存效率,大文件场景下推荐开启。
业务中仅用URL无法完全区分响应内容,需要结合请求中其他信息,对同URL进行多个副本的缓存,或者需要自定义缓存逻辑。
上文中我们提到过,如果您的业务URL中携带变化的参数,默认会影响缓存命中率和加速效果,这些不同的参数无法复用同一份缓存的内容。
如下图所示,尽管四个访问URL的内容都是同域名下的test.jpg,响应的资源内容也完全一致,但由于携带的参数不同,导致对应的缓存索引也不同,最终无法使用同一份缓存内容,分别独立回源,如何改善这种情况呢?

针对time这种对业务内容和逻辑无影响的参数,我们希望上面两种访问URL使用同一份缓存内容,那么需要保证他们的缓存索引一致,实现如下图的效果,也就是在生成CDN缓存索引时,忽略 time 参数。

配置方式:


| 场景 | 过滤模式 | 过滤参数 | 过滤参数 | 保留回源参数 |
| CDN忽略所有参数缓存,但回源站时需要携带参数,例如源站有鉴权。 | 保留指定参数 | 是 | 不填写 | 是 |
| CDN忽略所有参数缓存,也无需携带参数回源。 | 保留指定参数 | 是 | 不填写 | 否 |
| CDN保留version参数缓存,且只携带version参数回源 | 保留指定参数 | 是 | version | 否 |
| CDN仅保留key1和key2参数缓存,但需要携带所有参数回源。 | 保留指定参数 | 是 | key1,key2 | 是 |

| 场景 | 过滤模式 | 删除指定参数 | 保留回源参数 |
| 仅删除timestamp参数缓存,保留其他参数缓存,回源无需携带timestamp | 删除指定参数 | timestamp | 否 |
| 仅删除token参数缓存,保留其他参数缓存,回源时必须携带token | 删除指定参数 | token | 是 |
小提示:如果基础的忽略参数缓存无法满足您对缓存索引的需求,也可以了解缓存配置中的 自定义Cachekey 功能
Range回源,指CDN节点在回源的HTTP请求里面携带了Range信息,源站在收到CDN节点的回源请求时,根据HTTP请求头中的Range信息返回指定范围的内容数据给CDN节点。Range回源可有效提高文件分发效率,可以提高缓存命中率,减少回源流量消耗和源站压力,并且提升资源响应速度。

需要特别注意:
配置方式:


小提示:开启和强制的区别在于
在业务上需要对单URL进行多副本缓存时,主要实现方式主要有两种,如果您需要复杂的自定义缓存,推荐使用第一种:
注意:多副本缓存推荐在默认缓存行为或忽略参数缓存功能无法满足业务需求时使用,对同URL的过多副本不利于缓存命中率,可能会产生较多回源浪费,配置时您需要合理评估参数的独立缓存必要性。
当我们想根据业务情况,结合path、参数、header等信息自定义cachekey的生成方式时,可以使用该功能。

我们列举基础场景帮助您的理解:
场景1:对请求路径改写cachekey
http://aliyundoc.com/a/b/image.jpg
http://aliyundoc.com/a/b/c/image.jpg
如果我们希望将上述2个URL视为请求同一个文件,使用同一份缓存内容,因此生成cachekey时 需要忽略 /a/b ,即该文件的Cachekey为http://aliyundoc.com/c/image.jpg,配置方式如下图所示。

场景2:将 HTTP Header 拼接到cachekey中
如果我们希望客户端请求的HTTP HEADER的User-Agent和Accept-Language的值将被拼接到Cachekey中。
例如,请求http://aliyundoc.com/a/b/image.jpg中的部分请求头为:
User-Agent=Mozilla/5.0 (Linux; X11)
Accept-Language=en
则期望该请求的Cachekey为:http://aliyundoc.com/a/b/image.jpgMozilla/5.0(Linux;X11)en

除了上述两种基础场景外,您也可以根据业务需求探索配置,在自定义变量中支持正则匹配生成变量,可以满足更复杂的业务需求,详情可参考产品文档说明。
Vary 是一个 HTTP标准协议 响应头部信息,它被服务器用来表明在内容协商算法中选择一个资源代表的时候应该使用哪些头部信息。
通俗地我们可以理解为,服务器区分该缓存的适用对象时,通过vary判断要结合哪些Header的结果用于区分。
实现方式是源站通过在响应中,指定某一个或几个header头来标识资源的的版本。
例如,以文件压缩为例,可以根据用户请求Header中的Accept-encoding请求头来决定返回不同压缩格式的缓存:
在这种场景下,源站需要带:Vary:Accept-encoding来表明用Accept-encoding的值来做多副本。
至此,缓存相关的常用配置及功能介绍内容已经结束,在下个章节中,我们会继续学习:
缓存的刷新和预热是CDN中的重要功能之一,缓存版本可能会影响到您业务的正常加载,为了帮助您更好的理解CDN使用,推荐您继续阅读下一章节的内容。
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现