首页 > 系统相关 >Nginx缓存入门实战(01)-深入实践ETag机制

Nginx缓存入门实战(01)-深入实践ETag机制

时间:2023-12-04 18:01:32浏览次数:40  
标签:01 浏览器 响应 max age Nginx 缓存 客户端 ETag

1 RFC7232 指纹

1.1 响应头部

ETag = entity-tag,仅对同一个URL下的比较有意义。

为啥需要这玩意?

因为 HTTP 协议本质就是个KV,K=URL,V=body。因为 URL 并没有变,但我的 V 是会变的!所以需要对 V 生成一个摘要!

1.2 请求头部

  • If-Match ="*" / 1#entity-tag。用于并发修改资源 (POST/PUT/DELETE) 时,防止误覆盖
  • If-None-Match ="*" / 1#entity-tag。用于过期缓存的更新

2 查看 etag

3 关闭 etag

定位NGINX配置文件:

/etc/nginx/nginx.conf

先看关闭前:

vim nginx.conf

改成

etag off;

重启 Nginx:

nginx -s reload

发现关闭后:

etag 消失了!

3.1 如果不使用Etag指纹,浏览器还会开启缓存吗?

Syntax: etag on | off;
Default:etag on;
Context:http, server, location

生成规则:

ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
						r->headers out.last modified time
           r->headers out.content_length_n)

image-20231204094558172

发现响应头里也没说缓存时间,为啥浏览器还给我们缓存了?

为什么要预估缓存时间?max-age (days)

"max-age"是HTTP响应头中的一个指令,控制客户端(例如浏览器)缓存页面的时间。值表示从接收到响应开始,客户端将在该时间段内将响应视为有效,并在此期间内不再发送请求到服务器。

  1. 单位:s。如,若响应头包含"Cache-Control: max-age=3600",则表示该响应在客户端缓存有效期为3600秒,即1h。
  2. 优先级:当同时存在"Expires"和"max-age"时,浏览器优先考虑"max-age",因为它提供相对时间,而"Expires"提供绝对时间
  3. 缓存控制:max-age指令可以单独使用,也可以与其他缓存控制指令结合使用,例如"public"、"private"、"no-cache"等。这些指令共同决定了响应在客户端和代理服务器中的缓存行为。
  4. 更新:一旦响应被缓存,客户端会在max-age过期之前认为响应有效,而不会向服务器发送请求。当max-age过期后,客户端会向服务器发送请求验证响应是否依然有效。

总之,"max-age"字段缓存时间代表了客户端缓存响应的有效期限,它是控制缓存行为的重要标头之一。

55%的请求没有携带max-age

也就是没有告诉客户端这个资源要不要缓存。很多内容不咋变,都应该被缓存,如图片,js css,但服务器配置这些有问题,没有考虑到带宽优化,用户体验提升,所以没有配置描述缓存过期时间的内容。所以浏览器就有默认缓存时间。

那浏览器如何预估时间?

常见的预估时间

RFC7234 推荐:(DownloadTime– LastModified)*10%

4 缓存过程

浏览器缓存大概示意图(非普世版本)

4.1 首次缓存

基于过期缓存提高网络效率

304 Not Modified

若服务器在响应中没有提供Etag标头,浏览器通常会依赖其他标头来确定内容是否可以缓存。例如,如果响应中包含了"Cache-Control"标头,并且指示可以缓存响应,那么即使没有Etag指纹,浏览器仍然可能会将响应缓存起来。

若响应中包含"Last-Modified"标头,浏览器也可以使用该信息来验证缓存是否仍然有效。

参考:

  • https://www.stevesouders.com/blog/2012/03/22/cache-them-if-you-can/
  • https://www.bilibili.com/video/BV1iK411T73K/?spm_id_from=333.337.search-card.all.click&vd_source=1223dd226a2750a42150cbd1cd3048e3

标签:01,浏览器,响应,max,age,Nginx,缓存,客户端,ETag
From: https://blog.51cto.com/JavaEdge/8680602

相关文章

  • Python中级-01-数据类型的内置方法
    本篇内容来源于:【1.0】Python中级之数据类型的内置方法-Chimengmeng-博客园(cnblogs.com)写的verygood,非常详细【一】数字类型【1】整数类型(int)(1)基本运算实现整数的加法运算。#int.__add__(other)num1=5num2=2result=num1.__add__(num2)print(......
  • CF1901 C Add, Divide and Floor 题解
    LinkCF1901CAdd,DivideandFloorQuestion给定一个长度为\(n\)的序列,每次操作你需要选择一个整数\(x\),并将所有\(a_i\)替换为\(\lfloor\frac{a_i+x}{2}\rfloor\)。求至少多少次操作后能将所有\(a_i\)变相同若最少次数小于等于\(n\),输出操作次数和每次操作所选......
  • django框架01
    纯手撸web框架"""web框架:将前端数据库整合到一起基于互联网传输的python代码web框架也可以简单的理解为是软件开发架构里面的'服务端'"""#1.搭建简易版本服务端socket模块#2.遵循HTTP协议四大特性/数据格式/响应状态码#3.基于不同的后缀响应不同的内容如何获取......
  • Nginx 流量管理配置
    1.介绍Nginx通过网络速率、连接和带宽限制控制流量。2.常用方式1)限制连接数:可以构成共享区保存连接指标,并使用limit_conn限制打开的连接数。limit_conn_zone$binary_remote_addrzone=perip:10m;#通过设置每个ip的共享空间limit_conn_zone$server_namezone=perserver:10......
  • 01.html
    1.HTML、XML、XHTML的区别HTML:超文本标记语言,是语法较为松散的、不严格的Web语言;XML:可扩展的标记语言,主要用于存储数据和结构,可扩展;XHTML:可扩展的超文本标记语言,基于XML,作用与HTML类似,但语法更严格。2.什么是HTML5以及和HTML的区别是什么概念HTML5是HTML的新标准,其主要......
  • Java_01
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--参数占位符#{}:执行SQL时,会将#{}占位符替换为?,将来自......
  • 01 装饰器的使用
    装饰器实现登录验证在一个web项目中,很多接口需要用户必须是登录状态,否则就应该跳转到登录页面,这个可以通过装饰器实现。在实现之前,我们必须弄清除两个问题装饰器执行先后的问题可以看到装饰器在函数被加载的时候就执行了,先执行的最下层的装饰器,再执行的上层的装饰器,这像什么......
  • Nginx 黑白名单
    Nginx做黑白名单机制,主要是通过allow、deny配置项来实现:allowxxx.xxx.xxx.xxx;#允许指定的IP访问,可以用于实现白名单。denyxxx.xxx.xxx.xxx;#禁止指定的IP访问,可以用于实现黑名单。要同时屏蔽/开放多个IP访问时,如果所有IP全部写在nginx.conf文件中定然是不显示的,这种方式比......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • 【2023-12-01 】连岳摘抄
    23:59 人若愿意的话,何不以悠悠之生,立一技之长,而贞静自守。                                                 ——里尔克你妹妹看起来时,并不会觉得自己麻烦。相反,她......