Nginx缓存之代理缓存配置

news2025/1/21 18:46:50

        Nginx 的缓存功能是集成在代理模块中的,当启用缓存功能时,Nginx 将请求返回的响应数据持久化在服务器磁盘中,响应数据缓存的相关元数据、有效期及缓存内容等信息将被存储在定义的共享内存中。当收到客户端请求时,Nginx 会在共享内存中搜索缓存信息,并把查询到的缓存数据从磁盘中快速交换到操作系统的页面缓存(Page Cache)中,整个过程的速度非常快。
        Nginx 缓存会缓存加载进程(Cache Loader Process)和库存管理(Cade Manger Process)进行管理。缓存加载进程只在 Nginx 启动时执行一次,将上一次 Nginx 运行时缓存有关数据的元数据加载到共享内存区域,加载结束后它将自动退出。
        为了避免缓存因加载缓存降低 Nginx 的性能,缓存加载进程会采用周期性迭代式加载缓存数据,且迭代加载的时间间隔、每次最大消耗时间和每次迭代加载的数量可以由配置指令 proxy_cache_path 的指令值参数设置。缓存管理进程则周期性的检查缓存的状态,负责清除在一段时间内未被访问的缓存文件,并对超出缓存存储最大值的缓存对象进行删除,缓存管理进程的删除操作也是周期性迭代执行的,并由配置指令 proxy_cache_path 的指令值参数设置。

1.缓存处理流程及状态

        当客户端发起请求到 Nginx 缓存服务器时,Nginx 会先检查本地是否已经有该请求的内容缓存,有的话会直接返回数据,缓存请求状态会被标记为 HIT,否则该缓存请求状态就会被标记为 MISS。
        如果指令 proxy_cache_lock 未被启用,则会直接向源服务器发起访问请求,如果被启用,则会先确认当前请求是不是第一个发起的请求,若不是,则等待;若是,则向源服务器发起访问请求。服务器响应数据返回后会先被存储在本地缓存,然后再返回给客户端。缓存处理流程如下图所示。

        Nginx 在处理缓存过程中,客户端请求的缓存请求状态会被记录在变量 $upstream_cache_status 中,缓存请求状态如下表所示:

缓存请求状态状态说明
MISS缓存未命中,从源服务器获取响应数据
HIТ缓存命中,从本地缓存获取数据
BYPASSproxy_cache_bypass 生效,直接从源服务器获取响应数据
REVALIDATED启用 proxy_cache_revalidate 指令后,缓存将被源服务器服务端验证为有效状态,从本地缓存获取数据
EXPIRED缓存过期,从源服务器获取响应数据
UPDATING正在更新缓存,当前返回为旧缓存内容,在配置指令 proxy_cache_use_stale updating 时会存在该状态
STALE源服务器无法正常返回更新的内容,当前返回为旧缓存内容,在配置指令 proxy_cache_use_stale error timeout 时会存在该状态
SCARCE缓存节点被查询次数未达到配置指令 proxy_cache_min_uses 设定的值时,对此请求无法启用缓存机制,将从源服务器获取响应数据

2.缓存配置指令 

        Nginx 缓存配置指令如下表所示:

