nginx配置浏览器缓存(强缓存、协商缓存、无缓存)

文章详细介绍了Nginx的下载安装过程,包括选择稳定版本,解压放置,以及如何启动Nginx。接着,重点讲解了Nginx的缓存管理,包括强缓存、协商缓存和无缓存的配置方法,涉及到Cache-Control、Expires、Last-Modified和ETag等关键HTTP头部字段的使用,强调了合理配置缓存对于优化性能的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🏆nginx下载安装及使用

💛nginx下载安装

下载地址:点击下载nginx
在这里插入图片描述
根据系统选择要下载的安装包,这里最好选择稳定版(stable version)。
下载好后解压该zip,将解压后的文件夹放在自己喜欢的目录下,我是放在J盘(自己分的磁盘)下。
在这里插入图片描述
进入J:\nginx-1.22.0目录,目录结构:
在这里插入图片描述
注:project目录是我自己创建的,用于存放打包之后的项目,本次我使用的hubuilderx创建的uniapp的H5项目,相关打包部署请参考:nginx部署uniapp的h5项目

💜nginx启动

进入J:\nginx-1.22.0目录,打开cmd输入以下命令启动nginx。

start nginx

命令运行时cmd窗口会闪一下,属于正常现象。也可以点击nginx.exe应用程序启动nginx。
nginx默认配置(J:\nginx-1.22.0\conf下的nginx.conf文件):
在这里插入图片描述
可以看到默认端口是80,默认ip是本地,打开浏览器输入 http://localhost:80/ 访问,出现以下页面代表nginx启动成功。
在这里插入图片描述
nginx其他常用命令:

// 查看帮助信息
nginx -h

// 查看nginx版本(小写v)
nginx -v

// 查看nginx版本及配置参数信息(大写V)
nginx -V

// 指定配置文件启动nginx(xxx表示配置文件路径)
start nginx -c xxx

// 测试配置文件是否正确(xxx表示配置文件路径)
nginx -t -c xxx

// 完整有序的停止nginx,保存相关信息
nginx -s quit

// 完整有序的停止nginx,保存相关信息
nginx -s stop

// 重启nginx
nginx -s reload

可自行运行命令看看。

🥇nginx配置缓存

🤎强缓存、协商缓存、无缓存区别

强缓存:浏览器不与服务端协商直接取浏览器缓存
协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源
无缓存:浏览器直接向服务器重新获取资源

三种缓存机制皆通过配置http头(add_header)Cache-Control来实现。强缓存还可以使用Expires字段实现。
Cache-Control字段枚举值:

描述
no-store禁止缓存(强缓存和协商缓存),客户端不存储任何值
no-cache禁止强缓存,需要重写验证(可以理解为 禁止强缓存,启用协商缓存)
private私有缓存,禁止中间人(比如CDN等代理缓存)
public共享缓存,允许中间人缓存
max-age资源可以被缓存的最大时间,单位:秒,是一个相对时间,优先级高于 Expires
s-maxage用于共享缓存,单位:秒,如果在其有效期内,不去访问CDN等。s-maxage会覆盖 max-age 和 Expires
must-revalidate缓存使用陈旧资源时,必需先验证状态

💜强缓存配置

Expires:response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存(http1.0的产物,现在一般用cache-control)。

它是一个时间戳,当客户端再次请求该资源的时候,会把客户端时间与该时间戳进行对比,如果大于该时间戳则已过期,否则直接使用该缓存资源。
但是,有个大问题,发送请求时是使用的客户端时间去对比。一是客户端和服务端时间可能快慢不一致,另一方面是客户端的时间是可以自行修改的(比如浏览器是跟随系统时间的,修改系统时间会影响到),所以不一定满足预期。

Cache-Control:cache-control使用max-age控制强缓存时间。当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

cache-control的优先级高于expires,expires是http1.0的产物,而cache-control是http1.1的产物,两者同时存在的时候expire会被cache-control的max-age覆盖,在不支持http1.1的情况下可能就需要expires来保持兼容。
修改nginx.conf文件:
在这里插入图片描述
重启nginx后,刷新项目页面,查看项目网络请求:
在这里插入图片描述
可以看到响应头带有max-age=300,代表设置成功,浏览器直接从内存和磁盘中取资源,五分钟后缓存失效。请谨慎使用强缓存。

🧡协商缓存配置

协商缓存主要依赖的响应头包括Last-ModifiedETag,需要和服务器交互,请求资源命中协商缓存后,返回的状态码为 304,所以304状态码不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。

Last-Modified:记录资源最后修改的时间。
ETag:基于资源的内容编码生成一串唯一的标识字符串, 只要内容不同, 就会生成不同的ETag。

Last-Modified有以下两个缺点:

🍗 只要编辑了,不管内容是否真的有改变,都会以这最后修改的时间作为判断依据,当成新资源返回,从而导致了没必要的请求相应,而这正是缓存本来的作用即避免没必要的请求。
🍖 时间的精确度只能到秒,如果在一秒内的修改是检测不到更新的,仍会告知浏览器使用旧的缓存。

ETag的出现就是为了解决last-modified的上述问题。
修改nginx.conf文件:
在这里插入图片描述

重启nginx后,刷新项目页面,查看项目网络请求:
在这里插入图片描述
此后每次刷新页面,都会与服务器确认资源是否更新,如果更新服务器则会返回新的资源,如果未更新则告诉浏览器启用缓存。

🤍无缓存配置

修改nginx.conf文件:
在这里插入图片描述

重启nginx后,刷新项目页面,查看项目网络请求:
在这里插入图片描述
每次刷新页面,请求状态码都是200,真正从服务器获取资源,绕开所有缓存,但会增加网络带宽消耗,影响项目性能,谨慎使用。

Nginx配置协商缓存主要是利用HTTP的304状态码来实现的。当客户端(比如浏览器)向服务器请求一个资源时,如果该资源在客户端本地缓存中存在且未过期,浏览器会附带上之前获取该资源时服务器返回的ETag(实体标签)或Last-Modified(最后修改时间)信息。服务器接收到这样的请求后,会检查ETag或Last-Modified信息,并与服务器端的资源进行比较,如果发现资源没有变化,则会返回304状态码,告知客户端可以使用本地缓存的资源,从而避免了不必要的数据传输,提高了性能。 在Nginx中,协商缓存配置通常包括两个主要指令:`etag` 和 `if_modified_since`。 1. `etag`:启用或禁用ETag,如果启用了ETag,Nginx会自动为响应生成ETag头。 示例配置: ``` etag on; ``` 2. `if_modified_since`:用于设置Nginx如何处理`If-Modified-Since`请求头。默认情况下,Nginx会处理这些请求头,如果资源未修改则返回304响应。 示例配置: ``` if_modified_since exact; ``` 这里的`exact`表示完全根据`Last-Modified`时间来决定是否返回304响应。还可以设置为`off`来禁用该功能,或者`before`来使用客户端提供的值与服务器上的文件时间比较。 完整的Nginx配置示例可能如下: ``` server { listen 80; server_name example.com; root /path/to/your/webroot; etag on; if_modified_since exact; location / { try_files $uri $uri/ =404; } } ``` 在这个配置中,如果客户端发送了带有`If-None-Match`头的请求(携带ETag),Nginx会检查资源的ETag是否匹配;如果发送了带有`If-Modified-Since`头的请求(携带上次获取资源的时间),Nginx会根据资源是否被修改来返回相应的304响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值