161人参与 • 2025-03-05 • 缓存
前面我们知道nginx可以对浏览器缓存进行配置,让一些静态资源缓存到用户本地存储,以提高页面的响应速度,也能降低服务端的压力。
浏览器执行缓存的流程如下:

试想一下,如果用户主动清空了本地的浏览器缓存,那么是不是请求的压力又来到了服务端,为此我们可以增加web缓存服务器,当用户本地缓存失效时,可以去web缓存服务器中获取数据,而不是直接将请求打到后端服务器。
nginx就可以担当这样的角色。其作为一个高性能的web服务器,同时也可以是一个缓存服务器。其为我们提供了ngx_http_proxy_module模块,用来实现缓存功能。
官方文档:
https://nginx.org/en/docs/http/ngx_http_proxy_module.html
tips:缓存的资源也不是一成不变的,因此缓存也需要有更新的机制。
因此,对于nginx的缓存主要围绕以下几点展开:
proxy_cache:定义共享内存区域的名称。proxy_cache_path:定义缓存的存储路径。zone:用于定义共享内存区域的名称。可以使用变量。此参数是proxy_cache_path 指令的基础。off:表示禁用缓存。该指令可以配置缓存的路径,并设置相关的参数。
path:设置缓存的路径。levels:用于设置缓存的目录结构,例如levels=1:2,意味着生成两层目录。该参数与proxy_cache_key 指令有关,proxy_cache_key 的默认值为$scheme$proxy_host$request_uri,然后将获取到的值md5加密,然后依次从末尾按照levels的设置取值来创建目录。keys_zone:其中name为proxy_cache定义的值。size表示共享内存区域的大小。1m的内存可以存储大约8000个key。inactive:指定缓存失效的时间,如果在该段时间内,缓存文件没被访问,缓存将被删除。max_size:指定最大的缓存大小,当超出大小,会根据lru算法,删除最近最少使用的数据。该指令可以设置不同响应码对应的缓存时间,超过时间缓存就会过期,但是不会删除缓存。
前面我们在配置proxy_cache_path指令时,inactive参数可以指定一定时间内缓存未被访问就会被删除。而proxy_cache_valid指定的是缓存的过期时间,超过该时间缓存将会过期,但是不会被删除。
因此我们在配置的时候,一般inactive的值会大于proxy_cache_valid中的值,否则将会导致缓存还不过期就被删除了。
proxy_cache_valid 10m;
proxy_cache_valid 200 301 10m;
proxy_cache_valid any 10m;
该指令配置不走缓存响应的条件,如果条件命中,则不走缓存。可与proxy_no_cache配合使用。
如果参数中的值至少有一个值不为空且不为"0",则不走缓存响应。
# 以$arg开头的参数表示url中的对应的参数。 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
该指令配置不缓存响应的条件,如果条件命中,则不缓存。可与proxy_cache_bypass配合使用。
如果参数中的值至少有一个值不为空且不为"0",则不缓存响应。
# 以$arg开头的参数表示url中的对应的参数。 proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
该指令设置某个请求达到指定次数后,才对其进行缓存。
1)环境
2)配置
nginx缓存服务器配置:
$upstream_cache_status为缓存命中状态。状态值分别为miss、bypass、expired、stale、updating、revalidated、hit.
http {
# 缓存在10分钟之内未被访问即删除
proxy_cache_path /home/stone/proxy_cache levels=1:2 keys_zone=my_cache:10m inactive=10m max_size=10g;
server {
listen 80;
server_name localhost;
location /cache {
proxy_cache my_cache;
proxy_cache_key $uri$is_args$args;
# 缓存的有效期会10s
proxy_cache_valid any 10s;
proxy_cache_min_uses 1;
# 添加缓存命中状态,$upstream_cache_status
add_header nginx-cache $upstream_cache_status;
proxy_pass http://192.168.110.100;
}
}
}服务端配置:
同时在html文件夹下创建cache文件,并放入test.html文件。
http {
server {
listen 80;
server_name localhost;
location /cache {
root html;
}
}
}3)访问http://192.168.110.101/cache/test.html
第一次访问:缓存状态为miss,即未命中。

第二次访问:缓存状态为hit,即已命中缓存。

查看缓存文件夹,已经按照levels参数指定的规则生成目录结构,并缓存文件。

第三次访问:缓存状态为expired,缓存已过期,因为我们设置的10s过期。

如果服务端的文件发生变化,那么也需要将文件同步到nginx的缓存中去,因此我们需要对缓存进行删除。
删除对应缓存目录:这种方式看上去简单粗暴,但是想要删除指定的缓存,则犹如大海捞针。ngx_cache_purge:第三方模块,通过请求删除指定的缓存文件。rm -rf /home/stone/proxy_cache
我们可以借助第三方模块ngx_cache_purge来实现对指定缓存的删除。
下载地址:https://github.com/frickle/ngx_cache_purge/archive/refs/heads/master.zip
keys_zone:该参数为proxy_cache指令指定的值。key:该参数为proxy_cache_key指定的值。配置示例:
server {
listen 80;
server_name localhost;
location /cache {
proxy_cache my_cache;
# 设置proxy_cache_key
proxy_cache_key $uri$is_args$args;
proxy_cache_valid 200 302 10s;
# 添加缓存命中状态
add_header nginx-cache $upstream_cache_status;
proxy_pass http://192.168.110.100;
}
# 删除指定缓存
location ~/purge(/.*) {
proxy_cache_purge my_cache $1$is_args$args;
}
}1)访问http://192.168.110.101/cache/test.html,产生缓存。
2)访问http://192.168.110.101/purge/cache/test.html,如下图表示删除缓存成功。

以上就是nginx实现负载均衡的全部内容,nginx是多模块化的,还有很多高级功能,我们后面继续探索。
这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论