【NGINX--4】大规模可扩展的内容缓存

1、缓存区

缓存内容并定义缓存的存储位置。

使用 proxy_cache_path 指令定义共享内存缓存区和内容的位置:

proxy_cache_path /var/nginx/cachekeys_zone=CACHE:60m levels=1:2inactive=3h max_size=20g;
proxy_cache CACHE;

上述缓存定义示例在文件系统 /var/nginx/cache 中为缓存响应创建了一个目录,以及一个名为 CACHE、大小为 60M 的共享内存空间。此示例设置了目录结构级别,定义了如果缓存响应在 3 小时内未被请求就被释放,同时定义了最大缓存大小为 20GB。proxy_cache 指令通知特定上下文使用缓存区。proxy_cache_path 在 http 上下文中有效,proxy_cache 指令在 http、server 和 location 上下文中有效。
详解
要在 NGINX 中配置缓存,就必须声明要使用的路径和区域。您可以使用 proxy_cache_path 指令创建 NGINX 中的缓存区。proxy_cache_path 指定了存储缓存信息的位置,以及存储活动键和响应元数据的共享内存空间。该指令的可选参数对维护和访问缓存的方式提供了更多控制。levels 参数定义了文件结构的创建方式。该值用冒号分隔,声明了子目录名称的长度,最多支持三个级别。NGINX 缓存以缓存键(一个哈希值)为基础,它将结果存储在提供的文件结构中,使用缓存键作为文件路径并根据levels 值分解目录。inactive 参数能够控制缓存项在最后一次使用后驻留的时间长度。您也可以使用 max_size 参数配置缓存的大小。其他参数与缓存加载进程有关,这个进
程可以将缓存键从磁盘的缓存文件加载到共享内存

2、缓存锁定

您不希望 NGINX 将当前正在写入缓存的请求代理到上游(upstream)服务器。

使用 proxy_cache_lock 指令确保一次只能将一个请求写入缓存,随后的请求将等待响应被写入:

proxy_cache_lock on; 
proxy_cache_lock_age 10s; 
proxy_cache_lock_timeout 3s;

详解
proxy_cache_lock 指令指示 NGINX 保存当前正在填充的请求,这些请求最终将成为被缓存的元素。根据 proxy_cache_lock_age 指令的定义,代理请求填充缓存的时间是有限制的,默认为 5 秒,此后才允许另一个请求填充元素。NGINX 还允许将已经等待指定时间(同样默认为 5 秒)的请求传递到代理服务器,该请求不会尝试通过使用 proxy_cache_lock_timeout 指令来填充缓存。您可以将 proxy_cache_lock_age 理解成“你花的时间太长了,我来为你填充缓存”,将 proxy_cache_lock_timeout 理解成“你让我等的时间太长了,你先慢慢填充,我去干点别的”。

3、缓存哈希键

控制内容的缓存和检索方式。

使用 proxy_cache_key 指令和变量定义缓存的命中或未命中:

proxy_cache_key "$host$request_uri $cookie_user";

上述缓存哈希键将根据被请求的主机和 URI、定义用户的 cookie 指示 NGINX 缓存页面。这样您就可以缓存动态页面,而且不用提供为其他用户生成的内容。
详解
proxy_cache_key 的默认配置是“ s c h e m e scheme schemeproxy_host$request_uri”,该配置适用于大多数用例。使用的变量包括 scheme、HTTP 或 HTTPS、proxy_host(发送请求)以及请求 URI。总之,这反映了 NGINX 将请求代理到哪个 URL。您可能会发现,还有许多其他因素定义了每个应用的唯一请求,比如请求参数、请求头、会话标识符等等,您希望为这些因素创建自己的哈希键。

NGINX 提供了这些变量的列表

选择一个好的哈希键非常重要,其中离不开对应用的了解。为静态内容选择缓存键通常非常简单,只需使用主机名和 URI 便可。但如果是为相当动态的内容(例如仪表盘应用的页面)选择缓存键,就要求对用户与应用的交互方式以及用户体验之间的差异程度有着更深刻的认识。出于安全考虑,您可能不希望在没有完全了解上下文的情况下就将用户的缓存数据展示给其他用户。proxy_cache_key 指令将字符串配置为缓存键的哈希值,该指令可以在 http、server 和 location 代码块中进行设置,从而灵活控制请求的缓存方式。