指令名称指令值格式默认值指令说明
proxy_storeon、off 或 stringoff设置是否将被代理服务器的响应数据在本地按照请求的 URL 建立目录结构镜像。当指令值为 on 时,存储路径的设置为 root 或 alias,响应数据先存储到临时文件后再复制或重命名保存
proxy_store_accessusers:permissions...user:rw设置创建本地镜像存储路径的文件夹权限
proxy_cachezone 或 offoff设置一个用以做缓存管理的共享内存区域
proxy_cache_pathpath 参数--设置缓存文件存储路径及参数。缓存数据以 URL 的 MD5 值命名存储在缓存目录中
proxy_cache_keystring$scheme
$proxy_host
$request_uri
设置缓存的关键字
proxy_cache_lockon 或 offoff是否启用缓存锁指令。当启用缓存锁机制时,每次只允许个向被代理服务器转发的请求,按照 proxy_cache_key 指令设置的标识增添新的缓存数据,其他相同的请求则将等待缓存中出现响应数据或该缓存锁被释放,其等待时间由 proxy_cache_lock_timeout 指令设置
proxy_cache_lock_agetime5s缓存锁有效时间。当启用缓存锁机制时,如果一个请求在该指令的时间内没有完成响应数据缓存的添加,缓存锁将会被释放,获取缓存锁的请求将被转发给被代理服务器由代理服务器负责生成缓存
proxy_cache_lock_timeouttime5s缓存锁等待超时时间。当启用缓存锁机制时,等待超过该时间的请求将直接从被代理服务器中读取响应,该请求响应不会被添加到缓存中
proxy_cache_max_range_offsetnumber--用以设置范围请求(byte-range)请求时的最大偏移量。超出该偏移量的请求将直接从被代理服务器中读取响应数据
proxy_cache_methodsGET 或 HEAD 或 POST...GET HEAD指定可被缓存的请求方法
proxy_cache_convert_headon 或 offon开启或禁用将请求方法 HEAD 转换为 GET,如果该功能被禁用,配置指令 proxy_cache_key 的指令值应该添加变量 $request_method
proxy_cache_min_usesnumberstring1响应数据超过设置请求次数后将被缓存
proxy_no_cachestring...--设置不生成缓存数据的条件,指定字符串的值不为空或不等于 0,则不将当前请求返回的响应数据进行缓存
proxy_cache_bypassstring...--设置不使用缓存数据的条件,指令值中至少有一个值不为空或不等于 0 时,当前请求不使用缓存中的响应数据,直接访问源应用服务器。它可以与 proxy_no_cache 指令一起使用
proxy_cache_revalidateon 或 offoff启用该指令后,如果缓存过期,则通过在 HTTP 头中添加字段属性 If-Modified-Since 和 If-None-Match 的方式发送给源服务器,从而进行缓存的服务端校验
proxy_cache_use_staleerror、timeout、
invalid_header、
updating、http_500、
http_503、http_403、
http_404、http_429、
off...
off当出现指定的条件时,使用已经过期的缓存响应数据
proxy_cache_background_updateon 或 offoff允许使用过期的响应数据时,设置是否启用后台子请求更新过期缓存,同时向客户端返回过期的缓存响应数据
proxy_cache_valid[code...] time--根据响应码设置缓存时间
proxy_cache_purgestring...--定义清除缓存请求条件,若指定的字符串不为空或 0,则将 proxy_cache_key 设置的标识的缓存进行清除。清除成功则返回状态码 204,仅商业版有效

关于上表有以下几点需要说明。

  • 该模块指令列表中指令的指令域范围都是 http、server、location;
  • proxy_cache_path 指令只能编写在 http 指令域中;
  • proxy_cache 与 proxy_store 指令不能在同一指令域中同时使用;
  • proxy_cache_path 指令值参数如下表所示。
参数名参数格式默认值参数说明
levelslevels--设置缓存目录的层级及命名方式
use_temp_pathon 或 offon参数值为 on,则使用 proxy_temp_path 设置作为临时文件目录。参数值为 off 时,则使用缓存目录做临时文件目录
keys_zonename:size--设置存储 cache_key 的共享内存 zone 及大小,1MB 可以存储 8000 个 key
inactivetime10 分钟设置时间内未被访问的缓存将被删除
max_sizesize--缓存数据的最大值,超出这个最大值时,缓存管理进程将执行迭代更新,即删除最近最少使用的缓存
manager_filesnumber100缓存管理进程执行一次迭代更新时,删除文件的最大数
manager_sleeptime50ms缓存管理进程每次更新缓存的迭代间隔时间
manager_thresholdtime200ms缓存管理进程执行一次迭代更新时,最大执行的时间,单位为 ms
loader_thresholdtime200ms缓存加载进程每次迭代加载时,加载数据的最大执行时间
loader_filesnumber100缓存加载进程每次迭代加载时,加载缓存目录中缓存数据的最大文件数
loader_sleeptime50ms缓存加载进程每次迭代的间隔时间
purgeron 或 offoff是否启用缓存清除功能。仅商业版有效
purger_filesnumber10每次迭代清除时,清除缓存目录中缓存数据的最大文件数。仅商业版有效
purger_sleeptime50ms连续两次迭代清除间的最少间隔时间。仅商业版有效
purger_thresholdtime50ms每次迭代清除时,最大执行的时间。仅商业版有效

