第五章 静态资源 CDN 引入

2023-11-12

第五章 静态资源 CDN 引入

静态请求 CDN

  • 用户将静态资源数据请求到ECS服务器,ECS服务器解析到阿里云的CDN中,CDN可以理解为一个无限大的内容磁盘缓存,本身没有文件存储。当用户访问 getItem 的一个静态资源文件的时候,会根据路由规则查看本地是否有这样的文件,如果有直接返回,没有就回源到源站,回源到下面的OSS中获取静态资源文件。
  • CDN一边返回对应的文件,一边将文件按照http指示的生命周期缓存起来,以便下次用户访问时,直接返回。

Untitled

Untitled

Cache Control 响应头

Cache Control 状态标志着缓存的策略

  • private:客户端可以缓存
  • public:客户端和代理服务器都可以缓存(代理服务器指的是从客户端到后端服务器所经过的中间服务器结点,比如 nginx、CDN、正向代理服务器等)
  • max-age=xxx:缓存的内容将在 xxx 秒后失效
  • no-cache:强制向服务端再验证一次(客户端缓存在本地,下次使用缓存时要向服务器请求验证是否可以使用缓存)
  • no-store:不缓存请求的任何返回内容

Untitled

客户端向服务器验证是如何做的呢 ?

有效性判断

  • ETag:资源唯一标识
    • 将请求的内容进行MD5或Hash的加密,生成一串资源唯一标识符,在第一次返回内容的时候,加上ETag返回给客户端浏览器。
    • 下一次请求时,发送HTTP请求带上ETag,与服务器本地的ETag做验证,若符合就返回状态码304 (Not Modified) ,表示缓存是有效的,客户端可以直接使用。
  • If-None-Match:客户端发送的匹配Etag标识符
  • Last-modified:服务端响应资源的最后修改时间
  • If-Modified-Since:客户端发送的匹配资源最后修改时间的标识符

整个客户端向浏览器请求流程如下:

Untitled

首先用户请求资源,

  • 先判断URL本地是否有缓存,如果没有就直接向服务器请求,然后返回。
  • 如果有,判断缓存是否过期 (max-age),若没有过期,则直接使用缓存资源。
  • 如果有 max-age 但过期了,则优先判断 ETag:有 ETag 的话就向服务器请求 If-None-Match,请求带上 ETage
  • 若没有 ETag,则判断是否有 Last-Modified,然后向服务器请求 If-modified-since(客户端发送的匹配资源最后修改时间If-None-Match如果早于服务器响应资源修改时间 Last-Modified,则资源无效已经被修改,如果晚于则资源有效)
  • 服务器返回的是304表示资源没有修改,则本地缓存可直接使用;如果返回200,表示资源被修改,需要向服务器发起请求

浏览器三种刷新方式

  • 回车刷新或a标签连接:看cache-control对应的max-age是否仍然有效,有效就直接使用本地缓存,如果cache-control中为no-cache,则进入缓存协商逻辑(指判断ETage或LastModified这种方式)
  • F5刷新或 command+R 刷新:去掉cache-control中的max-age或直接设置max-age为0,然后进入缓存协商逻辑
  • 强制刷新 ctrl+F5 或 command+shift+R 刷新:去掉 cache-control 和协商头(带ETage或Last-Modified),强制刷新,从服务器获取资源

缓存协商机制:比较 last-modified 和 ETag 到服务端,若服务端判断没变化则304不返回数据然后客户端直接使用本地缓存,否则200返回数据

CDN 自定义缓存策略

  • 可自定义目录过期时间(CDN自身向源站OSS做回源的时间)
  • 可自定义后缀名过期时间(针对不同后缀名设置过期时间)
  • 可自定义对应权重(设置用自定义后缀名过期时间/自定义目录过期时间二者使用的权重)
  • 可通过界面或api强制cdn对应目录刷新(不一定保证成功)

Untitled

静态资源CDN部署策略

部署策略一

如果静态资源文件(css,js,img)文件名不变,采用max-age缓存时间设置后,如果在缓存有效时间内发生版本更新,比如重大故障或更新,如果全都是让用户来手动刷新浏览器,清缓存,这样体验不好,有以下几种部署策略:

  • css,js,img等元素使用带版本号部署,例如a.js?v=1.0不便利,且维护困难(如果单纯改某个文件版本,其他文件是否更新版本号会难以维护)。
    • html内嵌css,js,img这些资源,必须设置成no-cache,向服务器做缓存协商机制。html一般采用强推的概念,可以设置max-age,但每次请求都会让CDN全部失效,然后回源,这样将 max-age 设置一个短的时间后,用户就有版本更新
  • css,js,img等元素使用带摘要部署:例如a.js?v=45edw存在先部署html还是先部署资源的覆盖问题。
    • 给资源文件名后加一个部署摘要(一段字符串,如果文件没变化,摘要也不改变),但会存在问题。
    • 情况1:先部署资源文件后部署html
      • 某个js文件发生变化,更改摘要后如果js先部署,js会覆盖老版本,此时html引用的还是老的js文件,有可能导致不兼容问题;
    • 情况2:先部署html后部署资源文件
      • 先部署html会引用新的js,而此时服务器还是老的js等,容易出错。
  • (推荐)css,js,img 等元素使用摘要做文件名部署,例如45edw.js,新老版本并存,且可回滚,资源文件部署完成后再部署html。

