【CDN 最佳实践】获取历史脏数据的处理思路及规避方法

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 保证提供给客户端准确的数据是保障服务质量的最基本的要求。但是在实际使用过程中经常会发现客户端访问到的数据为历史脏数据影响客户体验。本文将在包括 CDN 的场景下分析常见出现该问题的原因以及规避方法,希望大家可以在遇到该问题时可依据该思路尽快恢复解决。

在添加 CDN 后客户端访问经常出现访问到历史旧数据的情况,下面我们分析客户端到服务器端整条链路的情况分析出现历史旧数据的原因以及规避方法。

客户端浏览器缓存

现象分析
解密浏览器缓存机制中所述,浏览器缓存是包括强缓存和验证缓存两种模式。因为强缓存是不会与服务器端进行任何校验直接加载资源,因此客户端访问加载了强缓存的数据会直接导致获取到历史旧数据(如图 1 所示)。
                                     image
                                                                        图1. 浏览器强缓存示意图


而如果客户端获取的浏览器验证缓存也同样是有可能获取到历史脏数据的。因为浏览器端会和其访问资源的服务器端进行 Etag 或者 Last-Modified 字段验证,如果其访问的服务器为缓存服务器(例如: CDN 等缓存服务器)。而同样缓存服务器也是历史脏数据的话就会导致异常(如图 2 所示)。
                                                image
                                                                        图2. 浏览器验证缓存示意图


规避方案
1. 客户端清空浏览器缓存
当怀疑浏览器强缓存导致的问题可以手动清空下浏览器缓存或者通过 Ctrl+F5 强制刷浏览器缓存查看是否恢复。
2. 禁止浏览器缓存
上述方法仅能够临时解决,如果该资源不想其因为浏览器缓存导致脏数据的话可以设置该资源的 Response 头中的 Cache-Control 或者 Expires 为 no-cache, no-store, private即可禁止浏览器缓存。
注意:上述的 Response 头中的 Cache-Control 或者 Expires 设置也同样会影响 CDN 的缓存。如果希望 CDN 加速的资源可以在 CDN 上缓存但是禁止在浏览器缓存的话可以在 CDN 上设置 HTTP 头,该 HTTP 头不影响 CDN 缓存策略,仅影响客户端浏览器缓存策略(配置如图 3 所示)。
                                    image
                                                                        图3. CDN 设置 HTTP 头示意图

劫持访问到缓存服务器

现象分析
终端设备正常请求应该是到缓存服务器 CDN 或者服务器上,但是有时会出现该资源请求被 301 或者 302 跳转到某台服务器返回数据,例如图 4 所示,该 IP 并非是服务器的 IP ,被跳转到运营商的缓存服务器。 这种现象一般出现在局部地区的个别终端设备中,并非在全局范围内影响。
                                    image
                                                                        图4. 访问出现劫持示意图


规避方案
1. 反馈当地运营商跟进该问题
因为该问题主要在客户端到服务器端的运营商链路出现的问题,通过服务器端不好解决该问题,建议可将该问题反馈给运营商解决该问题。

CDN 缓存历史脏数据

现象分析
CDN 作为内容分发网络,是会将用户源站的资源缓存到各个 CDN 节点。 CDN 当源站做同名更新时是不会主动回源拉取新资源的( OSS 除外,详细见规避方案 4 )。除非当客户端发起请求后,对应 CDN 节点上该资源没有缓存或者缓存已经过期才会回源拉取最新的数据。
用户可以通过获取资源的 Response 头中查看到该资源的缓存情况。如图 5
中所示, Via 投中分别标识了 CDN 的 L2 节点和 L1 节点,如果两者之中有一个是 "H" 的状态即表示 CDN 是命中状态,此时是不会回源拉取最新数据的。图 5 中即是 CDN L2 节点命中的状态。
                                    image
                                                                        图5. CDN 的Response 头示意图


规避方案
1. 手动刷新 CDN 缓存,重新触发回源请求
如果需要将 CDN 上的缓存强制置为过期的话是可以手动刷新 CDN 上的缓存数据的,详细操作请您参考 CDN 刷新缓存,另外如果应用端需要脚本进行控制的话可以使用刷新的 API 接口,请您参考 CDN 刷新缓存接口
注意: CDN 的目录刷新是会刷新该目录下的所有子目录和文件的,因此目录刷新是有可能引起大量回源请求的。
2. 源站尽量避免同名更新,可以给文件增加版本号区别
建议用户静态资源做版本更新的时候可以通过版本号进行区别,例如在 URL 中带上 “?version=1.0” 进行区分,这样避免应用系统迭代后仍然获取之前版本数据。
注意:通过版本号进行区别时 CDN 是不能开启过滤参数或者保证版本的参数保留的,请您参考: CDN 过滤参数的作用
3. 资源经常同名更新则应该设置其不在 CDN 缓存
如果对应的资源经常需要更新的话那么该资源应该在 CDN 缓存时间较短或者不缓存的,建议用户可以根据实际的业务场景配置缓存规则, CDN 的缓存规则建议参考: CDN 缓存策略
4. 当 CDN 的源站为 OSS 时可以设置自动刷新功能
当 CDN 的源站是 OSS 的话是可以设置自动刷新功能的,请您参考图 6 。当 CDN 的加速域名也同样在 OSS 的自定义域名进行绑定后即可开启该自动刷新功能。然后当 OSS 中的文件出现同名更新的话就会自动下发 CDN 刷新任务以保证 CDN 上该资源的缓存不可用。
                                    image
                                                                        图6. OSS 配置 CDN 缓存自动刷新示意图

