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

一、强缓存(Strong Cache)

1. 定义

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

• 由服务器通过响应头 Cache-ControlExpires 控制。

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-ModifiedETag 控制。

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-ModifiedETag

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)。

• 协商缓存可通过修改 ETagLast-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快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
jason成都4 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
SendTomo4 小时前
【技术交流】从0到1构建一个汉字学习平台:汉字吧(hanzi8.com)的技术架构猜想
redis·mysql·nginx·php·个人开发
小刘在重生~8 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Wang's Blog9 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
滨哥GPT11 小时前
Codex新增文件上传后为什么小文件正常,大文件总失败?Multipart、Body Limit与Nginx限制排查
nginx·ai编程·文件上传·codex·multipart
xixingzhe212 小时前
SpringBoot DDD 实战入门文档
spring boot·spring·ddd
爱敲代码的小杨.14 小时前
【Spring】Spring Web MVC
前端·spring·mvc
ly768914 小时前
Spring 中的 @Configuration 与 @Component 差异:为何代理时机决定 Bean 生命周期行为
java·后端·spring·注解·代理·bean生命周期
极小狐15 小时前
CI 流水线提速实战:缓存设计与依赖代理的工程实践
缓存·ci/cd·gitlab·devops
Wang's Blog15 小时前
Java框架快速入门: Spring Security+OAuth2之安全配置基础及函数式风格对比
java·安全·spring