一文详解Nginx的强缓存和协商缓存

 更新时间:2025年03月07日 15:56:47   作者:dashery  
这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、强缓存(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. 行为

浏览器首次请求资源时,服务器返回资源并附带 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 最佳实践

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 触发更新。

五、调试工具

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

  • 查看 200 (from disk cache)(强缓存)或 304 Not Modified(协商缓存)。
  • 检查请求头中的 Cache-ControlIf-Modified-SinceIf-None-Match

命令行工具:

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

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

到此这篇关于一文详解Nginx的强缓存和协商缓存的文章就介绍到这了,更多相关Nginx缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解 Nginx 301重定向的配置

    详解 Nginx 301重定向的配置

    这篇文章主要介绍了详解 Nginx 301重定向的配置的相关资料,需要的朋友可以参考下
    2017-03-03
  • Nginx服务启动和停止实现

    Nginx服务启动和停止实现

    使用Nginx的过程中,我们可能总是需要修改nginx配置文件,然后不停地启动或者停止nginx服务,本文就来介绍一下,感兴趣的可以了解一下
    2023-11-11
  • 使用Nginx反向代理实现多端口跳转的实战分享

    使用Nginx反向代理实现多端口跳转的实战分享

    在现代Web开发中,Nginx作为一款高性能的开源反向代理服务器,提供了强大的功能来管理网络流量和路由,本文将介绍如何利用 Nginx 的反向代理功能,以实现多端口跳转的效果,需要的朋友可以参考下
    2024-02-02
  • nginx添加nginx-sticky-module模块步骤的实现

    nginx添加nginx-sticky-module模块步骤的实现

    nginx-sticky-module模块是nginx实现负载均衡的一种方案,和ip_hash负载均衡算法会有区别的,本文主要介绍了nginx添加nginx-sticky-module模块步骤的实现,感兴趣的可以了解一下
    2023-08-08
  • Nginx强制跳转Https(Http访问跳转Https)

    Nginx强制跳转Https(Http访问跳转Https)

    这篇文章主要为大家介绍了Http访问强制跳转到Https的几种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 通过nginx实现方向代理过程图解

    通过nginx实现方向代理过程图解

    这篇文章主要介绍了通过nginx实现方向代理过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 详解Nginx Location配置

    详解Nginx Location配置

    本篇文章给大家分享了Nginx Location配置的相关步骤以及具体方法,有需要的朋友参考学习下。
    2018-05-05
  • 手把手教你利用Nginx搭建属于自己的服务器

    手把手教你利用Nginx搭建属于自己的服务器

    最近总是想搭建自己的网站,奈何皮夹里空空如也,服务器也租不起,更别说域名了,于是我就寻思能否自己搭建个服务器,还不要钱呢,本文就来手把手教你如何实现吧
    2023-08-08
  • 详解Nginx如何配置Web服务器的示例代码

    详解Nginx如何配置Web服务器的示例代码

    这篇文章主要介绍了详解 Nginx如何配置Web服务器的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Nginx中日志模块的应用和配置应用示例

    Nginx中日志模块的应用和配置应用示例

    Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于互联网领域,这篇文章主要介绍了Nginx中日志模块的应用和配置,下面通过一个简单的实例来演示Nginx日志模块的应用和配置,需要的朋友可以参考下
    2024-02-02

最新评论