Nginx(缓存机制)

对于性能优化而言,缓存是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等,Nginx的缓存则属于代理缓存的一种。对于整个系统而言,加入缓存带来的优势额外明显:

  • 减少了再次向后端或文件服务器请求资源的带宽消耗。
  • 降低了下游服务器的访问压力,提升系统整体吞吐。
  • 缩短了响应时间,提升了加载速度,打开页面的速度更快。

那么在Nginx中,又该如何配置代理缓存呢?先来看看缓存相关的配置项:「proxy_cache_path」:代理缓存的路径。语法:

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

是的,你没有看错,就是这么长....,解释一下每个参数项的含义:

  • path:缓存的路径地址。
  • levels:缓存存储的层次结构,最多允许三层目录。
  • use_temp_path:是否使用临时目录。
  • keys_zone:指定一个共享内存空间来存储热点Key(1M可存储8000个Key)。
  • inactive:设置缓存多长时间未被访问后删除(默认是十分钟)。
  • max_size:允许缓存的最大存储空间,超出后会基于LRU算法移除缓存,Nginx会创建一个Cache manager的进程移除数据,也可以通过purge方式。
  • manager_files:manager进程每次移除缓存文件数量的上限。
  • manager_sleep:manager进程每次移除缓存文件的时间上限。
  • manager_threshold:manager进程每次移除缓存后的间隔时间。
  • loader_files:重启Nginx载入缓存时,每次加载的个数,默认100。
  • loader_sleep:每次载入时,允许的最大时间上限,默认200ms。
  • loader_threshold:一次载入后,停顿的时间间隔,默认50ms。
  • purger:是否开启purge方式移除数据。
  • purger_files:每次移除缓存文件时的数量。
  • purger_sleep:每次移除时,允许消耗的最大时间。
  • purger_threshold:每次移除完成后,停顿的间隔时间。

「proxy_cache」:开启或关闭代理缓存,开启时需要指定一个共享内存区域。语法:

proxy_cache zone | off;

zone为内存区域的名称,即上面中keys_zone设置的名称。「proxy_cache_key」:定义如何生成缓存的键。语法:

proxy_cache_key string;

string为生成Key的规则,如$scheme$proxy_host$request_uri「proxy_cache_valid」:缓存生效的状态码与过期时间。语法:

proxy_cache_valid [code ...] time;

code为状态码,time为有效时间,可以根据状态码设置不同的缓存时间。例如:proxy_cache_valid 200 302 30m;「proxy_cache_min_uses」:设置资源被请求多少次后被缓存。语法:

proxy_cache_min_uses number;

number为次数,默认为1。「proxy_cache_use_stale」:当后端出现异常时,是否允许Nginx返回缓存作为响应。语法:

proxy_cache_use_stale error;

error为错误类型,可配置timeout|invalid_header|updating|http_500...「proxy_cache_lock」:对于相同的请求,是否开启锁机制,只允许一个请求发往后端。语法:

proxy_cache_lock on | off;

「proxy_cache_lock_timeout」:配置锁超时机制,超出规定时间后会释放请求。

proxy_cache_lock_timeout time;

「proxy_cache_methods」:设置对于那些HTTP方法开启缓存。语法:

proxy_cache_methods method;

method为请求方法类型,如GET、HEAD等。「proxy_no_cache」:定义不存储缓存的条件,符合时不会保存。语法:

proxy_no_cache string...;

string为条件,例如$cookie_nocache $arg_nocache $arg_comment;「proxy_cache_bypass」:定义不读取缓存的条件,符合时不会从缓存中读取。语法:

proxy_cache_bypass string...;

和上面proxy_no_cache的配置方法类似。「add_header」:往响应头中添加字段信息。语法:

add_header fieldName fieldValue;

「$upstream_cache_status」:记录了缓存是否命中的信息,存在多种情况:

  • MISS:请求未命中缓存。
  • HIT:请求命中缓存。
  • EXPIRED:请求命中缓存但缓存已过期。
  • STALE:请求命中了陈旧缓存。
  • REVALIDDATED:Nginx验证陈旧缓存依然有效。
  • UPDATING:命中的缓存内容陈旧,但正在更新缓存。
  • BYPASS:响应结果是从原始服务器获取的。

❝PS:这个和之前的不同,之前的都是参数项,这个是一个Nginx内置变量。❞OK~,对于Nginx中的缓存配置项大概了解后,接着来配置一下Nginx代理缓存:

