Nginx缓存之代理缓存配置
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Т | 缓存命中,从本地缓存获取数据 |
| BYPASS | proxy_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_store | on、off 或 string | off | 设置是否将被代理服务器的响应数据在本地按照请求的 URL 建立目录结构镜像。当指令值为 on 时,存储路径的设置为 root 或 alias,响应数据先存储到临时文件后再复制或重命名保存 |
| proxy_store_access | users:permissions... | user:rw | 设置创建本地镜像存储路径的文件夹权限 |
| proxy_cache | zone 或 off | off | 设置一个用以做缓存管理的共享内存区域 |
| proxy_cache_path | path 参数 | -- | 设置缓存文件存储路径及参数。缓存数据以 URL 的 MD5 值命名存储在缓存目录中 |
| proxy_cache_key | string | $scheme $proxy_host $request_uri | 设置缓存的关键字 |
| proxy_cache_lock | on 或 off | off | 是否启用缓存锁指令。当启用缓存锁机制时,每次只允许个向被代理服务器转发的请求,按照 proxy_cache_key 指令设置的标识增添新的缓存数据,其他相同的请求则将等待缓存中出现响应数据或该缓存锁被释放,其等待时间由 proxy_cache_lock_timeout 指令设置 |
| proxy_cache_lock_age | time | 5s | 缓存锁有效时间。当启用缓存锁机制时,如果一个请求在该指令的时间内没有完成响应数据缓存的添加,缓存锁将会被释放,获取缓存锁的请求将被转发给被代理服务器由代理服务器负责生成缓存 |
| proxy_cache_lock_timeout | time | 5s | 缓存锁等待超时时间。当启用缓存锁机制时,等待超过该时间的请求将直接从被代理服务器中读取响应,该请求响应不会被添加到缓存中 |
| proxy_cache_max_range_offset | number | -- | 用以设置范围请求(byte-range)请求时的最大偏移量。超出该偏移量的请求将直接从被代理服务器中读取响应数据 |
| proxy_cache_methods | GET 或 HEAD 或 POST... | GET HEAD | 指定可被缓存的请求方法 |
| proxy_cache_convert_head | on 或 off | on | 开启或禁用将请求方法 HEAD 转换为 GET,如果该功能被禁用,配置指令 proxy_cache_key 的指令值应该添加变量 $request_method |
| proxy_cache_min_uses | numberstring | 1 | 响应数据超过设置请求次数后将被缓存 |
| proxy_no_cache | string... | -- | 设置不生成缓存数据的条件,指定字符串的值不为空或不等于 0,则不将当前请求返回的响应数据进行缓存 |
| proxy_cache_bypass | string... | -- | 设置不使用缓存数据的条件,指令值中至少有一个值不为空或不等于 0 时,当前请求不使用缓存中的响应数据,直接访问源应用服务器。它可以与 proxy_no_cache 指令一起使用 |
| proxy_cache_revalidate | on 或 off | off | 启用该指令后,如果缓存过期,则通过在 HTTP 头中添加字段属性 If-Modified-Since 和 If-None-Match 的方式发送给源服务器,从而进行缓存的服务端校验 |
| proxy_cache_use_stale | error、timeout、 invalid_header、 updating、http_500、 http_503、http_403、 http_404、http_429、 off... | off | 当出现指定的条件时,使用已经过期的缓存响应数据 |
| proxy_cache_background_update | on 或 off | off | 允许使用过期的响应数据时,设置是否启用后台子请求更新过期缓存,同时向客户端返回过期的缓存响应数据 |
| proxy_cache_valid | [code...] time | -- | 根据响应码设置缓存时间 |
| proxy_cache_purge | string... | -- | 定义清除缓存请求条件,若指定的字符串不为空或 0,则将 proxy_cache_key 设置的标识的缓存进行清除。清除成功则返回状态码 204,仅商业版有效 |
关于上表有以下几点需要说明。
- 该模块指令列表中指令的指令域范围都是 http、server、location;
- proxy_cache_path 指令只能编写在 http 指令域中;
- proxy_cache 与 proxy_store 指令不能在同一指令域中同时使用;
- proxy_cache_path 指令值参数如下表所示。
| 参数名 | 参数格式 | 默认值 | 参数说明 |
|---|---|---|---|
| levels | levels | -- | 设置缓存目录的层级及命名方式 |
| use_temp_path | on 或 off | on | 参数值为 on,则使用 proxy_temp_path 设置作为临时文件目录。参数值为 off 时,则使用缓存目录做临时文件目录 |
| keys_zone | name:size | -- | 设置存储 cache_key 的共享内存 zone 及大小,1MB 可以存储 8000 个 key |
| inactive | time | 10 分钟 | 设置时间内未被访问的缓存将被删除 |
| max_size | size | -- | 缓存数据的最大值,超出这个最大值时,缓存管理进程将执行迭代更新,即删除最近最少使用的缓存 |
| manager_files | number | 100 | 缓存管理进程执行一次迭代更新时,删除文件的最大数 |
| manager_sleep | time | 50ms | 缓存管理进程每次更新缓存的迭代间隔时间 |
| manager_threshold | time | 200ms | 缓存管理进程执行一次迭代更新时,最大执行的时间,单位为 ms |
| loader_threshold | time | 200ms | 缓存加载进程每次迭代加载时,加载数据的最大执行时间 |
| loader_files | number | 100 | 缓存加载进程每次迭代加载时,加载缓存目录中缓存数据的最大文件数 |
| loader_sleep | time | 50ms | 缓存加载进程每次迭代的间隔时间 |
| purger | on 或 off | off | 是否启用缓存清除功能。仅商业版有效 |
| purger_files | number | 10 | 每次迭代清除时,清除缓存目录中缓存数据的最大文件数。仅商业版有效 |
| purger_sleep | time | 50ms | 连续两次迭代清除间的最少间隔时间。仅商业版有效 |
| purger_threshold | time | 50ms | 每次迭代清除时,最大执行的时间。仅商业版有效 |
3.HTTP 范围请求
范围请求允许服务器只发送请求的一部分响应数据给客户端,通常对大文件传输时,用以实现断点续传、多线程下载等功能。若服务端响应信息头中包含字段 Accept-Ranges:bytes,则表示服务端支持范围请求,且节点范围的单位为字节(bytes)。
在 Nginx 缓存默认配置下,Nginx 处理完一个大文件的初始请求后,后续的用户请求必须等待整个文件下载结束并存入缓存后才可以继续被处理,整个过程非常耗时。为解决这个问题,Nginx 提供了 ngx_http_slice_module 模块,用以缓存范围请求的支持。该模块将文件分成更小的切片(slices),客户端每个范围请求覆盖特定的切片,如果该范围没有缓存,则从源服务器请求后存入缓存,否则就从缓存中返回数据。
http_slice 模块配置指令如下表所示:
| 名称 | 切片指令 |
|---|---|
| 指令 | slice |
| 作用域 | http、server、location |
| 默认值 | 0 |
| 指令说明 | 设定范围请求切片的大小。默认为不启用该功能 |
配置样例如下:
location / {slice 1m; # 切片大小为1MBproxy_cache cache; # 缓存共享内存名称为cacheproxy_cache_key $uri$is_args$args$slice_range; # 设置缓存keyproxy_set_header Range $slice_range; # 添加头字段Range的字段值为# $slice_rangeproxy_cache_valid 200 206 1h; # 响应状态码为200及206的内容缓存有效期为1hproxy_pass http://localhost:8000;
}
相关文章:
Nginx缓存之代理缓存配置
Nginx 的缓存功能是集成在代理模块中的,当启用缓存功能时,Nginx 将请求返回的响应数据持久化在服务器磁盘中,响应数据缓存的相关元数据、有效期及缓存内容等信息将被存储在定义的共享内存中。当收到客户端请求时,Nginx 会在共享内…...
【Android】使用SeekBar控制数据的滚动
项目需求 有一个文本数据比较长,需要在文本右侧加一个SeekBar,然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本,但是文本比较长的话,需要在TextView外面套一个ScrollView,但是我…...
新能源汽车的能源动脉:中国星坤汽车电缆在新能源汽车电气化中的应用!
随着新能源汽车行业的蓬勃发展,汽车电缆组件作为汽车电气系统的核心组成部分,其重要性日益凸显。中国星坤汽车电缆组件以其卓越的性能和创新技术,为汽车的电能传输、信号传递和控制提供了坚实的保障。本文将深入解析星坤汽车电缆组件的特性、…...
AVL许可证查询系统
在数字化时代,软件已经成为企业运营的核心组成部分。然而,随着软件应用的不断增加,许可证管理也变得越来越复杂。AVL许可证查询系统作为企业软件资产管理的重要工具,能够帮助企业实现对软件许可证的全面掌控。本文将深入探讨AVL许…...
四个步骤,帮你成为价值导向型项目经理
在企业数字化转型的浪潮下,项目管理的方向逐渐从任务导向转变为以价值交付为导向。在快速变化的市场环境中,仅仅关注项目任务的完成已不足以确保项目的成功,需要更加注重项目的最终成果和价值,确保项目能够为组织带来实际的价值和…...
Python3 使用 clickhouse-connect 操作 clickhouse
版本: Python 3.7 x86 clickhouse 24.6.1.3573 clickhouse-connect 0.6.22 代码一: # pip install clickhouse-connectimport clickhouse_connect# 准备参数 host "192.168.1.112" port 8123 username "default" passw…...
Python脚手架系列-DrissionPage
记录DrissionPage模块使用中的一些常常复用的代码,持续更新… 接管谷歌浏览器 from DrissionPage import ChromiumPage, ChromiumOptionsco ChromiumOptions().set_local_port(4249) driver ChromiumPage(addr_or_optsco)创建driver,如果浏览器已开启优先接管&am…...
Java中如何调用mysql中函数
在Java中调用MySQL中的函数(无论是存储函数还是自定义函数),通常是通过JDBC(Java Database Connectivity)来完成的。以下是一个简单的步骤说明和示例代码,展示如何在Java中调用MySQL中的函数。 步骤 添加…...
Huggingface-cli 登录最新版(2024)
安装Huggingface-cli pip install -U "huggingface_hub[cli]"设置好git的邮箱和用户名和huggingface的github账号一致 git config --global user.mail xxx git config --global user.name xxx登录 复制token,划红线的地方,在命令行中点击右…...
Java学习 - Docker管理和容器命令 实例
docker管理 查看docker版本,检测是否可用 sudo docker version查看docker 系统信息 sudo docker infodocker容器命令 容器状态 容器标识 容器长uuid容器短uuid容器名字 查看容器状态 sudo docker status [容器标识1] [容器标识2] [容器标识n]深入查看容器信息 su…...
下载工程resources目录下的模板excel文件
一、添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.1.0</version> </dependency> 二、编写接口 GetMapping("/downloadTemplate")public void downlo…...
音频基础知识和音频指标
音频基础知识 声音 声音(sound)是由物体振动产生的声波。物体在一秒钟之内振动的次数叫做频率,单位是赫兹,字母Hz。人耳可以识别的声音频率在 20 Hz~20000 Hz之间; 声音三要素: 响度 响度,…...
使用Vue CLI在其他磁盘创建项目出现错误及解决
Vue CLI是Vue.js官方推出的脚手架工具,可以帮我们快速的创建Vue项目框架。 我们创建Vue项目时一般默认都是在C盘,但由于某些因素我们需要在其他磁盘上创建Vue项目。 通过“winr”打开终端时默认位置都是C盘,但是Vue CLI不接受绝对路径作为参…...
关于lamda表达式的使用
Lambda表达式是一种匿名函数,即没有函数名的函数,它可以以更简洁、更灵活的方式编写代码。以下是Lambda表达式的常用方式: 无参数,无返回值: 如果抽象方法不带参数且不返回值,可以使用空括号和主体编写Lam…...
Android替换默认的按键音
替换audio_assets.xml文件 此文件在AudioService.java被调用 <!--文件位置 /frameworks/base/core/res/res/xml/--> <audio_assets version"1.0"><group name"touch_sounds"><asset id"FX_KEY_CLICK" file"Effect…...
Windows 服务器Nginx 下载、部署、配置流程(图文教程)
不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx(最小)配置详解 六、Nginx(基础)配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…...
基于Redis实现共享session登录
搭配食用:Redis(基础篇)-CSDN博客 项目实现前的 Mysql中的表: 表说明tb_user用户表tb_user_info用户详情表tb_shop商户信息表tb_shop_type商户类型表tb_blog用户日记表(达人探店日记)tb_follow用户关注表tb_voucher优…...
shell函数的定义
shell函数的定义 定义:将命令序列按照格式写在一起.格式指的是函数的固定格式 作用:方便重复使用,还可以做成函数库,集中在一起,随时可以传参调用,大的工程分割成小的模块,提高代码的可读性. 函数的格式 vim hanshu1.shfunction shopping {命令序列}shopping () {命令…...
vue部署宝塔nginx配置(获取用户ip地址、反代理访问api接口、websocket转发)
以下配置为我自己的需求,因人而异,如果只是单纯的前端非交互页面,可以不用修改配置。 代码及注释,如下: #解决vue-router设置mode为history,去掉路由地址上的/#/后nginx显示404的问题location / {proxy_htt…...
Jenkins教程-3-github自动化测试任务构建
上一小节我们学习了Jenkins在windows和mac系统上安装搭建环境的方法,本小节我们讲解一下Jenkins构建github自动化测试任务的方法。 接下来我们以windows系统为例,讲解一下构建实际自动化测试任务的具体步骤。 安装git和github插件 点击进入Jenkins插件…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
