当前位置: 首页 > news >正文

Nginx 缓存那些事儿:原理、配置和最佳实践

Nginx 缓存那些事儿:原理、配置和最佳实践

在当今的互联网世界,网站的访问量和数据处理量不断攀升,如何确保用户能够快速、稳定地访问我们的网站,已经成为每个运维工程师面临的挑战。幸运的是,Nginx 作为一款高性能的反向代理服务器,能够帮助我们轻松应对这一挑战,不仅能处理大量的请求,还能作为缓存服务器来提高系统性能,减轻后端服务器的压力。


一、Nginx 缓存的工作原理

要理解 Nginx 如何作为缓存服务器工作,我们可以通过一个实际的请求流程来讲解:

1. 客户端发起请求

假设你访问的是 http://www.example.com/index.html,浏览器向 Nginx 发送请求。

2. Nginx 检查缓存

在接到请求后,Nginx 会首先检查缓存目录(比如 /var/cache/nginx)是否已经存储了这个请求的缓存。如果这个请求的响应数据已经缓存过,并且没有过期,Nginx 就会直接从缓存中读取响应,返回给客户端。

  • 缓存命中:如果缓存中有该内容,并且缓存没有过期,Nginx 会直接返回缓存中的数据,响应速度非常快,几乎不需要与后端通信。

  • 缓存未命中:如果缓存中没有找到该内容,或者缓存已过期,Nginx 就会将请求转发到后端服务器。

3. 转发请求到后端

如果缓存未命中,Nginx 会把请求转发给后端的应用服务器,后端服务器会处理请求并返回响应数据。

4. 缓存响应并保存到本地

当 Nginx 接收到后端返回的响应数据时,它会将这些数据存储到本地缓存目录,等待下一次相同请求到来时直接从缓存中取出。

5. 返回数据给客户端

不管缓存是否命中,Nginx 最终都会将响应数据返回给客户端,这样用户就能够看到自己请求的页面内容。

6. 后续请求命中缓存

如果其他用户或者相同用户在一段时间内再次访问相同的 URL,Nginx 就会直接从缓存中返回数据,避免再次访问后端,从而提高响应速度,减少后端服务器的压力。


二、缓存目录的生成规则

那么,Nginx 是如何管理这些缓存文件的呢?它是通过哈希值来决定缓存文件的存储路径的。下面我们详细看看这个过程:

1. 缓存目录结构

我们在配置 Nginx 缓存时,通常会使用 proxy_cache_path 指定缓存存储的路径。例如:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m inactive=60m max_size=1g;
  • levels=1:2:这表示 Nginx 会根据缓存文件的哈希值生成多层目录结构。第一层目录由哈希值的最后 1 位字符组成,第二层目录由哈希值的倒数第 2 和第 3 位字符组成。

    举个例子,如果 URL http://www.example.com/index.html 的 MD5 哈希值是 a3f8d2fbe0dca4dbec3ed5a033dbfbe0295b1b5a,那么缓存路径的目录结构会是:

    /var/cache/nginx/a/5b/a3f8d2fbe0dca4dbec3ed5a033dbfbe0295b1b5a
    
    • 第一层目录 a 是哈希值的最后 1 位字符
    • 第二层目录 5b 是哈希值倒数第 2 和第 3 位字符。
    • 文件名则是哈希值的完整值,a3f8d2fbe0dca4dbec3ed5a033dbfbe0295b1b5a
  • keys_zone=cache_zone:10m:这里定义了一个名为 cache_zone 的内存区域,大小为 10MB,用于存储缓存的元数据,比如缓存的文件名、大小、过期时间等。

  • inactive=60m:表示如果缓存 60 分钟内没有被访问,它将被自动删除。

  • max_size=1g:指定缓存目录的最大大小为 1GB,一旦超过这个大小,Nginx 会自动清理一些不常访问的缓存文件。

2. 缓存文件的命名和存储

Nginx 会根据请求的 URL 生成一个唯一的哈希值,并将缓存文件存储在相应的目录下。哈希值确保每个 URL 对应的缓存文件是唯一的,避免文件冲突。

3. 缓存文件的生命周期

缓存文件并不会永远存在,它们有自己的“生命周期”。比如,我们在上述配置中设置了 inactive=60m,意味着如果 60 分钟内没有请求访问该缓存文件,它会被删除。同时,通过 max_size=1g 限制了缓存目录的最大容量,超出限制后,Nginx 会清理掉最早没有被访问的缓存文件。