http{  # 设置缓存的目录,并且内存中缓存区名为hot_cache,大小为128m,  # 三天未被访问过的缓存自动清楚,磁盘中缓存的最大容量为2GB。  proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g;  server{  location / {  # 使用名为nginx_cache的缓存空间  proxy_cache hot_cache;  # 对于200、206、304、301、302状态码的数据缓存1天  proxy_cache_valid 200 206 304 301 302 1d;  # 对于其他状态的数据缓存30分钟  proxy_cache_valid any 30m;  # 定义生成缓存键的规则(请求的url+参数作为key)  proxy_cache_key $host$uri$is_args$args;  # 资源至少被重复访问三次后再加入缓存  proxy_cache_min_uses 3;  # 出现重复请求时,只让一个去后端读数据,其他的从缓存中读取  proxy_cache_lock on;  # 上面的锁超时时间为3s,超过3s未获取数据,其他请求直接去后端  proxy_cache_lock_timeout 3s;  # 对于请求参数或cookie中声明了不缓存的数据,不再加入缓存  proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  # 在响应头中添加一个缓存是否命中的状态(便于调试)  add_header Cache-status $upstream_cache_status;  }  }  
}  

接着来看一下效果,如下:

第一次访问时,因为还没有请求过资源,所以缓存中没有数据,因此没有命中缓存。第二、三次,依旧没有命中缓存,直至第四次时才显示命中,这是为什么呢?因为在前面的缓存配置中,我们配置了加入缓存的最低条件为:「「资源至少要被请求三次以上才会加入缓存。」」 这样可以避免很多无效缓存占用空间。

缓存清理

当缓存过多时,如果不及时清理会导致磁盘空间被“吃光”,因此我们需要一套完善的缓存清理机制去删除缓存,在之前的proxy_cache_path参数中有purger相关的选项,开启后可以帮我们自动清理缓存,但遗憾的是:**purger系列参数只有商业版的NginxPlus才能使用,因此需要付费才可使用。**不过天无绝人之路,我们可以通过强大的第三方模块ngx_cache_purge来替代,先来安装一下该插件:①首先去到Nginx的安装目录下,创建一个cache_purge目录:

[root@localhost]# mkdir cache_purge && cd cache_purge  

②通过wget指令从github上拉取安装包的压缩文件并解压:

[root@localhost]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz  
[root@localhost]# tar -xvzf 2.3.tar.gz  

③再次去到之前Nginx的解压目录下:

[root@localhost]# cd /soft/nginx/nginx1.21.6  

④重新构建一次Nginx,通过--add-module的指令添加刚刚的第三方模块:

[root@localhost]# ./configure --prefix=/soft/nginx/ --add-module=/soft/nginx/cache_purge/ngx_cache_purge-2.3/  

⑤重新根据刚刚构建的Nginx,再次编译一下,「但切记不要make install :

[root@localhost]# make  

⑥删除之前Nginx的启动文件,不放心的也可以移动到其他位置:

[root@localhost]# rm -rf /soft/nginx/sbin/nginx  

⑦从生成的objs目录中,重新复制一个Nginx的启动文件到原来的位置:

[root@localhost]# cp objs/nginx /soft/nginx/sbin/nginx  

至此,第三方缓存清除模块ngx_cache_purge就安装完成了,接下来稍微修改一下nginx.conf配置,再添加一条location规则:

location ~ /purge(/.*) {  # 配置可以执行清除操作的IP(线上可以配置成内网机器)  # allow 127.0.0.1; # 代表本机  allow all; # 代表允许任意IP清除缓存  proxy_cache_purge $host$1$is_args$args;  
}  

然后再重启Nginx,接下来即可通过http://xxx/purge/xx的方式清除缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis Desktop Manager for Mac:高效管理Redis数据的必备工具

Redis是一种快速、可扩展的内存数据库,被广泛应用于缓存、消息队列和实时分析等领域。而Redis Desktop Manager for Mac作为一款专为Mac用户设计的Redis桌面管理工具,为用户提供了高效便捷的方式来管理和操作Redis数据。 首先,Redis Desktop…

【已解决】xxljob连接报错HTTP 302(HTTP 401账号或密码错误)

目录 问题现象: 问题分析: 1、密码中的特殊字符。 2、密码长度问题。 解决方法: 拓展: 问题现象: 今天在生产环境使用xxljob任务调度来创建并执行任务时,出现了程序报错: 通过查询xxljob日志…

降本增笑?滴滴史上最严重服务故障,裁员真不能裁测试

2023 年 11 月 27 日晚间,滴滴因系统故障导致 App 服务异常,不显示定位且无法打车。11 月 27 日晚,滴滴出行进行了回复:非常抱歉,由于系统故障。 2023 年 11 月 28 日早间,滴滴出行消息称,网约…

Spring AOP 概念及其使用