代理服务器缓存

现象分析
常见的用户架构中是 CDN 回源到反向代理服务器,然后通过反向代理到真正的源站服务器。在这种场景下如果反向代理服务器开启了缓存功能也同样会在源站服务器进行更新后仍然出现历史脏数据。测试通过代理服务器和源站服务器返回数据不一致即可确认为该问题。
规避方案
1. 关闭代理服务器的缓存功能
反向代理服务器的缓存功能用户是可以选择是否开启缓存功能。例如使用 Nginx 服务器作为反向代理服务器时是通过 proxy_cache 模块设置缓存的。用户可以关闭该模块功能即可取消缓存的功能,其他的 Web 服务器配置具体见对应服务器的官方配置文档。
2. 清空代理服务器缓存
用户在更新过源站服务器后可以清除代理服务器的缓存内容,不同的代理服务器有不同的清除方法,在 Nginx 服务器中是没有直接提供清除指定 URL 缓存的功能的,常见的方法是使用 ngx_cache_purge 第三方模块进行清理。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
存储 JavaScript 前端开发
使用CDN方法的方式进行Vue.js的安装
最近公司需要进行一些前端的开发工作用到了Vue前端框架,所以准备自学Vue,顺便几下学习的过程以及一些问题。
939 0
使用CDN方法的方式进行Vue.js的安装
|
缓存 CDN
阿里云CDN设置不缓存某个目录或者文件的方法
某个文件或者目录不想让CDN缓存如何设置?阿里云CDN如何设置不缓存?新手站长网分享阿里云CDN设置某个目录或文件不缓存的方法: CDN设置某个目录或文件不缓存 CDN缓存能够为网站提速,但是实际应用中,某些文件或者某个目录不想让CDN缓存,如何设置呢?(官方文档:CDN设置某个目录或文件不缓存 ...
5275 0
|
2月前
|
安全 CDN
阿里云CDN产品解读及全站加速在游戏行业的最佳实践!
阿里云CDN(内容分发网络)为全球用户提供快速、稳定、安全的内容分发加速服务,显著提升访问响应速度和成功率
|
域名解析 负载均衡 网络协议
信息收集——绕过CDN查找真实IP(最实用的方法)
信息收集——绕过CDN查找真实IP(最实用的方法)
5457 0
信息收集——绕过CDN查找真实IP(最实用的方法)
|
缓存 网络协议 前端开发
CDN最佳实践之访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。同时介绍了一些典型的问题场景,结合这些问题场景可以更快速的去发现问题并优化。
2680 1
CDN最佳实践之访问慢的分析思路和优化方案
|
CDN
《阿里云CDN-金融政企CDN最佳实践》电子版地址
阿里云CDN-金融政企CDN最佳实践
147 0
《阿里云CDN-金融政企CDN最佳实践》电子版地址
|
缓存 网络协议 前端开发
【最佳实践】CDN访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。
2427 0
|
数据安全/隐私保护 CDN Perl
Cocoapods1.8版本以后使用CDN服务的方法
1.8版本的发布舍弃了原始完整克隆的Specs仓库改用CDN服务,查找资料后,我们也果断的尝试使用了CDN,pod install 和 pod update 速度都很快,推荐使用。以下是步骤:
|
机器学习/深度学习 人工智能 算法
NeurIPS 2021 | CDN:首个融合two-stage和one-stage思想的HOI检测方法
NeurIPS 2021 | CDN:首个融合two-stage和one-stage思想的HOI检测方法
NeurIPS 2021 | CDN:首个融合two-stage和one-stage思想的HOI检测方法
|
缓存 运维 Serverless
Serverless架构实现CDN预热最佳实践
预热是源站将会主动将对应的资源缓存到CDN节点,当您首次请求时,就能直接从CDN节点缓存中获取到最新的请求资源,提高缓存命中率。在游戏行业,业务高峰前对热门资源进行预热,提高缓存命中率,降低访问延时。
Serverless架构实现CDN预热最佳实践