4、绕过缓存

绕过缓存。

使用具有非空或非零值的 proxy_cache_bypass 指令。动态执行此操作的一种方法是,在您不希望进行缓存的 location 代码块内,使用一组字符串不能为空或为 0 的变量:

proxy_cache_bypass $http_cache_bypass;

该配置指示 NGINX,如果名为 cache_bypass 的 HTTP 请求头的值不是 0,则绕过缓存。本例使用请求头作为变量来确定是否应该绕过缓存 —— 客户端需要专门为其请求设置此请求头。
详解
我们有很多使用场景都不要求缓存请求。为此,NGINX 提供了 proxy_cache_bypass 指令。这样,当值设置为非空或非零时,请求将被发送到上游(upstream)服务器,而不是从缓存中拉取。绕过缓存的不同需求和场景将由您的应用的用例来决定。绕过缓存可以简单到只需使用请求头或响应头就能搞定,也会复杂到协同配合多个 map 代码块来解决。

绕过缓存的原因有很多,比如为了故障排除或调试。如果您总是拉取缓存的页面,或者您的缓存键只是针对一个用户标识符的,那么复盘问题可能会很难。因此,具备绕过缓存的能力十分重要。绕过缓存的方法有很多,包括但不限于设置特定的 cookie、请求头或请求参数时等。您还可以通过设置 proxy_cache off;,彻底关闭给定上下文(例如 location 代码块)的缓存功能。

5、缓存性能

通过在客户端缓存内容来提高性能。

使用客户端的 cache-control HTTP 请求头:

location ~* \.(css|js)$ { expires 1y;add_header Cache-Control "public";
}

这个 location 代码块指定客户端可以缓存 CSS 和 JavaScript 文件的内容。expires 指令指示客户端将缓存资源的有效期设置为一年。add_header 指令将 HTTP 响应头Cache-Control 添加到响应中,值为 public,允许沿途的所有缓存服务器缓存资源。如果将值设置为 private,则只允许客户端缓存资源。
详解
缓存性能有许多影响因素,其中磁盘速度最为重要。NGINX 配置中有很多指令可以帮助提升缓存性能。其中一种方法是设置 HTTP 响应头,让客户端只缓存响应但是不向NGINX 发送请求,这样只需读取缓存便可。

6、NGINX Plus 之缓存清除

使缓存中的对象变得无效。

使用 proxy_cache_purge 指令(NGINX Plus 的清除功能)以及非空或零值变量:

map $request_method $purge_method { PURGE 1;default 0;
}
server {# ...location / {# ...proxy_cache_purge $purge_method;}
}

在此示例中,如果使用 PURGE 方法请求特定对象,那么它的缓存将被清除。以下是使用 curl 清除名为 main.js 的文件缓存的示例:

$ curl -XPURGE localhost/main.js

详解
处理静态文件的一种常见方法是将文件的哈希放在文件名中。当您推出新的代码和内容时,这可以确保您的 CDN 将其识别为新文件(因为 URI 已更改)。但是,对设置了不适合此模型的缓存键的动态内容来说,这种方法并不好用。在每种缓存场景中,您都必须有一种对应的清除缓存的方法。NGINX Plus 的处理方法很简单,只要将 proxy_cache_purge 指令的值设置为非零或非空,与请求匹配的缓存项就被会清除掉。此外还有一种简便方法,那就是为 PURGE 映射请求方法。但是您可能需要配合使用 geo_ip 模块或简单的身份验证方法,以确保不是任何人都能清除您宝贵的缓存项。NGINX 还允许使用 * 来清除与常见 URI 前缀相匹配的缓存项。要使用通配符,您需要使用
purger=on 参数配置 proxy_cache_path 指令。

7、缓存切片

需要通过将文件分段来提高缓存效率。

使用 NGINX slice 指令及其嵌入式变量将缓存结果分段:

proxy_cache_path /tmp/mycache keys_zone=mycache:10m; 
server {# ...proxy_cache mycache;slice 1m;proxy_cache_key $host$uri$is_args$args$slice_range;proxy_set_header Range $slice_range; proxy_http_version 1.1;proxy_cache_valid 200 206 1h;location / {proxy_pass http://origin:80;}
}

详解
此配置为服务器定义并启用了一个缓存区。slice 指令指示 NGINX 将响应分成 1MB 的文件段。缓存文件根据 proxy_cache_key 指令进行存储。请注意,该指令使用了一个名为 slice_range 的嵌入式变量。向源端发送请求时也使用了同一变量作为请求头,并且该请求的 HTTP 版本已升级到 HTTP/1.1,因为 1.0 不支持字节范围的请求。200 或206 响应码的缓存有效期设为 1 个小时,然后定义位置和源端。

Cache Slice 模块是为了交付 HTML5 视频开发的,它使用字节范围的请求将伪流内容传输到浏览器。默认情况下,NGINX 能够从缓存中提供字节范围的请求。如果对未缓存的内容发出了一个字节范围的请求,NGINX 将向源端请求整个文件。当您使用Cache Slice 模块时,NGINX 仅向源端请求必要的文件段。如果请求范围大于切片大小(包括整个文件),就会触发对每个所需文件段的子请求,并对这些文件段进行缓存处理。当所有文件段都被缓存后,系统将组合响应并将它们发送给客户端,这使得NGINX 能够更有效地缓存并提供请求的范围内的内容。

Cache Slice 模块只能用于不会进行更改的大文件。NGINX 每接收一个来自源端的文件段,就验证一次 ETag。如果源端的 ETag 发生了变化,那么由于缓存不再有效,NGINX 就会中止这个段的缓存填充。如果内容确实发生了变化,文件也变小了,或者如果源端可以处理缓存填充过程中的负载峰值,那么最好使用下面“其他参考资料”所列博客中描述的 Cache Lock 模块。默认情况下不创建该模块,您需要在构建 NGINX 时使用 --with-http_slice_module 配置来启用。

参考资料
“使用 NGINX 和 NGINX Plus 智能高效地进行字节范围的缓存”

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

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

相关文章

为什么要用多线程?

提高响应速度:对于耗时操作,使用多线程可以使得应用程序更快地响应用户的请求,从而提高用户体验。实现并行计算:多线程可以同时执行多个任务,从而实现并行计算,提高程序的运行效率。提高CPU利用率&#xff…

html属性值可以不用引号吗,实例验证

html属性值可以不用引号 HTML元素的属性值可以不适用引号来包裹,浏览器一样可以将其进行渲染。不过,如果这样写HTML的代码的话,属性与属性值之间需要用空格来进行隔开,避免后面的属性变成前面属性的属性值。 提示:虽…

达梦列式存储和clickhouse基准测试

要验证达梦BigTable和ClickHouse的性能差异,您需要进行一系列基准测试。基准测试通常包括多个步骤,如准备测试环境、设计测试案例、执行测试、收集数据和分析结果。以下是您可以遵循的一般步骤: 准备测试环境: 确保两个数据库系统…

sql手工注入漏洞测试(MYSQL)-墨者-url信息

背景: 自己在墨者官网靶场练习的时候,一直出错,手工容易出错,所以列举一些信息供大家核对,可以参考改动。 数据库版本version() 5.7.22-0ubuntu0.16.04.1 当前数据库名称database() m…

模拟量采集----测量输入的电流

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电流信号 通过欧姆定律可知 电流测量的测量:是将电流加载在固定阻值的电阻上,来测量这个电阻二端的电压 最后反算出电流的大小 所用的公式是IU/R 我们使用仿真软件来看测量…

神经网络中间层特征图可视化(输入为音频)(二)

相比方法一个人感觉这种方法更好 import librosa import numpy as np import utils import torch import matplotlib.pyplot as pltclass Hook:def __init__(self):self.features Nonedef hook_fn(self, module, input, output):self.features output# 创建钩子的实例 hook …

EasyExcel listener无法通过Autowired注入xxMapper

