Nginx缓存&优雅清除缓存

这篇具有很好参考价值的文章主要介绍了Nginx缓存&优雅清除缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Nginx缓存

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

Nginx缓存&优雅清除缓存

试想一下,如果用户主动清空了本地的浏览器缓存,那么是不是请求的压力又来到了服务端,为此我们可以增加web缓存服务器,当用户本地缓存失效时,可以去web缓存服务器中获取数据,而不是直接将请求打到后端服务器。

Nginx就可以担当这样的角色。其作为一个高性能的web服务器,同时也可以是一个缓存服务器。其为我们提供了ngx_http_proxy_module模块,用来实现缓存功能。

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

🔔Tips:缓存的资源也不是一成不变的,因此缓存也需要有更新的机制。

因此,对于Nginx的缓存主要围绕以下几点展开:

  • 缓存文件存放在哪儿
  • 缓存的有效期
  • 如何指定哪些请求走缓存,哪些请求不缓存
  • 如何删除缓存

2.Nginx配置缓存

2.1 缓存文件存放在哪儿

  • proxy_cache:定义共享内存区域的名称。
  • proxy_cache_path:定义缓存的存储路径。

2.1.1 proxy_cache

作用域:http, server, location

语法:proxy_cache zone | off;

默认值:proxy_cache off;

  • zone:用于定义共享内存区域的名称。可以使用变量。此参数是proxy_cache_path 指令的基础。

  • off:表示禁用缓存。

2.1.2 proxy_cache_path

作用域:http

语法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];

该指令可以配置缓存的路径,并设置相关的参数。

  • path:设置缓存的路径。
  • levels:用于设置缓存的目录结构,例如levels=1:2,意味着生成两层目录。该参数与proxy_cache_key 指令有关,proxy_cache_key 的默认值为$scheme$proxy_host$request_uri,然后将获取到的值MD5加密,然后依次从末尾按照levels的设置取值来创建目录。
  • keys_zone:其中nameproxy_cache定义的值。size表示共享内存区域的大小。1M的内存可以存储大约8000个key。
  • inactive:指定缓存失效的时间,如果在该段时间内,缓存文件没被访问,缓存将被删除。
  • max_size:指定最大的缓存大小,当超出大小,会根据LRU算法,删除最近最少使用的数据。

2.2 缓存有效期

2.2.1 proxy_cache_valid

该指令可以设置不同响应码对应的缓存时间,超过时间缓存就会过期,但是不会删除缓存。

作用域:http, server, location

语法:proxy_cache_valid [code …] time;

前面我们在配置proxy_cache_path指令时,inactive参数可以指定一定时间内缓存未被访问就会被删除。而proxy_cache_valid指定的是缓存的过期时间,超过该时间缓存将会过期,但是不会被删除。

因此我们在配置的时候,一般inactive的值会大于proxy_cache_valid中的值,否则将会导致缓存还不过期就被删除了。

  • 不指定响应码,则只对200、301和302进行缓存。
proxy_cache_valid 10m;
  • 对指定响应码进行缓存。
proxy_cache_valid 200 301 10m;
  • 对任何响应码进行缓存。
proxy_cache_valid any 10m;

2.3 如何指定哪些请求走缓存,哪些请求不缓存

2.3.1 proxy_cache_bypass

该指令配置不走缓存响应的条件,如果条件命中,则不走缓存。可与proxy_no_cache配合使用。

作用域:http, server, location

语法:proxy_cache_bypass string …;

如果参数中的值至少有一个值不为空且不为"0",则不走缓存响应。

# 以$arg开头的参数表示url中的对应的参数。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

2.3.2 proxy_no_cache

该指令配置不缓存响应的条件,如果条件命中,则不缓存。可与proxy_cache_bypass配合使用。

作用域:http, server, location

语法:proxy_no_cache string …;

如果参数中的值至少有一个值不为空且不为"0",则不缓存响应。

# 以$arg开头的参数表示url中的对应的参数。
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

2.3.3 proxy_cache_min_uses

该指令设置某个请求达到指定次数后,才对其进行缓存。

作用域:http, server, location

语法:proxy_cache_min_uses number;

默认值:proxy_cache_min_uses 1;

2.4 综合案例

1)环境

Nginx缓存服务器:192.168.110.101

服务端:192.168.110.100

2)配置

Nginx缓存服务器配置:

$upstream_cache_status为缓存命中状态。状态值分别为MISSBYPASSEXPIREDSTALEUPDATINGREVALIDATEDHIT.

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,即未命中。

