什么是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快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
Hello.Reader3 小时前
Redis 延迟监控深度指南
数据库·redis·缓存
DuelCode8 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
幽络源小助理8 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
Hello.Reader8 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
wfsm11 小时前
spring事件使用
java·后端·spring
Exclusive_Cat15 小时前
SpringMVC参数接收与数据返回详解
spring·mvc
dyj09516 小时前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
ChinaRainbowSea16 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
PanZonghui17 小时前
Centos项目部署之Nginx部署项目
linux·nginx
Hellc00718 小时前
Nginx 高级 CC 与 DDoS 防御策略指南
运维·nginx·ddos