深入浅出 -- 系统架构之负载均衡Nginx缓存机制

一、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可存储8000Key)。
      • inactive:设置缓存多长时间未被访问后删除(默认是十分钟)。
      • max_size:允许缓存的最大存储空间,超出后会基于LRU算法移除缓存,Nginx会创建一个Cache manager的进程移除数据,也可以通过purge方式。
      • manager_filesmanager进程每次移除缓存文件数量的上限。
      • manager_sleepmanager进程每次移除缓存文件的时间上限。
      • manager_thresholdmanager进程每次移除缓存后的间隔时间。
      • 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:请求命中了陈旧缓存。
    • REVALIDDATEDNginx验证陈旧缓存依然有效。
    • 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.hqwc.cn/news/599163.html

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

相关文章

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

GaN肖特基势垒二极管(SBD)的多阴极应用建模与参数提取

GaN Schottky Barrier Diode (SBD) Modeling and Parameter Extraction for Multicathode Application(TED 24年) 摘要 本文提出了一种适用于多阴极应用的紧凑型可扩展GaN肖特基二极管大信号模型。详细给出了外在和内在模型参数的可扩展规则。实验和理…

Tesseract 安装与配置及验证码识别

Tesseract 安装与配置 Tesseract 的使用,需要环境的支持,以实现简单的转换和训练。 1.环境 python版本:3.8.3 (python2.7或3以上) 操作系统:windows系统 2.Python安装 详见:Miniconda的…

ArcGIS Server 安装教程

​​​​​​​ 一、环境与文件准备 1.软件环境 已安装arcgis Desktop 10.2 2.安装及授权文件 二、安装步骤 1.下载安装包和授权文件,解压后打开ArcGIS Server10.2文件夹,打开ESRI.exe。 2.点击ArcGIS for Server后的Setup,开始安装。 3.…

【ArcGIS微课1000例】0108:ArcGIS计算归一化差值植被指数

本文讲解ArcGIS中,基于Landsat8数据的NDVI归一化差值植被指数计算。 文章目录 一、加载数据二、归一化植被指数NDVI1. NDVI介绍2. NDVI计算三、注意事项一、加载数据 加载配套数据0108.rar中的Landsat8的8个单波段数据,如下所示: Landsat8波段信息对照表如下表所示: 接下来…

Spring Security——09,解决跨域

解决跨域 一、SpringBoot配置二、配置SpringSecurity三、修改端口四、修改vue项目4.1 拿到token4.2 前端存储token4.3 前端请求头携带token 五、测试5.1 认证测试5.2 授权测试 一键三连有没有捏~~ 浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须…

SpriingBoot整合MongoDB多数据源

背景&#xff1a; MongoDB多数据源&#xff1a;springboot为3以上版本&#xff0c;spring-boot-starter-data-mongodb低版本MongoDBFactory已过时&#xff0c; 改为MongoDatabaseFactory。 1、pom引入&#xff1a; <dependency><groupId>org.springframework.boo…

Java常用API_正则表达式_检验字符串是否满足规则——基础使用方法及综合练习

正则表达式可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性。 简单举例&#xff1a; 校验一个qq号是否符合要求 要求&#xff1a;6位到20位之内&#xff0c;不能以0开头&#xff0c;必须全是数字 代码演示&#xff1a; public class Test1 {public…

报修小程序怎么建立?维修服务行业的智能化升级

在这个数字化飞速发展的时代&#xff0c;维修服务行业也在经历着前所未有的变革。消费者对于服务的期待不再局限于传统的电话预约或线下等待&#xff0c;而是希望能够通过更加智能、便捷的途径解决日常生活中的维修问题。在这样的背景下&#xff0c;报修小程序应运而生&#xf…

Redis客户端

2.Redis客户端 安装完成Redis&#xff0c;我们就可以操作Redis&#xff0c;实现数据的CRUD了。这需要用到Redis客户端&#xff0c;包括&#xff1a; 命令行客户端图形化桌面客户端编程客户端 2.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1a;redis-…

神经网络中的超参数调整

背景 在深度神经网络学习和优化中&#xff0c;超参数调整一项必备技能&#xff0c;通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态&#xff0c;及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数&#x…

Dapr(三) Dapr核心组件的使用一

结合前两期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 下篇推出dapr服务注册与发现&#xff0c;dapr组件绑定&#xff0c;dapr Actor功能。 目录 1.…