3.HTTP 范围请求

        范围请求允许服务器只发送请求的一部分响应数据给客户端,通常对大文件传输时,用以实现断点续传、多线程下载等功能。若服务端响应信息头中包含字段 Accept-Ranges:bytes,则表示服务端支持范围请求,且节点范围的单位为字节(bytes)。
        在 Nginx 缓存默认配置下,Nginx 处理完一个大文件的初始请求后,后续的用户请求必须等待整个文件下载结束并存入缓存后才可以继续被处理,整个过程非常耗时。为解决这个问题,Nginx 提供了 ngx_http_slice_module 模块,用以缓存范围请求的支持。该模块将文件分成更小的切片(slices),客户端每个范围请求覆盖特定的切片,如果该范围没有缓存,则从源服务器请求后存入缓存,否则就从缓存中返回数据。
        http_slice 模块配置指令如下表所示:

名称切片指令
指令slice
作用域http、server、location
默认值0
指令说明设定范围请求切片的大小。默认为不启用该功能

         配置样例如下:

location / {
    slice             1m;                               # 切片大小为1MB
    proxy_cache       cache;                            # 缓存共享内存名称为cache
    proxy_cache_key   $uri$is_args$args$slice_range;    # 设置缓存key
    proxy_set_header  Range $slice_range;               # 添加头字段Range的字段值为
                                                        # $slice_range
    proxy_cache_valid 200 206 1h;                       # 响应状态码为200及206的内容缓存有效期为1h
    proxy_pass        http://localhost:8000;
}

 

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

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

相关文章

【系统架构设计师】三、数据库系统(事务并发|封锁协议|数据库安全|商业智能|SQL语句)

目录 一、事务并发 1.1 事务概述 1.2 并发控制 1.3 封锁 1.3.1 X 封锁和 S 封锁 1.3.2 三级封锁协议 二、数据库安全 2.1 备份(转储)与恢复 2.2 备份分类 2.3 数据库故障 三、商业智能 3.1 数据仓库 3.2 数据仓库的结构-OLAP 3.3 数据挖掘 3.4 分布式数据库 四…

MacOS - 启动台(LaunchPad)缺少应用软件图标