Nginx缓存&优雅清除缓存

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

Nginx缓存&优雅清除缓存

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

Nginx缓存&优雅清除缓存

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

Nginx缓存&优雅清除缓存

3.Nginx删除缓存

如果服务端的文件发生变化,那么也需要将文件同步到Nginx的缓存中去,因此我们需要对缓存进行删除。

  • 删除对应缓存目录:这种方式看上去简单粗暴,但是想要删除指定的缓存,则犹如大海捞针。
  • ngx_cache_purge:第三方模块,通过请求删除指定的缓存文件。

3.1 删除对应的缓存目录

rm -rf /home/stone/proxy_cache

3.2 ngx_cache_purge

我们可以借助第三方模块ngx_cache_purge来实现对指定缓存的删除。

下载地址:https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/heads/master.zip

作用域:location

语法:proxy_cache_purge keys_zone key;

  • 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实现负载均衡的全部内容,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。文章来源地址https://www.toymoban.com/news/detail-509102.html

到了这里,关于Nginx缓存&优雅清除缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【DB】Redis缓存优化策略之,缓存预热与缓存清除

    1、什么是缓存优化? 缓存是一种数据存储技术 ,用于存储经常访问的数据,以便在需要时快速获取。通过缓存数据,可以减少数据的访问时间和系统的负载,从而提高应用程序的性能。缓存可以应用在多个层次,例如CPU缓存、数据库缓存和Web缓存。 缓存优化 是指通过合理

    2024年01月17日
    浏览(40)
  • 前端清除页面缓存的方法

    1、meta方法,在head标签里添加代码 Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括pu

    2024年02月08日
    浏览(40)
  • Git清除缓存指南

    https://www.python100.com/html/21S0V7I1TJ7C.html 1、git clean 命令可以用来删除当前目录下没有被 Git 管理的文件,包括编译生成的文件、临时文件等不需要的文件,提高代码仓库的整洁性。 2、git clean 命令默认不会删除目录,只会删除文件。如果要删除目录,需要加上 -d 参数。 3、如果

    2024年02月12日
    浏览(50)
  • dockerfile清除缓存

            在使用Docker构建镜像时,Docker会根据Dockerfile中的指令逐步构建镜像,每一个指令都会生成一个中间镜像,这些中间镜像会被缓存起来,以便在后续构建过程中加快速度。然而,当我们修改了Dockerfile中的某一行指令时,Docker会从修改的指令开始重新构建,但之前的

    2024年01月19日
    浏览(32)
  • uniapp实现清除缓存

    一、页面加载时计算缓存大小(H5不支持) 二、点击清除缓存按钮调用清理缓存方法 三、清理缓存(并重新计算缓存大小)

    2024年01月21日
    浏览(32)
  • 如何清除Unity的缓存

    AI回答: 在Unity中,清除缓存可以解决一系列问题,从错误的资产导入到编译问题。以下是如何清除Unity缓存的几种方法: 1. **清除Asset Importer缓存**        在Unity的菜单栏中,选择 `Assets` `Reimport All`。这将迫使Unity重新导入所有的资源,从而清除与资源导入相关的所有缓存。

    2024年01月24日
    浏览(43)
  • Android WebView清除缓存

    一般在使用完成之后在onDestroy方法中进行处理: 很多时候在清理时候,如再次加载与cookie相关联的网页,会读取到cookie缓存,这时需要在应用程序退出或者当前页面退出进行清理: CookieSyncManager.createInstance(mContext);  CookieManager cookieManager = CookieManager.getInstance(); cookieManager.re

    2024年02月12日
    浏览(38)
  • AWS清除CloudFront缓存

    运行之前,提供AWS密钥

    2024年04月26日
    浏览(27)
  • git 清除账号密码缓存

    配置用户名和邮箱: git config --global user.name “username” git config --global user.email “useremail@qq.com” 清除配置中纪录的用户名和密码,下次提交代码时会让重新输入账号密码: git config --system --unset credential.helper 查看git配置信息 git config --list 执行命令之后,再次pull或push时会缓存

    2024年02月11日
    浏览(48)
  • iPhone备忘录清除缓存

    离剁手只有一张图,就是: 遇到问题就去找方法,找方法就要找问题源头,经过我不懈的努力,我终于找到了万恶之源——备忘录。 奇怪的是我的东西并不多,而且写图文总结的备忘录,一般都会放在iCloud上,前几日我一直是觉得自己的图片放得太多才导致如此,但狂删除

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包