Nginx内容缓存

介绍

当启用缓存时,NGINX Plus将响应保存在磁盘缓存中,并使用它们来响应客户端,而不必每次都为同一内容代理请求。

启用响应缓存

要启用缓存,请在顶层的HTTP上下文中包含proxy_cache_path指令。第一个必须的参数是缓存内容的本地文件系统路径,第二个必须的参数keys_zone用于定义存储有关缓存项目元数据的共享内存区域的名称和大小:

然后在要缓存服务器响应的上下文(协议类型,虚拟服务器或location)中包含proxy_cache指令,将由keys_zone参数定义的区域名称指定为proxy_cache_path指令(在本例中为 one):

请注意,由keys_zone参数定义的大小不会限制缓存的响应数据的总量。缓存响应本身存储在文件系统上的特定文件中的元数据副本。要限制缓存的响应数据量,请将max_size参数包含到proxy_cache_path指令中。 (但请注意,缓存数据的数量可能会临时超出此限制,如以下部分所述。)

涉及缓存的NGINX进程

缓存中还有两个额外的NGINX进程:

缓存管理器周期性地被激活以检查缓存的状态。如果缓存大小超过了由proxy_cache_path指令设置的max_size参数,缓存管理器将删除最近访问的数据。如前所述,高速缓存管理器激活之间的缓存数据量可以临时超过限制。

NGINX启动后,缓存加载程序只运行一次。它将先前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会在启动后的最初几分钟内消耗足够的资源来减慢NGINX的性能。为了避免这种情况,请通过将以下参数包含到proxy_cache_path伪指令来配置缓存的迭代加载:

loader_threshold - 迭代的持续时间,以毫秒为单位(默认为200) loader_files - 在一次迭代期间加载的最大项目数(默认为100) loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为50)

在以下示例中,迭代持续300毫秒或直到加载了200个项目:

指定要缓存的请求

默认情况下,NGINX Plus首次从代理服务器接收到这样的响应后,缓存对HTTP GET和HEAD方法的请求的所有响应。作为请求的密钥(标识符),NGINX Plus使用请求字符串。如果请求具有与缓存响应相同的密钥,则NGINX Plus将缓存的响应发送给客户端。您可以在http,server或location上下文中包含各种指令,以控制哪些响应被缓存。

要更改在计算密钥时使用的请求特性,请包含proxy_cache_key伪指令:

要定义在缓存响应之前必须进行具有相同密钥的请求的最小次数,请包含proxy_cache_min_uses指令:

要使用除GET和HEAD之外的方法来缓存对请求的响应,请将它们与GET和HEAD一起列为proxy_cache_methods伪指令的参数:

限制或绕过缓存

默认情况下,响应将无限期地保留在缓存中。只有缓存超过最大配置大小,然后按照最后一次请求的时间长度,它们才被删除。您可以通过在http,server的或location上下文中包含指令来设置缓存响应被认为有效的时间长度,甚至是否使用它们。

要限制缓存响应与特定状态代码被认为有效的时间,请包括proxy_cache_valid指令:

在此示例中,使用代码200或302的响应被认为是有效的10分钟,并且代码404的响应有效1分钟。要定义具有所有状态代码的响应的有效时间,请指定any作为第一个参数:

要定义NGINX Plus不会向客户端发送缓存响应的条件,请包含proxy_cache_bypass指令。每个参数定义一个条件并由多个变量组成。如果至少有一个参数不为空,并且不等于“0”(零),则NGINX Plus不会在缓存中查找响应,而是将请求立即转发到后端服务器。

要定义NGINX Plus根本没有缓存响应的条件,请包含proxy_no_cache指令,以与proxy_cache_bypass伪指令相同的方式定义参数。

从缓存中清除内容

NGINX可以从缓存中删除过期的缓存文件。这是删除过期的缓存内容以防止同时提供旧版本和新版本的网页的必要条件。在接收到包含自定义HTTP头或“PURGE”HTTP方法的特殊“清除”请求时,缓存被清除。

配置缓存清除

我们设置一个配置来标识使用“PURGE”HTTP方法的请求并删除匹配的URL。

  1. 在http级别上,创建一个新变量,例如$ purge_method,这将取决于$ request_method变量:
  1. 在配置高速缓存的location中,包含指定缓存清除请求的条件的proxy_cache_purge指令。在我们的例子中,它是在上一步配置的$ purge_method:

发送清除命令

配置proxy_cache_purge指令后,您需要发送一个特殊的缓存清除请求来清除缓存。您可以使用一系列工具发出清除请求,例如curl命令:

在该示例中,具有公共URL部分(由星号通配符指定)的资源将被删除。但是,这些高速缓存条目将不会从缓存中完全删除:它们将保留在磁盘上,直到它们被删除为非活动状态(proxy_cache_path的非活动参数),或由缓存清除程序进程处理,或客户端尝试访问它们。

限制访问清除命令

建议您配置允许发送缓存清除请求的有限数量的IP地址:

在这个例子中,NGINX检查请求中是否使用“PURGE”方法,如果是,分析客户端IP地址。如果IP地址被列入白名单,那么$ purge_method设置为$ purge_allowed:“1”允许清除,“0”表示清除。

从缓存中完全删除文件

要完全删除与星号相匹配的缓存文件,您将需要激活一个特殊的缓存清除程序,该过程将永久地遍历所有缓存条目,并删除与通配符相匹配的条目。在http级别上,将purger参数添加到proxy_cache_path指令中:

缓存清除配置示例

字节范围缓存

有时,初始缓存填充操作可能需要一些时间,特别是对于大文件。当第一个请求开始下载视频文件的一部分时,下一个请求将不得不等待整个文件被下载并放入高速缓存。

NGINX使缓存这样的范围请求成为可能,并逐渐用缓存片模块填充高速缓存。该文件分为较小的“切片”。每个范围请求选择将覆盖所请求范围的特定切片,并且如果此范围仍未缓存,请将其放入缓存中。对这些切片的所有其他请求将从缓存中获取响应。

要启用字节范围缓存:

确保您的NGINX是使用切片模块编译的。

使用slice指令指定切片的大小:

切片尺寸应适当调整,使切片快速下载。在处理请求时,太小的值可能会导致内存使用量过多和大量打开的文件描述符,太大的值可能会导致延迟。

将$ slice_range变量包含到缓存键中

启用使用206状态代码缓存响应:

通过在Range头域传递$ slice_range变量,将传递范围请求设置为代理服务器:

字节范围缓存示例:

请注意,如果切片缓存打开,则不应更改初始文件。

组合配置示例

以下示例配置组合了上述某些缓存选项。

在这个例子中,两个location使用相同的缓存,但是以不同的方式。

由于backend1服务器的响应很少更改,因此不包括缓存控制指令。首次请求响应缓存,并无限期保持有效。

相比之下,对backend2服务的请求的响应频繁变化,因此它们被认为只有1分钟有效,并且在相同请求3次之前不被缓存。此外,如果请求符合proxy_cache_bypass指令定义的条件,则NGINX Plus会立即将请求传递给后端2,而不在缓存中查找。

本文分享自微信公众号 - IT技术精选文摘(ITHK01),作者:Bill译

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 缓存在分布式系统中的应用

    缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 一、缓存概述 缓存是分布式系统中的重要组件,主要...

    用户1263954
  • 从Java视角理解系统结构(三)伪共享

    从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实...

    用户1263954
  • 浏览器缓存机制剖析

    这是判断是否启用缓存的第一步。如果浏览器通过某些条件(条件之后再说)判断出来,ok现在这个缓存没有过期可以用,那么连请求都不会发的,直接是启用之前浏览器缓存下来...

    用户1263954
  • Universal-Image-Loader源码分析,及常用的缓存策略

    讲到图片请求,主要涉及到网络请求,内存缓存,硬盘缓存等原理和4大引用的问题,概括起来主要有以下几个内容: 原理示意图     主体有三个,分别是UI,缓存模...

    xiangzhihong
  • 玩转EhCache之最简单的缓存框架

    Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cach...

    小程故事多
  • SpringBoot 笔记 ( 五 ):缓存

    lwen
  • 项目中缓存是如何使用的?为什么要用缓存?

    假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作 mysql,半天查出来一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了...

    IT技术小咖
  • linux下的缓存机制及清理buffer/cache/swap的方法梳理

    1)缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存...

    洗尽了浮华
  • Java内存缓存-通过Google Guava创建缓存

    Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。

    小码农薛尧

扫码关注云+社区

领取腾讯云代金券