问题描述 MacOS 有时会遇到已安装的软件在启动台(LaunchPad)中找不到的 bug,这种情况在新安装软件时易出现。 原因分析 首先去访达(Finder)中的“应用程序”文件夹确认是否已安装某软件(LaunchPad 中图标…

Centos7安装自动化运维Ansible

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具,基于Python 开发,集合了众多运维工具(puppet 、cfengine、chef、func、fabric)的优点,实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

【云手机】数据安全如何保障?

安全办公,信息安全,这是企业使用云手机的初衷和目的,云手机在数据保密,远程办公等功能上有巨大的优势,也为企业提供了支持 首先就是云手机能够实现数据的集中管理和加密存储。所有办公相关的数据都存储在云端的安全服务…

植物大战僵尸杂交版2024最新手机版下载!功能全面升级,战斗更刺激!

植物大战僵尸杂交版2024——让游戏更加有趣! 嘿,各位游戏爱好者们!🌟今天我要给你们介绍的是一个全新版本的植物大战僵尸——植物大战僵尸杂交版2024。这款游戏不仅保留了原版的经典元素,还增加了许多新的特性和玩法&a…

【Windows】Topaz Gigapixel AI(人工智能图片放大工具)软件介绍和安装教程

软件介绍 Topaz Gigapixel AI是一款由Topaz Labs开发的先进图像放大软件,利用人工智能(AI)技术来放大图像,同时保持或甚至增强图像的细节和清晰度。这款软件特别适用于需要高质量图像放大的摄影师、设计师以及其他视觉内容创作者…

电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略

我们经常会遇到各种各样的问题,其中之一就是DLL文件的丢失。DLL文件(动态链接库)是操作系统和应用程序正常运行所必需的文件,当这些文件丢失或损坏时,可能会导致软件无法正常启动,甚至影响系统的稳定性。对…

什么是拷贝?我:Ctrl + C ...

前言 当谈及拷贝,你的第一印象会不会和我一样,ctrl c ctrl v ... ;虽然效果和拷贝是一样的,但是你知道拷贝的原理以及它的实现方法吗?今天就让我们一起探究一下拷贝中深藏的知识点吧。 拷贝 首先来看下面一段代码…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 (1)神经网络的基本组成单位 (2)生物上,每个神经元通过树突接受来自其他被激活神经元的信息,通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

【Docker实战】jenkins卡在编译Dockerfile的问题

我们的项目是标准的CI/CD流程,也即是GitlabJenkinsHarborDocker的容器自动化部署。 经历了上上周的docker灾难,上周的服务器磁盘空间灾难,这次又发生了jenkins卡住的灾难。 当然,这些灾难有一定的连锁反应,是先发生的d…

2024 端午节巽寮湾游玩记录

2024 端午节巽寮湾游玩记录 文章目录 2024 端午节巽寮湾游玩记录一、前言二、巽寮湾游玩行程1、三天衣食住行2、主要图片: 三、其他1、小结2、巽寮湾游玩建议3、感慨 一、前言 时间总是过得很快,只要你活着时间就会不停往前走。 所以你以后的路其实都是…

【机器学习】 第1章 概述

一、概念 1.机器学习是一种通过先验信息来提升模型能力的方式。 即从数据中产生“模型”( model )的算法,然后对新的数据集进行预测。 2.数据集(Dataset):所有数据的集合称为数据集。 训练集:用来训练出一个适合模…

Maven添加reactor依赖失败

目录 情况说明 解决过程 情况说明 起初是自己在学spring boot3&#xff0c;结果到了reactor这一部分的时候&#xff0c;在项目的pom.xml文件中添加下列依赖报错&#xff1a; <dependencyManagement><dependencies><dependency><groupId>io.projectr…

“Git掌控:分布式版本控制系统解析“

目录 # Git基础 1. Git下载 2. Git三种程序命令 2.1 Git Bash基本命令 2.2 Git更新项目命令 3. Git配置 3.1 设置用户名&#xff08;EE配置&#xff09; 3.2 查看用户名信息 4. Git基本理论 5. Git项目搭建 5.1 克隆远程仓库 5.2 指定本地克隆的目录 6. Git文件操…

【硬件开发】自举电路

为什么需要自举电路 半桥驱动电路中&#xff0c;下桥臂的源极直接接地&#xff0c;导通时栅极电压只需要达到MOS管导通d电压Vgs&#xff0c;但是对于上桥臂来说&#xff0c;上桥臂的源极电压会随着上桥臂的导通而抬升到VDD&#xff0c;对应想要导通时的栅极电压Vgs要到达VgsVDD…

代码随想录第20天|二叉树

654.最大二叉树 构造二叉树: 使用前序遍历 已理解思路 617.合并二叉树 虽然开辟额外空间, 但结果依旧受到原来的数影响(当为null时直接借用了原来数的节点) class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 nullptr) return roo…

ubuntu20.04配置anaconda

1.anaconda下载 地址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择&#xff1a;Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录&#xff0c;选在在终端中打开&#xff0c;然后在终端输入安装命令…

【漏洞复现】海康威视 综合安防管理平台 session接口 远程代码执行漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

关机充电动画:流程与定制

关机充电动画&#xff1a;流程与定制 基于MTK平台Android 11分析 生成logo.bin 关机充电动画是由一系列的bmp图片组成的&#xff0c;这些图片资源存在于vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo目录下&#xff08;当然不仅保护关机充电动画&#xff0c…

北漂新媒体从业者的一天

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 本文纯属虚构 小李通过努力考上了一所北京的大学&#xff0c;毕业后就留在了北京&#xff0c;做新媒体运营&#xff0c;在天通苑租了一个单间&#xff0c;月租2500&#xff0c;业余时间做自媒体&#xff0c;也算是…