什么是nginx的强缓存和协商缓存

devtools/2025/3/15 2:32:41/

一、强缓存(Strong Cache)

1. 定义

• 强缓存直接告诉浏览器:缓存过期前,无需与服务器通信,直接使用本地缓存

• 由服务器通过响应头 Cache-Control 和 Expires 控制。

2. 响应头

• Cache-Control: max-age=3600表示资源在 3600 秒(1小时) 内有效(优先级高于 Expires)。

• Expires: Thu, 31 Dec 2030 23:59:59 GMT指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。

3. Nginx 配置示例

location /static/ {# 设置强缓存:1年内有效add_header Cache-Control "public, max-age=31536000";expires 1y;
}

4. 行为

• 浏览器首次请求资源时,服务器返回资源并附带缓存头。

• 后续请求时,浏览器直接读取本地缓存(状态码 200 (from disk cache)),不发送请求到服务器

5. 适用场景

• 静态资源(如 CSS、JS、图片、字体文件)等长期不变的资源。


二、协商缓存(协商缓存,Weak Cache)

1. 定义

• 协商缓存要求浏览器 每次向服务器验证缓存是否过期,若未过期则返回 304 Not Modified,继续使用本地缓存

• 由服务器通过响应头 Last-Modified 和 ETag 控制。

2. 响应头

• Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。

• ETag: "5d8c72a5-264"资源的唯一标识符(哈希值或版本号),精度更高。

3. Nginx 配置示例

location /dynamic/ {# 启用协商缓存(默认已支持,无需显式配置)add_header Last-Modified "";etag on;
}

4. 行为

1、浏览器首次请求资源时,服务器返回资源并附带 Last-Modified 或 ETag

2、后续请求时,浏览器通过以下请求头验证缓存

• If-Modified-Since: [Last-Modified值]

向服务器询问资源是否在指定时间后修改过。

• If-None-Match: [ETag值]

向服务器验证资源的 ETag 是否变化。

3、若资源未修改,服务器返回 304 Not Modified,浏览器继续使用缓存;若已修改,返回新资源(状态码 200)。

5. 适用场景

• 频繁更新的资源(如 HTML 页面、动态 API 响应)。


三、关键区别

四、Nginx 最佳实践

1、混合使用两种缓存

location / {# 强缓存 1 小时,过期后启用协商缓存add_header Cache-Control "public, max-age=3600";etag on;
}

2、按文件类型区分策略

# 图片、字体等强缓存
location ~* \.(jpg|png|gif|woff2)$ {expires 1y;add_header Cache-Control "public, max-age=31536000";
}# HTML 文件禁用强缓存(总是协商)
location ~* \.html$ {add_header Cache-Control "no-cache, must-revalidate";
}

3、解决缓存更新问题

• 强缓存资源建议通过 文件名哈希 控制版本(如 main.abcd1234.js)。

• 协商缓存可通过修改 ETag 或 Last-Modified 触发更新。

五、调试工具

1、浏览器开发者工具(Network 标签):

• 查看 200 (from disk cache)(强缓存)或 304 Not Modified(协商缓存)。

• 检查请求头中的 Cache-ControlIf-Modified-SinceIf-None-Match

2、命令行工具:

curl -I http://example.com/resource.js

通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。

文章转载自:dashery

原文链接:什么是nginx的强缓存和协商缓存 - dashery - 博客园

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.ppmy.cn/devtools/167180.html

相关文章

Pygame实现记忆拼图游戏1

1 游戏介绍 记忆拼图游戏的英文名叫做“memory puzzle”,玩家通过记忆找到相同的图片,如图1所示。 图1 记忆拼图游戏 从图1中可以看出,玩家每次点击两张图片,如果这两个图片是相同的图案(包括颜色和形状)…

树莓科技(成都)集团:如何铸就第五代产业园标杆

树莓科技(成都)集团铸就第五代产业园标杆,主要体现在以下几个方面: 精准定位与前瞻布局 树莓科技并非盲目扩张,而是精准锚定数字经济发展方向。以成都为起点,迅速构建起全国性的园区版图,体现…

【软考网工-实践篇】DHCP 动态主机配置协议

一、DHCP简介 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议。 位置:DHCP常见运行于路由器上,作为DHCP服务器功能:用于自动分配IP地址及其他网络参数给网络中的设备作用:简化网络管理&…

【经验分享】SpringBoot集成Websocket开发 之 使用由 Jakarta EE 规范提供的 API开发

在 Spring Boot 中整合、使用 WebSocket WebSocket 是一种基于 TCP 协议的全双工通信协议,它允许客户端和服务器之间建立持久的、双向的通信连接。相比传统的 HTTP 请求 - 响应模式,WebSocket 提供了实时、低延迟的数据传输能力。通过 WebSocket&#x…

Pytorch中矩阵乘法使用及案例

六种矩阵乘法 torch中包含许多矩阵乘法,大致可以分为以下几种: *:即a * b 按位相乘,要求a和b的形状必须一致,支持广播操作 torch.matmul():最广泛的矩阵乘法 :与torch.matmul()效果一样&…

【eNSP基础使用教程-1】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改设备名称指令1、双击路由器进入2、 进入系统视图3、更改设备名称为R14、使用同样的办法修改路由器R2、R3 二、配置路由物理接口的IP 地址1、查看R1路由…

React:类组件(中)

dangerouslySetInnerHTML React写进{}内的东西,不允许被当作代码块解析,是为了防止xss攻击和代码注入 XSS(跨站脚本攻击,Cross-Site Scripting) 是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中&…

计算机二级web易错点(2)-选择题

HTML(HyperText Markup Language)即超文本标记语言,是专门为 Internet 文档设计的标记语言。 HTML 具有跨平台性,只要在安装了浏览器的设备上,无论设备使用的是什么操作系统,都可以运行 HTML 文档。 在 H…