部署策略二

  • 对应静态资源保持生命周期内不会变,max-age可设置的很长,无视失效更新周期
  • html文件设置no-cache或者较短的max-age,以便于更新
  • html文件仍然设置较长的max-age,依靠动态的获取版本号请求发送到后端,异步下载最新的版本号的html后展示渲染在前端
  • 动态请求也可以静态化成json资源推送到cdn上
  • 依靠异步请求获取后端节点对应资源状态做紧急下架处理
  • 可通过跑批仅仅推送cdn内容使其下架等操作

全页面静态化

html,css,js 静态资源cdn化 -> js ajax动态请求cdn化(将请求变成静态文件发送到cdn)–> 全页面静态化

**定义:**在服务端完成html,css,甚至js的load并渲染成纯html文件后直接以静态资源的方式部署到cdn上

phantomjs

首先 phantomjs 是一个无头浏览器,可以借助其模拟 webkit js 的执行

  • 修改需要全页面静态化的实现,采用initView和hasInit方式防止多次初始化
  • 编写对应轮询生成内容方式
  • 将全静态化页面生成后推送到 cdn

总结:经过全页面静态化以后,从以前刷新 ajax 请求填充到 html 这个过程变成了已经执行好的静态html页面

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五章 静态资源 CDN 引入 的相关文章

  • django图像存储cdn

    过去几个月我一直在使用rackspace CDN 以及 django imagekit 和 django cumulus 我对结果并不满意 由于超时等原因 我似乎收到了很多错误 File www django test1 omu2 src
  • Phantomjs 加载页面缓慢

    我是 phantomjs 的新手 正在标准的 centOS 服务器上尝试它 安装了 httpd 等 但除了名称服务器设置为 8 8 8 8 和 8 8 4 4 之外 没有修改设置 我正在使用默认的 loadspeed js 文件 已重命名
  • 使用 phantomjs/casperjs 测试 DOM 元素

    我有一个基于 AJAX 的 javascript 应用程序 我想对其进行接口测试 例如 我想编写一个测试来加载我的网站 从给定的 URL 并检查是否存在一些 DOM 元素 给定的 id 和给定的类 问题是当我在浏览器中输入 URL 时 我的
  • 来自 gstatic 的 PhantomJS JavaScript 错误,但浏览器中没有错误

    我最近通过 PhantomJS 测试套件运行我们的网站 遇到了无法在浏览器中手动重现的 JavaScript 错误 这些错误是在 Google 地图 api 中发现的 Capybara 返回的文本如下 TypeError Unable to
  • Karma、PhantomJS 和 es6 Promise

    我正在编写一个使用新的 es6 Promise 的 JavaScript 库 我可以在 Firefox 中测试该库 因为 Promise 已定义 但是 当我尝试使用 Karma 和 PhantomJS 测试我的代码时 出现错误Can t f
  • 如何强制 cdn.rawgit.com 使用更新的文件

    我正在使用 cdn rawgit com 托管项目的一些脚本和 CSS 但无法刷新它 根据常见问题解答 对 cdn rawgit com 的请求通过 MaxCDN 的超快速内容交付网络进行路由 并在第一次加载时永久缓存 这会带来最佳性能并减
  • 仅具有 Phantomjs 1.7/1.8/1.9 的 Courier-Fonts,可能特定于 CSS

    自从更新到 OpenSuse 12 2 后 我无法再使用 phantomjs 从 1 5 更新到版本 1 8 1 64 位 来创建屏幕截图 问题是缺少对 serif sansserif 字体的字体支持 仅使用类似 courier monos
  • Karma/Jasmine/PhantomJs:未定义不是构造函数

    我有一个应用程序在运行测试时引发奇怪的错误 错误如下 TypeError undefined is not a constructor evaluating allKeys i match 0 9 in node modules jasmi
  • 获取特定 S3 对象的下载计数

    我有许多 S3 对象可供我的客户使用 由于我想按使用情况向客户计费 我想知道是否有任何聪明的方法来获取给定文件的下载次数 或者 我想我可以解析 S3 提供的日志文件 但对于每个客户 1000 万次以上的提取 这可能是一项艰巨的任务 有任何想
  • CDN 上的 Dojo 与自己安装的 Dojo

    我使用了相当多的 Dojo 但迄今为止我仅通过包含来自 AOL Google 等 CDN 来使用它 托管 Dojo 副本而不是通过 CDN 使用它是否有优势 我没有太多需要改变代码库 但我想还有其他优点 缺点 通过托管您自己的 Dojo 环
  • 在 PhantomJS 中使用 jQuery DOM 选择器语法?

    我正在学习 PhantomJS 想知道是否可以在 PhantomJS 运行的 JS 文件中使用 jQuery DOM 选择器 我在 github 上看到了一个简短的例子 它似乎表明了这一点 PhantomJS 与 Qunit 和 jQuer
  • 在 Azure Web 应用程序上运行 Selenium

    我有一个 Azure Web 应用程序 当我在控制器上调用操作时 我想用它来屏幕抓取网站 如下所示 var driver new PhantomJSDriver driver Url http url com driver Navigate
  • 尝试在节点集群后面扩展时 phantomjs-node 崩溃

    相关 GitHub 问题 https github com sgentle phantomjs node issues 280 https github com sgentle phantomjs node issues 280 我有一个简
  • 无法通过 phantomjs 网络服务器传送图像文件

    我正在尝试让 phantomjs 网络服务器为我工作 我想提供 2 个文件 html 文件和 png 图像文件 html 文件服务良好并在浏览器中正确呈现 但 png 文件不是 这是服务器的代码 var fs require fs func
  • 如何查看远程脚本被阻止时返回的内容

    我在我的 web 应用程序中使用 Google 托管的 jQuery ajax googleapis com ajax libs jquery 1 8 3 jquery min js 作为错误诊断的一部分 我有一个 window onerr
  • 对登录 Instagram 的 PhantomJS 代码进行故障排除

    我编写了这个 PhantomJS 脚本来自动登录 Instagram 它可以成功填写表单字段并按提交按钮 但它总是被重定向回登录屏幕并显示以下消息 你的用户名或密码不正确 我 100 确信凭据是正确的 并且我用多个 Instagram 帐户
  • PhantomJS 无法打开 HTTPS 站点

    我使用以下基于 loadspeed js 示例的代码来打开一个 https 站点 该站点也需要 http 服务器身份验证 var page require webpage create system require system t add
  • 如何设置黄瓜环境变量

    我有以下 package json name newcucumber version 1 0 0 main index js scripts test node modules bin cucumber js firefox node mo
  • 将 PhantomJS 调用中的变量暴露给injectJS

    我已经按照从入门页面注入 jQuery 的示例进行操作 效果很好 我在同一目录中有一个 jQuery 的本地副本 并执行类似的操作 if page injectJs jquery min js page evaluate function
  • 如何使用 phantomjs 等待 iframe 在 selenium python 中加载

    获取页面的脚本是 from selenium import webdriver from selenium webdriver support ui import WebDriverWait from selenium webdriver

