0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nginx中强缓存和协商缓存介绍

马哥Linux运维 来源:博客园dashery 2025-04-01 16:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、强缓存(Strong Cache)

1.定义

• 强缓存直接告诉浏览器:在缓存过期前,无需与服务器通信,直接使用本地缓存。
• 由服务器通过响应头Cache-ControlExpires控制。

2.响应头

Cache-Control: max-age=3600
表示资源在3600 秒(1小时)内有效(优先级高于Expires)。
Expires: Thu, 31 Dec 2030 2359 GMT
指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。

3.Nginx 配置示例

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

4.行为

• 浏览器首次请求资源时,服务器返回资源并附带缓存头。
• 后续请求时,浏览器直接读取本地缓存(状态码200 (from disk cache)),不发送请求到服务器

5.适用场景

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

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

1.定义

• 协商缓存要求浏览器每次向服务器验证缓存是否过期,若未过期则返回304 Not Modified,继续使用本地缓存。
• 由服务器通过响应头Last-ModifiedETag控制。

2.响应头

Last-Modified: Wed, 21 Oct 2023 0700 GMT
表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。
ETag: "5d8c72a5-264"
资源的唯一标识符(哈希值或版本号),精度更高。

3.Nginx 配置示例

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

4.行为

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

后续请求时,浏览器通过以下请求头验证缓存:
If-Modified-Since: [Last-Modified值]
向服务器询问资源是否在指定时间后修改过。
If-None-Match: [ETag值]
向服务器验证资源的ETag是否变化。

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

5.适用场景

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

三、关键区别

特性 强缓存 协商缓存
通信成本 无网络请求(直接读缓存) 需发送请求验证缓存
响应状态码 200 (from disk cache) 304 Not Modified
优先级 优先于协商缓存 强缓存过期后触发
适用资源 长期不变的静态资源 频繁更新的动态资源

四、Nginx 最佳实践

混合使用两种缓存

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

按文件类型区分策略

# 图片、字体等强缓存
location~* .(jpg|png|gif|woff2)${
 expires1y;
 add_headerCache-Control"public, max-age=31536000";
}

# HTML 文件禁用强缓存(总是协商)
location~* .html${
 add_headerCache-Control"no-cache, must-revalidate";
}

解决缓存更新问题
• 强缓存资源建议通过文件名哈希控制版本(如main.abcd1234.js)。
• 协商缓存可通过修改ETag或Last-Modified触发更新。

五、调试工具

浏览器开发者工具(Network 标签):
• 查看200 (from disk cache)(强缓存)或304 Not Modified(协商缓存)。
• 检查请求头中的Cache-Control、If-Modified-Since、If-None-Match。

命令行工具:

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

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

链接:https://www.cnblogs.com/ydswin/p/18757690

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 缓存
    +关注

    关注

    1

    文章

    248

    浏览量

    27642
  • 浏览器
    +关注

    关注

    1

    文章

    1042

    浏览量

    36908
  • nginx
    +关注

    关注

    0

    文章

    180

    浏览量

    12968

