CuteKe网站开发与安全4——CDN优化与Spring Security

    之前CuteKe网站刚刚上线的时候访问我的网站需要10秒左右,当然这是让人受不了的,所以我先改变了每个页面不必要的资源文件(headerfooterFragment中不必要的文件不需要),发现节约了5秒左右,但是还是不行,还可以进行优化,我们可以进行CDN优化,本章我们会介绍CDN的概念与Spring Security里面是怎么支持缓存的。

1. CDN概念

1.1 使用场景

    让我们先来看阿里云CDN官方给的应用场景:

  • 网站/应用 静态加速:站点或应用中大量静态资源的加速分发。建议将站点内容进行动静分离,静态内容使用阿里云CDN加速。动态内容可以使用云服务器ECS,静态资源如各类型图片、css、js小文件等,是我们重点关注的内容,架构图如下:

    CDN-网站静态加速

  • 视音频点播/大文件下载:支持各类文件的下载、分发,支持在线点播加速业务,如mp4、flv视频文件或者平均单个文件大小在20M以上,主要的业务场景是视音频点播、大文件下载(如安装包下载)等

  • 直播加速:基于领先的内容接入与CDN网络以及大规模分布式实时转码技术打造的音视频直播平台,提供便捷接入、高清流畅、低延迟、高并发的音视频直播服务。支持多直播场景,全景数据统计,丰富角度分析;直播功能丰富,录制回放、实时封面、实时转码、连麦混流。

  • 移动应用加速:移动APP更新文件(apk文件)分发,移动APP内图片、页面、短视频、UGC等内容的优化加速分发。提供httpDNS服务,避免DNS劫持并获得实时精确的DNS解析结果,有效缩短用户访问时间,提升用户体验。

  • 其他CDN产品

    最后给出使用的http请求处理流程图:

cdn-framework

在这里我们使用的场景只有第一种,所以我这边给出了架构图,其余场景的架构图可以查看参考资料1

1.2 一些重要术语

  • DNS:即Domain Name System,域名解析服务,相信大家都很熟悉了,这里就不介绍了
  • CNAME记录:DNS解析记录类型的一种,可以用来把一个域名解析到另一个域名,当 DNS 系统在查询 CNAME左面的名称的时候,都会转向 CNAME 右面的名称再进行查询,一直追踪到最后的 PTR 或 A 名称,成功查询后才会做出回应,否则失败。例如,你有一台服务器上存放了很多资料,你使用docs.example.com去访问这些资源,但又希望通过documents.example.com也能访问到这些资源,那么你就可以在您的DNS解析服务商添加一条CNAME记录,将documents.example.com指向docs.example.com,添加该条CNAME记录后,所有访问documents.example.com的请求都会被转到docs.example.com,获得相同的内容。
    • 七牛云提供了OSS服务了,提供了10GB的免费存储,一般OSS都是经过CDN优化的

    • 让我们来看看七牛云的域名的解析记录,使用dig来查看:

    • 可以看解析的时候CNAME到了很多其他的域名,最后解析到两个IP,估计也就是离我比较近的边缘节点

  • 边缘节点:边缘节点是相对于网络的复杂结构而提出的一个概念,指距离最终用户接入具有较少的中间环节的网络节点,对最终接入用户有较好的响应能力和连接速度。其作用是将访问量较大的网页内容和对象保存在服务器前端的专用Cache设备上,以此来提高网站访问的速度和质量。
  • 回源host:回源host:回源host决定回源请求访问到源站上的具体某个站点。

2. HTTP支持

    前端缓存主要分为浏览器缓存cdn缓存,这些缓存的控制都是有HTTP的几个头来控制:

  • Cache-Control:这里面有很多规定的字段,请求和响应字段含义可以参阅相关资料或者查阅参考资料4,让我们看看保存在七牛云OSS上面进行过CDN优化过的图片在浏览器解析的过程:

    • 浏览器第一次访问,返回200状态码,并且max-age=31536000,也就是1年,如图:

      cdn-cache-control

    • 浏览器第二次访问,返回304状态码,max-age也是相同:

      cdn-cache-control2

  • Last-Modified:服务器最后修改文件的日期,如果max-age+Last-Modfied的时间小于当前时间的话,会重新请求。

  • If-Modified-Since:询问是否在这个时间修改过,如果没有修改则会返回304状态码

HTTPS暂时没有调研,不过应该和HTTP的类似,只是加了一层加解密

3. Spring Security支持

    OSS服务器是自己会支持缓存的,但是我的CuteKe网站使用了Spring Security,那让我们来看一下Spring Security支不支持缓存呢?官方给的说法:In the past Spring Security required you to provide your own cache control for your web application. This seemed reasonable at the time, but browser caches have evolved to include caches for secure connections as well. This means that a user may view an authenticated page, log out, and then a malicious user can use the browser history to view the cached page. To help mitigate this Spring Security has added cache control support which will insert the following headers into you response.

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0

    大体翻译一下就是不正确的缓存会导致用户浏览没有权限的文件,所以为了安全,Spring Security默认使用no-cache。所以我们针对这个默认的配置,我们需要改变一下,使之能缓存文件,所以我们在项目的application.properties里面添加一行:

# http 缓存过期时间
spring.resources.cachePeriod=31536000

没错,就是这么简单,Spring Boot能让你少写很多代码,其余方式可以参阅参考资料6,都是比较复杂的

4. CDN实践

    配置好服务器以后,接着就是阿里云上面的CDN配置,这里我就不详细讨论了,可以参阅阿里云上面的教程,让我们来看一下效果:

  • 查看域名解析:我们可以看到www.cuteke.cn有CNAME记录,指向到了www.cuteke.cn.w.kunlunar.com

    cdn-cuteke-dig

  • CuteKe主页响应总时长:只有801ms,快吧23333

    cdn-cuteke-cache

  • 开启了Cache-Control

    cdn-cuteke-cache2

5. OSS刷新缓存的方法

    如果你上传到OSS的文件更新了以后,我们需要刷新一下缓存,在这里,我们以七牛云为例,有两种方式可以刷新缓存:

  1. 主动提交刷新缓存请求
  2. 通过携带随机URL参数刷新

具体步骤阅读参考资料7

6. 参考资料

[1] 阿里云-CDN使用场景文档
[2] 阿里云-CDN名词解释
[3] 变态的静态资源缓存与更新
[4] 浏览器与cdn缓存
[5] Spring Security官方文档Cache Control
[6] 深入 Spring 系列之静态资源处理
[7] 七牛云-刷新缓存的方法

猜你喜欢

转载自blog.csdn.net/u012397189/article/details/80559048