随机推荐

  • 【Parallels Desktop】解决Sorry, This Application Cannot Be Run Under A Virtual Machine

    问题描述 解决步骤 Win R 或Cmd R 打开 运行 窗口 输入regedit并点击 确定 打开注册表编辑器 依次展开HKEY LOCAL MACHINE HARDWARE ACPI DSDT文件夹 鼠标右键点击PRLS 选择 重命名
  • Redis第二讲 Redis数据持久化AOF和RDB

    RDB快照 snapshot 在默认情况下 Redis 将内存数据库快照保存在名字为 dump rdb 的二进制文件中 你可以对 Redis 进行设置 让它在 N 秒内数据集至少有 M 个改动 这一条件被满足时 自动保存一次数据集 save
  • 【修仙境界】等级划分

    文章目录 一 下境界 1 炼气 一共13层 2 筑基 分初 中 后期和大圆满 3 结丹 分初 中 后期和大圆满 4 元婴 分初 中 后期和大圆满 5 化神 分初 中 后期和大圆满 二 中境界 1 炼虚 分初 中 后期和大圆满 2 合体 分初
  • C++ 编程出错的地方(考试选择题易错点)

    一 int IsSvn int n if n 7 0 return 1 要判断这个数能不能被7整除 你就只返回1吗 那岂不是只返回1 没有0的情况了 应该改为 int IsSvn int n if n 7 0 return 1 else r
  • 2021年电赛模块化程序总结

    文章目录 1 ADC0804 2 LCD1602 3 AD9854 1 ADC0804 集成A D转换器品种繁多 选用时应综合考虑各种因素选取集成芯片 一般逐次比较型A D转换器用的比较多 ADC0804就是这类单片集成A D转换器 ADC
  • 9、HTML:有序列表(ol),无序列表(ul),描述列表(dl、dt、dd)详解

    1 什么是列表 什么是列表 什么是有序列表 什么是无序列表 上面写的 3 句话就是一个列表 你懂得 2 有序列表 有序列表 英文叫做 ordered list 所以标签也是取这个词组的首字母 ol ol标签括起来的范围就是有序列表的范围 而
  • Win11怎么修改c盘用户名?

    Win11怎么修改c盘用户名 不知道的小伙伴们可以学起来了 谨慎操作 以下的方法提供给你 希望对你有所帮助 Win11更改C盘user用户名教程 一 开启Administrator权限并登入 搜索框搜索cmd 右击以管理员身份运行 出现cm
  • C++每日一问:C++ 内存管理——内存泄漏及处理

    2 内存泄漏 2 1 C 中动态内存分配引发问题的解决方案 假设我们要开发一个String类 它可以方便地处理字符串数据 我们可以在类中声明一个数组 考虑到有时候字符串极长 我们可以把数组大小设为200 但一般的情况下又不需要这么多的空间
  • 唯一分解定理(分解质因子)

    唯一分解定理 每个大于一的自然数均可写为质数的积 而且这些素因子按大小排列之后 写法只有一种方式 最简单的写法 include
  • matlab绘制正弦函数、幅度调制初步、Inner matrix dimensions must agree错误

    以sin 2 f t 表达式来绘制正弦图像 必须给定数值序列才能绘制出图像 t必须给定一个数值序列 然后计算出 y sin 函数值序列 以t为横轴 y为纵轴 就绘制出了图像 先给出f 4 在这里是有几个周期 采样率Fs 100 matlab
  • flask从入门到精通,知识讲解+代码演示 day1

    flask从入门到精通 知识讲解 代码演示 day1 文章目录 flask从入门到精通 知识讲解 代码演示 day1 一 flask是什么 二 使用步骤 1 创造flask项目 2 初入flask 3 flask代码初运行 4 flask从
  • Spring Cloud实战(五)-声明式接口模块

    接着上一篇 Spring Cloud实战 四 配置中心 现在开始搭建api模块 一 声明式接口模块api 1 pom xml
  • 数学建模-相关性分析(Matlab)

    注意 代码文件仅供参考 一定不要直接用于自己的数模论文中 国赛对于论文的查重要求非常严格 代码雷同也算作抄袭 如何修改代码避免查重的方法 https www bilibili com video av59423231 清风数学建模 一 基础
  • GPU与GPGPU泛淡

    GPU与GPGPU泛淡 GPU Graphics Processing Unit 也即显卡 是一种专门在个人电脑 工作站 游戏机和一些移动设备 如平板电脑 智能手机等 上作图像运算工作的微处理器 它已经是个人PC和移动设备上不可或缺的芯片
  • C#数据类型之枚举类型

    一 枚举类型的定义 public enum 枚举名称 枚举数据类型 枚举的数据类型可以省略 默认类型为int 枚举项1 枚举项的值 枚举项的值是整数可以自己设置 枚举项2 枚举项3 例如 public enum month ushort 一
  • Clion + mysql (win/Mac + 本地/远程)

    新手教程 那些年我用clion操作mysql的一些经验教训 本文目录 使用clion自带的数据库工具 对数据库进行操作 连接本地数据库 建库 建表 编辑表格 修改字段名 查询数据 插入新的数据 sql常用语句 mysql版 win Clio
  • 口罩检测——数据准备(2)

    文章目录 前言 一 数据介绍 二 数据标注 三 数据转换 总结 前言 上一篇文章中小编讲解了口罩检测的环境要求 在这一篇文章中我们就正式进入项目的讲解 我们从数据准备开始 数据是模型快乐的源泉 没有高质量的数据 再好的模型也白搭 一 数据介
  • Flink消费Rabbit数据,写入HDFS - 使用 BucketingSink

    一 应用场景 Flink 消费 Kafka 数据进行实时处理 并将结果写入 HDFS 二 Bucketing File Sink 由于流数据本身是无界的 所以 流数据将数据写入到分桶 bucket 中 默认使用基于系统时间 yyyy MM
  • 通过 Tensorflow 的基础类,构建卷积神经网络,用于花朵图片的分类

    实验目的 通过 Tensorflow 的基础类 构建卷积神经网络 用于花朵图片的分类 实验环境 import tensorflow as tf print tf version output 2 3 0 实验步骤 一 数据获取和预处理 1
  • 第五章 静态资源 CDN 引入

    第五章 静态资源 CDN 引入 静态请求 CDN 用户将静态资源数据请求到ECS服务器 ECS服务器解析到阿里云的CDN中 CDN可以理解为一个无限大的内容磁盘缓存 本身没有文件存储 当用户访问 getItem 的一个静态资源文件的时候 会