easyexcel listener无法通过Autowired注入xxMapper 文章目录 easyexcel listener无法通过Autowired注入xxMapperbug记录:解决方案:easyexcel 使用例子controllerServiceImpllistener bug记录: productMapper注入一直为null,而procureDetailM…

Visual Studio(VS) C++程序LNK2005错误,提示“error LNK2005: _XXX已经在xxx.obj中定义”解决方案

1.问题如图 2.出现原因 项目中有多个源文件或头文件,include后导致有些变量重复定义,加上Visual Studio新版版要求更严格 3.解决办法 查询到的解决办法很多不好用,此处记录解决自己问题的一个办法:直接让编译器忽略第二次定义的…

图形数据库的实战应用:如何在 Neo4j 中有效管理复杂关系

关系数据库管理系统( RDBMS ) 代表了最先进的技术,这在一定程度上要归功于其由周边技术、工具和广泛的专业技能组成的完善的生态系统。 在这个涵盖信息技术(IT) 和运营技术(OT) 的技术革命时代,人们普遍认识到性能方面出现了重大挑战,特别是…

连续变量降维:主成分分析和因子分析

主成分分析(Principal Component Analysis,PCA)和因子分析(Factor Analysis)都是用于处理连续变量降维的统计方法,它们在数据分析和特征提取中经常被使用。尽管它们有一些相似之处,但它们的目标…

初识JVM(简单易懂),解开JVM神秘的面纱

目录 一、什么是JVM(Java虚拟机)? 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM(Java虚拟机)? 在Java的世界里,Java虚…

代码文档浏览器 Dash mac中文版软件特色

Dash mac是一个基于 Python 的 web 应用程序框架,它可以帮助开发者快速构建数据可视化应用。Dash 的工作原理是将 Python 代码转换成 HTML、CSS 和 JavaScript,从而在浏览器中呈现交互式的数据可视化界面。Dash 提供了一系列组件,包括图表、表…

如何将设置为静态IP的VMware虚拟机进行克隆以便可以复刻相应的环境

一定要关闭需要克隆的虚拟机右键要选择克隆的虚拟机,选择管理->克隆,进入克隆虚拟机向导 设定克隆出来的虚拟机名称以及位置,选择完成 克隆完成之后将会生成虚拟机,示例中生成的虚拟机为ubuntu-dev2 因为原本的虚拟机为静态ip的…

区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用

视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等,AI智能分析技术无处不在。在某些场景中,重点区域的人数统计与…

3:kotlin 逻辑控制(Control flow)

向其他语言一样,kotlin也有循环和逻辑控制 条件判断(Conditional expressions) kotlin使用if和when来进行条件判断 如果纠结选择if还是when,建议使用when,因为它更能提高程序的健壮性 if 普通写法 fun main() {val…

Java集合拓展01

1、List,Set,Map三者的区别 List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和…

EMG肌肉信号处理合集 (一)

本文归纳了常见的肌肉信号预处理流程,方便EMG信号的后续分析。使用pyemgpipeline库 来进行信号的处理。文中使用了 UC Irvine 数据库的下肢数据。 目录 1 使用wrappers 定义数据类,来进行后续的操作 2 肌电信号DC偏置去除 3 带通滤波器处理 4 对肌电…

SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 负载均衡

目录 一、LoadBalancer 负载均衡 1.1、前言 1.2、LoadBalancer 负载均衡底层实现原理 二、整合 OpenFeign LoadBalancer 2.1、所需依赖 2.2、具体实现 2.3、自定义负载均衡策略 一、LoadBalancer 负载均衡 1.1、前言 在 2020 年以前的 SpringCloud 采用 Ribbon 作为负载…

OOM问题排查+Jvm优化

OOM问题排查: 1、top命令:查看cpu和内存的使用情况。 2、jstat命令:查看YGC和FGC情况,一般都是老年代不够用。导致OOM 3、jmap命令: 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…

Linux用户名用户组命令

添加用户(为sam用户添加一个主目录/home/sam) useradd -d /home/sam -m sam新建一个用户gem,该用户的登录shell是/bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组 添加用户账号就是在/etc/passwd文件中为新用户添加一条记…