三、Nginx 缓存的使用场景

那么,Nginx 缓存到底适合在哪些场景下使用呢?下面我总结了几个常见的应用场景:

1. 缓存静态资源

对于静态资源(如图片、CSS、JavaScript 文件等),缓存可以显著提高访问速度,因为这些资源一般不会频繁变动,且被多次请求。使用 Nginx 缓存静态资源可以避免每次请求都访问后端服务器,从而减少带宽消耗和服务器负担。

2. 缓存动态生成的页面

一些动态页面(比如新闻网站的首页、商品详情页等),虽然是动态生成的,但更新频率较低。你可以为这些页面设置缓存,避免每次请求都需要访问数据库或进行复杂的计算。比如可以缓存 10 分钟或 1 小时,从而减轻后端服务器的压力。

3. 减轻后端负担

对于一些高并发的网站,后端服务器可能会因为请求过多而变得非常繁忙。Nginx 缓存可以帮助你减轻这种压力,尤其是对于一些热门页面的请求,通过缓存可以大幅提升响应速度。

4. 节省带宽和提高性能

如果你的网站有大量用户访问相同的页面或资源,通过缓存,不仅可以节省带宽消耗,还能提高整体的性能,尤其是在高并发的情况下,能够有效提升用户体验。


四、Nginx 缓存配置实战

接下来,让我们通过一个简单的实例,来看看如何在 Nginx 中配置缓存。

1. 配置缓存路径

http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m inactive=60m max_size=1g;
}

这里我们指定了缓存路径 /var/cache/nginx,并设置了缓存的层级、大小、过期时间等参数。

2. 配置缓存策略

