透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

22 | 冷链周转:HTTP的缓存代理

Chrono 2019-07-17
第 20 讲中,我介绍了 HTTP 的缓存控制,第 21 讲我介绍了 HTTP 的代理服务。那么,把这两者结合起来就是这节课所要说的“缓存代理”,也就是支持缓存控制的代理服务。
之前谈到缓存时,主要讲了客户端(浏览器)上的缓存控制,它能够减少响应时间、节约带宽,提升客户端的用户体验。
但 HTTP 传输链路上,不只是客户端有缓存,服务器上的缓存也是非常有价值的,可以让请求不必走完整个后续处理流程,“就近”获得响应结果。
特别是对于那些“读多写少”的数据,例如突发热点新闻、爆款商品的详情页,一秒钟内可能有成千上万次的请求。即使仅仅缓存数秒钟,也能够把巨大的访问流量挡在外面,让 RPS(request per second)降低好几个数量级,减轻应用服务器的并发压力,对性能的改善是非常显著的。
HTTP 的服务器缓存功能主要由代理服务器来实现(即缓存代理),而源服务器系统内部虽然也经常有各种缓存(如 Memcache、Redis、Varnish 等),但与 HTTP 没有太多关系,所以这里暂且不说。

缓存代理服务

我还是沿用“生鲜速递 + 便利店”的比喻,看看缓存代理是怎么回事。
便利店作为超市的代理,生意非常红火,顾客和超市双方都对现状非常满意。但时间一长,超市发现还有进一步提升的空间,因为每次便利店接到顾客的请求后都要专车跑一趟超市,还是挺麻烦的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • 院长。
    老师您好,我想请问一下,为什么有的地方说cache-control默认是private(比如cache-control的百度百科),有的地方说默认是public(比如您这篇文章),是百度百科的是错误的吗?还是根据场景不同所以默认不同吗?

    作者回复: 我看了一下rfc,对于private和public没有明确的默认值说法,可能是我弄错了,需要再测试看看。

    2019-07-17
    6
  • 龙宝宝
    max-stale相当于延长了过期时间,min-fresh相当于缩短了过期时间,可以这样理解吗

    作者回复: 可以这么理解,也是一个很好的角度。

    2019-07-29
    4
  • 闫飞
    min-fresh的含义是距离过期时间必须不短于约定的时间,保证取到的是短期内不会过时的内容。

    但是这里有个风险是,万一服务器端因为某些原因重新刷新了资源(服务迁移等),那么怎么反向通知缓存服务器去清理资源呢?尤其是已经返回给客户端的之前标记为fresh的资源?

    作者回复: http协议里没有对此做出规定,一般的做法是由源站向代理发送pull请求,要求代理主动更新缓存。

    这个pull请求不属于http协议,具体实现就看两者之间的约定了。

    2019-07-18
    3
  • 徐海浪
    我们的做法是源服务器跟代理服务器联动,源服务器有文件变化(版本发布),触发更新代理服务器缓存。如果没有联动的机制,简单粗暴根据应用升级周期设置过期时间也可以,但这样会多做无用功。

    作者回复: 欢迎经验分享!

    2019-07-17
    1
    1
  • Geek_54edc1
    max-stale和min-fresh还是不太明白~~

    作者回复: max-stale是可以接受的过期时间,min-fresh是可以接受的新鲜时间。

    不好理解也没事,这两个属性用的不多,可以以后实际遇到了再体会。

    2019-07-17
    1
  • 居培波
    老师能结合nginx讲下缓存及代理吗?还是后面探索篇有讲。

    作者回复: 只要理解的http的缓存代理,nginx的是比较容易掌握的,可以结合nginx的文档,看proxy相关的指令,逐条对照http的功能。

    单纯讲nginx就有点太大了,讲不过来。

    2019-07-17
    1
  • 何用
    老师,CDN 服务是不是就是缓存代理的一种应用?还有文中图片的 X-Accel 是什么意思呢?

    作者回复: 1,是的。

    2. X-Accel是自定义字段,和x-powered-by差不多,意思是被谁加速。

    2019-07-17
    1
  • Flourishing
    1. 老师,我看那个完整的服务器端缓存控制策略图,在图上no-cache和must-revalidate两个一般只能存在一个吧?不能同时传递。
    2. 还有:“比较常用的一种做法是使用自定义请求方法“PURGE””,意思是自己在代码里面写个方法处理缓存的数据,对吧?

    作者回复:
    1.是的。

    2.没错,http允许自定义请求方法和处理逻辑。

    2019-12-10
  • Geek_49a9e9
    为啥我测试不出老师/22-1的那个response返回呢,我把www.chrono.com 换为我自己的域名 在/etc/host配置了,nginx也换了,没有返回X-Access等

    作者回复: 这个测试不需要做特别的修改,直接使用实验环境的配置就行。

    你可以用wireshark抓包看看,是否走的本地网络环境。

    2019-08-30
  • Geek_steven_wang
    服务器会根据客户端请求改变header值吗?客户端请求中要求must-revalidate 服务器之前策略是no-cache 这时服务器收到请求,response中是no-cache 还是must-revalidate?

    作者回复: must-revalidate是响应头里的属性,不会出现在请求头里,所以应该还是no-cache。

    2019-08-23
    1
  • Geek_steven_wang
    如果cache-control中没有 no-store no-cache must-revalidate这时浏览器会怎么处理?

    Max-stale min-fresh 那个优先级高,如果两个都有,那个生效?

    作者回复:
    1.没有这些就按普通的缓存策略来处理,在有效期内直接用,过期发条件请求。

    2.这两个属性本身就是冲突的,如果同时给出,那就由服务器自己决定策略了,rfc本身没有对此做出规定。

    2019-08-23
  • Geek_steven_wang
    1. 文中第一张图服务器缓存控制,其实是服务器根据缓存策略向response中插入各header的过程,缓存服务器,浏览器根据header处理缓存。

    2. 文中客户端缓存过程中,是浏览器根据自己的缓存策略,向服务器发请求时,设置各header。但这些策略浏览器怎么知道呢?是用户通过浏览器设置界面设置吗?还是ajax请求时设置?如果不是前后端分类的应用,怎么设置这些header?

    3. 既然服务器端有自己的缓存策略,那客户端请求上来时,服务器会根据客户端请求header调整策略吗?如果会,是应用服务器自己处理,还是程序员代码预先写好处理逻辑?

    4. 什么情况下客户端会有only-if-cached

    作者回复:
    1.正确。

    2.http客户端有很多种,浏览器只是其中之一,如果用Python、php自己写客户端,那就可以使用这些缓存策略。
    浏览器通常有一些最基本的策略,而ajax等就可以自己灵活设置。

    3.服务器控制资源和缓存,它会检查请求资源的有效期,与客户端的请求比对,返回304或者是新的内容,应用服务器和应用服务器都可以设置。

    4.only-if-cached这个我也没有见过具体的应用场景,但既然有这个属性,就应该是有用的。

    2019-08-22
    1
  • 笨笨
    还有这个例子【排骨上贴着标签“max-age=30, proxy-revalidate, no-transform”。因为缓存默认是 public 的,那么它在便利店和顾客的冰箱里就都可以存 30 天,过期后便利店必须去超市进新货,而且不能擅自把“大排”改成“小排”。】
    2019-08-17
  • 笨笨
    所以缓存协商一定是采取最小值是么?比如第一次请求一个资源,客户端请求头里max_age是
    3000ms,而服务端给的响应头的max_age是5000ms,那最终在4000ms之后,客户端再请求此资源,就还是会发送请求对么?(因为超过了最小值3000ms),如果此时第二次请求又是个基于时间的条件请求,那么这第二次请求是接收到304么?

    作者回复:
    1.max-age不能用在请求头里,只能在响应头里指定资源的有效期。

    2.在有效期内,如果不是刷新,就可以直接使用缓存。

    3.发送条件请求,如果在有效期内,就会收到304。

    2019-08-17
  • 一坛幽梦
    听老师的课程真是查缺补漏呀,之前一直迷迷糊糊的东西,全搞清楚了,太感谢老师了

    作者回复: thanks。

    2019-08-17
  • J.D.
    有一些细节上的想问下,就是文中在 max-age、no-store、no-cache这几个里有时不是用“-”,而是用了“_”。

    作者回复: 感谢指正,不小心写错了,应该都是“-”,我尽快改过来。

    2019-08-12
  •        鸟人
    请问时间换空间是什么呢?

    作者回复: 比如数据压缩,就是时间换空间,增加了计算时间,减少了数据量。

    2019-07-29
  • Leon📷
    proxy-revalidtae 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。是不是指由代理向源服务器验证缓存有效性,而不需要客户端亲自回源,不管怎么验证,都是要去源服务器的吧

    作者回复: 准确地说,proxy-revalidtae与must-revalidate的效果是相同的,但它只应用于public缓存。

    2019-07-21
    1
  • 一步
    老师请教一个有关302的问题,就是再前端代码中有个post请求,去请求后端服务器,当后端服务器处理完业务逻辑后,需要重定向到另一个网站,返回的是一个302的状态码和响应头Location是另一个网站地址。这时候问题出现了,当返回到前端的时候,浏览器没有自动跳转重定向后的地址,而是当作接口去请求了需要跳转后的地址,然后就出现了跨域的问题
    这个是什么原因呢?

    作者回复: 可以参考一下第18讲,改用303 see other。

    2019-07-17
  • WL
    请问一下老师头摘要Vary也是一个header字段吗?这个具体怎么用,以前写项目好像没有用到过

    作者回复: vary主要用在缓存,用来告诉缓存代理此报文依据的是哪些请求头字段。

    缓存代理收到带vary的响应报文后,就会根据vary里的字段提取请求头,计算hash,然后和缓存存在一起。

    当有新请求的时候就比较新请求的头字段hash与缓存的hash,一致就说明可以重用缓存。

    2019-07-17
收起评论
20
返回
顶部