目录 AOP概述 什么是AOP? 什么是Spring AOP ? Spring AOP 快速入门 1.引⼊ AOP 依赖 2.编写AOP程序 Spring AOP 核心概念 1.切点 2.连接点 3.通知 4.切面 通知类型 注意事项: PointCut(定义切点) 切面优先级 Order 切点表达…

Java中的Future源码讲解

JAVA Future源码解析 文章目录 JAVA Future源码解析前言一、传统异步实现的弊端二、what is Future ?2.1 Future的基本概念2.2Future 接口方法解析2.2.1 取消任务执行cancel2.2.2 检索任务是否被取消 isCancelled2.2.3 检索任务是否完成 isDone2.2.3 检索任务计算结果 get 三、…

Windows server 2019 域环境部署

环境准备 准备3台服务器,配置都是8g2核,50g硬盘,操作系统版本Windows Server 2019 Datacenter 域服务器:adc,192.168.56.120服务器1:server1:,192.168.56.121服务器2:server2&…

新媒体营销教学模拟实训平台解决方案

一、背景与目标 随着新媒体的快速发展,营销人才需求旺盛,而具备新媒体营销能力的人才供给却相对不足。为了解决这一矛盾,本方案旨在构建一个新媒体营销教学模拟实训平台,帮助学生掌握新媒体营销的实际操作技能,提高就…

windows彻底卸载VMware虚拟机

右键停止这些服务 在任务管理器中也结束vmware 在控制面板中卸载 找到注册表 然后在【software】目录下找到【VMware,Inc】,然后选中右键删除; 确保C盘中也没了

关于工业级交换机的分类,你知道多少?

工业级交换机是指专为工业控制领域设计的以太网交换设备。工业级交换机具备电信级的性能特征,能够在恶劣的工作环境下持久耐用。我们的产品系列非常广泛,可以灵活配置各种不同类型的端口,以满足工业领域的多样化使用需求。该产品具有宽温设计…

2023年文章生成器推荐

2023年即将结束,今年可以说是大语言模型独领风骚的一年,对于内容创作来说,文章生成类的工具也发生了变化。今天给大伙介绍一些超赞的免费文章生成器,让你在内容创作的路上事半功倍。有了这些神奇的工具,你将能够轻松应…

如何使用内网穿透工具实现公网访问GeoServe Web管理界面

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址6. 结语 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除…

多波束EM2040D甲板单元更换CPU主板记录

前段时间多波束EM2040D甲板单元的CPU主板到货了。趁着船刚好靠港避风,我们带着这块主板去替换之前借来EM2040C的CPU主板。 1、CF卡替换问题 老主板有个CF卡,见下图。最好的解决方法就是将老CF卡替换新CPU主板上的新CF卡,因为这样改动最小。…

AI大模型专题:北京市人工智能行业大模型创新应用白皮书

今天分享的是人工智能系列深度研究报告:《AI大模型专题:北京市人工智能行业大模型创新应用白皮书》。 (报告出品方:北京市科学技术委员会、中关村科技园区管理委员会) 报告共计:72页 海量/完整电子版/报…

TI radar_toolbox中的文档说明

分享ti雷达工具箱中的文档,如下图所示 其中software_guides中内容如下 using_uniflash_with_mmwave.html:使用Uniflash烧录bin文件using_ccs_debug.html:使用CCS连接EVM板进行debugUnderstanding_UART_Data_Output_Format.html:输…

CUDA简介——CUDA内存模式

1. 引言 前序博客: CUDA简介——基本概念CUDA简介——编程模式CUDA简介——For循环并行化CUDA简介——Grid和Block内Thread索引 CUDA内存模式,采用分层设计,是CUDA程序与正常C程序的最大不同之处: Thread-Memory Correspondenc…

《opencv实用探索·九》中值滤波简单理解

1、引言 均值滤波、方框滤波、高斯滤波,都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在。这时使用非线性滤波效果可能会更好。中值滤波是…

未势能源亮相中国燃料电池汽车大会,助力京津冀“氢能高速”

2023年12月1日,首届中国燃料电池汽车大会在大兴国际氢能示范区举办。大会由北京市经济和信息化局、北京市大兴区人民政府、中国汽车技术研究中心有限公司共同主办。中国科学技术协会主席万钢作主旨报告,国务院国资委副主任苟坪,中国科学院院士…

CO11N报工时,在填入返工数量后自动产生返工工单

本文档主要说明一种返工流程,当工人报工时,填写返工数量、变式原因即可启动触发点自动创建返工订单,被创建的反工订单为无料号生产订单,且关联报工订单。涉及系统功能点包括状态参数 一、 后台配置 1).用户状态参数:BS02(SPRO-生产-商店低价控制-主数据-订单-定义状态…

无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…