server {listen 80;server_name www.example.com;location / {proxy_cache cache_zone;  # 启用缓存proxy_cache_valid 200 10m;  # 对 200 状态码的响应缓存 10 分钟proxy_cache_valid 404 1m;   # 对 404 状态码的响应缓存 1 分钟add_header X-Cache-Status $upstream_cache_status;  # 显示缓存状态proxy_pass http://backend.example.com;  # 转发请求到后端服务器# 设置头部信息proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 忽略后端的缓存控制头proxy_ignore_headers Cache-Control Expires;}
}

这里,我们为 www.example.com 配置了缓存策略。所有的请求都会经过缓存,如果缓存命中,则直接返回缓存的内容。如果没有命中,则从后端获取并缓存。


结语

相信你对 Nginx 作为缓存服务器的工作原理、配置方法以及缓存的使用场景有了更清晰的认识。通过合理配置缓存,不仅能够提高网站的访问速度,减轻后端服务器的压力,还能提高整个系统的性能和可扩展性。

相关文章:

Nginx 缓存那些事儿:原理、配置和最佳实践

Nginx 缓存那些事儿:原理、配置和最佳实践 在当今的互联网世界,网站的访问量和数据处理量不断攀升,如何确保用户能够快速、稳定地访问我们的网站,已经成为每个运维工程师面临的挑战。幸运的是,Nginx 作为一款高性能的…...

vue发展史

Vue.js发展史 Vue.js是一个渐进式JavaScript框架,自发布以来受到了广泛的关注和喜爱。以下是Vue.js的发展史: 1. 起源(2013年) Vue.js的创始人尤雨溪(Evan You)在2013年开始构思这个项目。当时&#xff0…...

基于Java和Vue开发的校园跑腿软件校园跑腿小程序系统源码

市场前景 学生需求多样化: 随着校园生活节奏的加快和学生需求的多样化,跑腿服务逐渐成为一种新兴的商业模式。学生群体对于便捷、高效的日常服务需求不断增加,如外卖送餐、快递代取、文件传递等。市场规模持续增长: 大学校园作为…...

MySQL(五)--- 事务

1、CURD操作不加控制时,可能会出现什么问题 即:类似于线程安全问题,可能会导致数据不一致问题。 因为,MySQL内部本身就是多线程服务。 1.1、CURD满足什么属性时,才能避免上述问题 1、买票的过程得是原子的吧。 2、买票互相应该不能影响吧。 3、买完票应该要永久有效吧。…...

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…...

机器学习经典算法

机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...

Scala中的泛型

类型参数 ---- 泛型(数据类型是变化的) (1) 可以有多个 (2) 名称合法就行&#xff0c;没有固定的&#xff0c;一般用T(Type) 在Scala中&#xff0c;用[]表示。在Java中用<>表示 1. 与数据类型的区别 List是数据类型&#xff0c;表示一个列表。[Int]表示泛型&#xff0c;它…...

数据分析特征标准化方法及其Python实现

数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return (distance(a…...

前端数据安全防护(控制台)

目录 前言 禁用右键菜单 禁用快捷键 监控控制台 完整逻辑 前言 前端的数据在浏览器中一直处于一个裸奔的状态&#xff0c;只要是稍微懂一点计算机的人&#xff0c;都可以在浏览器的控制台中拿到前端页面的所有数据&#xff0c;包括和后端的交互数据。为了…...

自己玩虚拟机:vagrant,virtual box,centos

vagrant 访问Vagrant官网 https://www.vagrantup.com/ 点击Download Windows&#xff0c;MacOS&#xff0c;Linux等 选择对应的版本 AMD64 (x86_64) I686 (x86) 傻瓜式安装 命令行输入vagrant&#xff0c;测试是否安装成功 vagrant -v 可以查看当前版本 virtual box 访…...

Frida框架HOOK RegisterNatives函数

使用Frida框架HOOK RegisterNatives函数&#xff0c;获取动态注册的函数地址、名称、签名、class名称、所属的so文件名称、so文件加载基址、函数在so文件中的地址。 废话不多说&#xff0c;上代码&#xff1a; 运行命令&#xff1a;frida -U -f in.****** -l RegisterNatives…...

[创业之路-189]:《华为战略管理法-DSTE实战体系》-2- 生存与发展的双重旋律:短期与长期、战术与战略的交响乐章

目录 生存与发展的双重旋律&#xff1a;短期与长期、战术与战略的交响乐章 一、生存&#xff1a;短期视角下的战术布局 二、发展&#xff1a;长期视角下的战略规划 三、短期与长期、战术与战略的融合与平衡 四、结语&#xff1a;在生存与发展的交响曲中奏响辉煌 生存与发展…...

TDengine 部署

TDengine是一款开源高性能的时序数据库&#xff0c;其部署过程可以根据不同的环境和需求进行灵活配置。以下将详细介绍TDengine的部署步骤&#xff0c;包括单节点部署和集群部署。 一、单节点部署 下载安装包&#xff1a; 访问TDengine的官方网站或GitHub仓库&#xff0c;下载…...

【前端】20种 Button 样式

20种 Button 样式 在前端开发中&#xff0c;Button 按钮的样式设计是提升用户交互体验的重要一环。以下是20种常见的Button样式&#xff0c;这些样式主要基于CSS实现&#xff0c;可以根据具体需求进行调整和组合。 1. 默认样式 CSS 样式&#xff1a;.button { background-co…...

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理任务中展现了强大的能力&#xff0c;但为了使其更贴合特定应用场景&#xff0c;通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据&#xff0c;并通过具体…...

mysql的执行计划分析和索引下推以及索引长度计算

1 执行计划介绍 执行计划&#xff08;Execution Plan&#xff09;是数据库查询优化的重要工具&#xff0c;用于展示数据库如何执行 SQL 查询的详细过程。它包含了查询操作的步骤、各个步骤的执行顺序、使用的索引、访问的表、连接方式、预计的成本等信息 可以显示SQL语句最终…...

C#中的string操作详解-截取、分割、连接、替换等

在C#中&#xff0c;string 类提供了许多用于操作字符串的方法&#xff0c;包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例&#xff1a; 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法&#xff1a; //从startIndex开始截取&#xff0c;…...

Redis Cluster 分片机制

Redis 集群是 Redis 提供的一种分布式实现&#xff0c;用于水平扩展数据存储能力。通过 Redis 集群&#xff0c;可以将数据分片存储在多个 Redis 节点上&#xff0c;同时提供高可用性和故障转移功能。 分片&#xff08;Sharding&#xff09;&#xff1a; Redis 集群将数据划分…...

论文结论:GPTs and Hallucination Why do large language models hallucinate

GPTs and Hallucination 当一个主题有普遍共识&#xff0c;并且有大量语言可用于训练模型时&#xff0c;大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】&#xff0c;或者主题有争议&#xff0c;或是对主题没有明确共识的情况下&#xff0c;就…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...