Nginx静态资源缓存处理

1、概念理解

1、什么是缓存

缓存,原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但比较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。

2、什么是web缓存

web缓存是指一个web资源(如html页面、图片、js、数据等)存在于web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求,比较常见的就是浏览器会缓存访问过的网站网页,当再次访问这个URL地址的时候,如果网页没有更新,就不再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页

3、web缓存的种类

客户端缓存
		浏览器缓存
服务端缓存
	Nginx / Redis /Memcached 等

4、浏览器缓存

是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览

5、为什么要用浏览器缓存

成本最低的一种缓存实现
减少网络宽带消耗
降低服务器压力
减少网络延迟,加快页面打开速度

2、浏览器缓存的执行流程

HTTP协议中和页面缓存相关的字段,我们先来认识下:

header      说明
Expires     缓存过期的日期和时间
Cache-Control  设置和缓存相关的配置信息
Last-Modified  请求资源最后修改时间
ETag   请求变量的实体标签的当前值,比如文件的MD5值

如果缓存没有过期,直接从缓存中获取数据,展示给用户,这是强缓存
如果缓存过期,向服务器 发送请求 判断Etag 和 last-Modified都没变时,再次获取缓存,展示给用户,就是弱缓存
在这里插入图片描述
强缓存和弱缓存演示
第一次访问
在这里插入图片描述

响应头信息中有 ETag 和 Last-Modified
在这里插入图片描述

请求头信息
在这里插入图片描述
刷新再次访问 —————— 弱缓存
在这里插入图片描述
请求头信息
请求头信息 中多了 if-Modeified-Since 和 if-None-Match 分别发送的是 ETag 和 Last-Modified的值,让服务器判断对应的资源是否有发生变化,如果没有变化,那么直接返回304,取缓存
在这里插入图片描述
新 + 一个浏览器网页,复制粘贴网址 --------强缓存

结果如下 ,200是灰色的,也是缓存数据
在这里插入图片描述

3、浏览器缓存相关指令

Nginx需要进行缓存相关设置,就需要用到如下指令

3.1 expires 指令

expires : 该指令用来控制页面缓存的作用。可以通过该指令控制HTTP应答中的 ‘Expirs’ 和 ‘Cache-Control’

语法   expires [modified] time
       expires epoch | max | off;
默认值  expires off;
位置 http 、server、location

time: 可以整数 也可以是负数,指定过期时间,如果是负数Cache-Control则为no-cache,如果为no-cache时,不管有没有缓存此时都需要向服务器发送确认文件是否有发生变化,如果没有变化则走的是弱缓存,如果有变化那么就继续向服务器发送请求获取结果
如果为整数或0,则Cache-Control的值为max-age=time,time值为你指定的time值,max-age 的作用和Expires的作用是一样的。

epoch: 指定Expire的值为 '1 january,1970,00:00:01 GMT `(1970-01-01 00:00:00) Cache-Control的值为 no-cache

max: 指定Expires的值为 ‘31 December 2037 23:59:59GMT’ (2037-12-31 23:59:59), Cache-Control的值为10念

off: 默认不缓存

配置之前的响应头
在这里插入图片描述

配置缓存1000s
在这里插入图片描述

配置之后的响应头
在这里插入图片描述

3.2 add_header 指令

add_header 指令是用来添加指定的响应头和响应值。

语法  add_header  name  value[always]
默认值 -
位置 http、server、location

Cache-Control 作为响应头信息,可以设置如下值:

缓存响应指令

cache-control: must-revalidate
cache-control: no-cache
cache-control: no-store
cache-control: no-transform
cache-control: public
cache-control: private
cache-control: proxy-revalidate
cache-control: max-age=<seconds>
cache-control: s-maxage=<seconds>

指令      			说明
must-revalidate   可缓存但必须再向源服务器进行确认
no-cache   缓存前必须确认其有效性
no-store   不缓存请求或响应的任何内容
no-transform   代理不可更改媒体类型
public  可向任意方提供响应的缓存
private  仅向特定有户返回响应
proxy-revalidate  要求中间缓存服务器对缓存的响应有效性再进行确认
max-age=<>  响应最大Age值
s-maxage=<>  公共缓存服务器响应的最大Age值

示例配置如下:
在这里插入图片描述
加上add_header 后,每次访问不走缓存
在这里插入图片描述

### 使用 Nginx 进行静态资源缓存的最佳实践 #### 1. 配置缓存路径和容量 在 `http` 块中定义缓存存储的位置以及其参数。通过设置合理的缓存大小和失效时间,能够有效管理磁盘空间并优化性能。 ```nginx http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60d; } ``` 上述配置表示创建了一个名为 `my_cache` 的缓存区域,位于 `/data/nginx/cache` 目录下[^2]。其中: - `levels=1:2` 定义了两级子目录结构以分布文件。 - `keys_zone=my_cache:10m` 设置内存中的键值区大小为 10MB。 - `max_size=10g` 表示最大允许使用的磁盘空间为 10GB。 - `inactive=60d` 指定如果某个条目超过 60 天未被访问,则会被移除。 #### 2. 启用浏览器缓存控制 利用 HTTP 协议头字段(如 `Cache-Control`, `Expires` 和 ETag)来指导客户端如何处理已下载的内容。 ```nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 设定资源的有效期限为30天 add_header Cache-Control "public, must-revalidate"; } ``` 此段代码设置了常见静态文件类型的过期时间为 30 日,并标记它们可公开缓存[^4]。这有助于减少重复请求次数,加快页面加载速度。 #### 3. 版本化 URL 或文件名 为了避免因修改后的静态资源未能及时更新到用户的设备上而导致显示异常的情况发生,建议采用版本号或者哈希值附加于链接地址之后的方法实现强制刷新机制。 例如,在构建过程中可以通过 Webpack 插件等方式自动生成带有唯一标识符的新文件名称: ```javascript output: { filename: '[name].[contenthash].bundle.js', }, ``` 这样当任何一处源码发生变化时都会生成全新的输出文件,从而确保即使旧版仍处于缓存状态也不会影响新功能展现效果。 #### 4. 不缓存 HTML 文件 考虑到HTML文档可能经常变动且依赖实时数据呈现最新信息,因此通常推荐不对这类内容实施长期保存措施以免造成不必要的麻烦。 ```nginx location ~* \.html$ { add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate"; expires -1; } ``` 这里明确指示不要对 `.html` 类型的数据进行任何形式上的持久化保留操作。 --- ### 总结 综上所述,通过对Nginx适当调整相关选项即可达成高效稳定的静态资产分发目标。不仅提升了整体系统的吞吐量还降低了后端压力成本开销等问题得到缓解的同时也增强了最终用户体验质量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值