原文标题:什么是nginx的强缓存和协商缓存

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Nginx缓存配置详解

    Nginx 是一个功能强大的 Web 服务器和反向代理服务器,它可以用于实现静态内容的缓存缓存可以分为客户端缓存和服务端缓存
    的头像 发表于 05-07 14:03 1037次阅读
    <b class='flag-5'>Nginx</b><b class='flag-5'>缓存</b>配置详解

    什么是追踪缓存/转接卡?

    什么是追踪缓存/转接卡?  追踪缓存  在奔腾IV一级缓存,一般一级缓存的指令
    发表于 02-04 10:40 556次阅读

    内容中心网络基于缓存索引的缓存路由机制

    内容中心网络基于缓存索引的缓存路由机制_王好齐
    发表于 01-07 20:49 0次下载

    详解浏览器的缓存机制

    缓存一直是前端优化的主战场,利用好缓存就成功了一半。本篇从HTTP请求和响应的头域入手,让你对浏览器缓存有个整体的概念。最终你会发现缓存
    发表于 09-30 11:27 0次下载
    详解浏览器的<b class='flag-5'>缓存</b>机制

    Mybatis缓存之一级缓存

    本文主要讲mybatis的一级缓存,一级缓存是SqlSession级别的缓存。mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级
    发表于 11-27 20:44 1416次阅读
    Mybatis<b class='flag-5'>缓存</b>之一级<b class='flag-5'>缓存</b>

    渲染的帧缓存和深度缓存

    渲染涉及大量的缓存,这里缓存只是一个简单的存有像素数据的矩形内存块,最重要缓存是帧缓存和深度缓存
    的头像 发表于 05-14 11:44 7687次阅读
    渲染<b class='flag-5'>中</b>的帧<b class='flag-5'>缓存</b>和深度<b class='flag-5'>缓存</b>

    一文知道Nginx服务器的缓存原理和机制

    Nginx服务器的缓存原理,是在学习过程中比较重要的一个知识点,学习通透之后,对于自己的能力会有不小的提升——而且提升不只限于nginx一方面,技术理论一通百通,对于理解其他内容也会有很大帮助。
    的头像 发表于 10-05 09:01 2814次阅读
    一文知道<b class='flag-5'>Nginx</b>服务器的<b class='flag-5'>缓存</b>原理和机制

    什么是Web缓存,HTTP缓存和浏览器缓存的区别

    前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而浏览器
    发表于 09-13 04:17 1w次阅读
    什么是Web<b class='flag-5'>缓存</b>,HTTP<b class='flag-5'>缓存</b>和浏览器<b class='flag-5'>缓存</b>的区别

    缓存的基本原理 缓存的分类

    缓存的主要手段有:浏览器缓存、CDN、反向代理、本地缓存、分布式缓存、数据库缓存
    发表于 06-13 12:04 5346次阅读

    如何在SpringBoot解决Redis的缓存穿透等问题

    今天给大家介绍一下如何在SpringBoot解决Redis的缓存穿透、缓存击穿、缓存雪崩的问题。
    的头像 发表于 04-28 11:35 1152次阅读

    Caffeine教程缓存介绍

    缓存(Cache)在代码世界无处不在。从底层的CPU多级缓存,到客户端的页面缓存,处处都存在着缓存的身影。
    的头像 发表于 05-22 11:01 1522次阅读
    Caffeine教程<b class='flag-5'>缓存</b><b class='flag-5'>介绍</b>

    聊聊本地缓存和分布式缓存

    本地缓存 :应用缓存组件,缓存组件和应用在同一进程缓存的读写非常快,没有网络开销。但各应
    发表于 06-11 15:12 1219次阅读
    聊聊本地<b class='flag-5'>缓存</b>和分布式<b class='flag-5'>缓存</b>

    如何使用缓存

    缓存技术被认为是减轻服务器负载、降低网络拥塞、增强Web可扩展性的有效途径之一,其基本思想是利用客户访问的时间局部性(Temproral Locality)原理, 将客户访问过的内容在Cache
    的头像 发表于 10-08 14:07 1242次阅读

    Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透要点简析

    缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。
    的头像 发表于 12-25 09:41 1481次阅读
    Redis<b class='flag-5'>缓存</b>预热+<b class='flag-5'>缓存</b>雪崩+<b class='flag-5'>缓存</b>击穿+<b class='flag-5'>缓存</b>穿透要点简析

    缓存之美——如何选择合适的本地缓存

    Guava cache是Google开发的Guava工具包中一套完善的JVM本地缓存框架,底层实现的数据结构类似于ConcurrentHashMap,但是进行了更多的能力拓展,包括缓存过期时间设置、缓存容量设置、多种淘汰策略、
    的头像 发表于 11-17 14:24 1089次阅读
    <b class='flag-5'>缓存</b>之美——如何选择合适的本地<b class='flag-5'>缓存</b>?