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年开始构思这个项目。当时࿰…...
基于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) 名称合法就行,没有固定的,一般用T(Type) 在Scala中,用[]表示。在Java中用<>表示 1. 与数据类型的区别 List是数据类型,表示一个列表。[Int]表示泛型,它…...
数据分析特征标准化方法及其Python实现
数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...
UnityShaderLab 实现程序化形状(一)
1.实现一个长宽可变的矩形: 代码: fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形: 代码: fixed4 frag (v2f i) : SV_Target{return (distance(a…...
前端数据安全防护(控制台)
目录 前言 禁用右键菜单 禁用快捷键 监控控制台 完整逻辑 前言 前端的数据在浏览器中一直处于一个裸奔的状态,只要是稍微懂一点计算机的人,都可以在浏览器的控制台中拿到前端页面的所有数据,包括和后端的交互数据。为了…...
自己玩虚拟机:vagrant,virtual box,centos
vagrant 访问Vagrant官网 https://www.vagrantup.com/ 点击Download Windows,MacOS,Linux等 选择对应的版本 AMD64 (x86_64) I686 (x86) 傻瓜式安装 命令行输入vagrant,测试是否安装成功 vagrant -v 可以查看当前版本 virtual box 访…...
Frida框架HOOK RegisterNatives函数
使用Frida框架HOOK RegisterNatives函数,获取动态注册的函数地址、名称、签名、class名称、所属的so文件名称、so文件加载基址、函数在so文件中的地址。 废话不多说,上代码: 运行命令:frida -U -f in.****** -l RegisterNatives…...
[创业之路-189]:《华为战略管理法-DSTE实战体系》-2- 生存与发展的双重旋律:短期与长期、战术与战略的交响乐章
目录 生存与发展的双重旋律:短期与长期、战术与战略的交响乐章 一、生存:短期视角下的战术布局 二、发展:长期视角下的战略规划 三、短期与长期、战术与战略的融合与平衡 四、结语:在生存与发展的交响曲中奏响辉煌 生存与发展…...
TDengine 部署
TDengine是一款开源高性能的时序数据库,其部署过程可以根据不同的环境和需求进行灵活配置。以下将详细介绍TDengine的部署步骤,包括单节点部署和集群部署。 一、单节点部署 下载安装包: 访问TDengine的官方网站或GitHub仓库,下载…...
【前端】20种 Button 样式
20种 Button 样式 在前端开发中,Button 按钮的样式设计是提升用户交互体验的重要一环。以下是20种常见的Button样式,这些样式主要基于CSS实现,可以根据具体需求进行调整和组合。 1. 默认样式 CSS 样式:.button { background-co…...
机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法
引言 大模型(如BERT、GPT等)在自然语言处理任务中展现了强大的能力,但为了使其更贴合特定应用场景,通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据,并通过具体…...
mysql的执行计划分析和索引下推以及索引长度计算
1 执行计划介绍 执行计划(Execution Plan)是数据库查询优化的重要工具,用于展示数据库如何执行 SQL 查询的详细过程。它包含了查询操作的步骤、各个步骤的执行顺序、使用的索引、访问的表、连接方式、预计的成本等信息 可以显示SQL语句最终…...
C#中的string操作详解-截取、分割、连接、替换等
在C#中,string 类提供了许多用于操作字符串的方法,包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例: 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法: //从startIndex开始截取,…...
Redis Cluster 分片机制
Redis 集群是 Redis 提供的一种分布式实现,用于水平扩展数据存储能力。通过 Redis 集群,可以将数据分片存储在多个 Redis 节点上,同时提供高可用性和故障转移功能。 分片(Sharding): Redis 集群将数据划分…...
论文结论:GPTs and Hallucination Why do large language models hallucinate
GPTs and Hallucination 当一个主题有普遍共识,并且有大量语言可用于训练模型时,大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】,或者主题有争议,或是对主题没有明确共识的情况下,就…...
Multisim课程设计救星:从卡诺图到仿真,手把手搞定五人表决器(附源文件)
五人表决器数字电路设计实战:从卡诺图到Multisim仿真的全流程解析 第一次拿到数字电路课程设计任务书时,看着"五人表决器"这个题目,我的大脑和实验室的示波器一样一片空白。直到在面包板上成功点亮第一个LED指示灯,才真…...
Vue3+Three.js实战:拆解Xtreme1点云标注工具的技术架构
Vue3Three.js深度实战:构建工业级3D点云标注工具的技术解析 在自动驾驶、工业检测和机器人视觉领域,3D点云标注工具正成为AI训练数据生产的核心基础设施。Xtreme1作为开源多模态标注平台的代表,其pc-tool模块采用Vue3Three.js技术栈实现了专…...
实战向 Python 汽车推荐系统 Django框架 可视化 协同过滤算法 数据分析 大数据 机器学习(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
别再买错千元投影! 哈趣Q1Pro藏看越级体验
当下的智能投影市场正经历着深度的“去伪存真”变革,行业洗牌加速的同时,也让消费者的选购变得愈发谨慎。洛图科技数据显示,2025年国内智能投影市场整体销量下滑,其中低端投影成为调整重灾区,0-499元价位段销量同比大跌…...
集成Touchgal与快马平台,高效开发移动端富交互图片浏览组件
集成Touchgal与快马平台,高效开发移动端富交互图片浏览组件 最近在开发一个电商项目时,遇到了一个常见需求:商品详情页的图片浏览组件需要支持各种手势操作。传统的做法是从零开始编写手势识别逻辑,但这样不仅耗时,还…...
百川2-13B模型API调用详解:从Python安装到第一个成功请求
百川2-13B模型API调用详解:从Python安装到第一个成功请求 你是不是也对大模型API调用感到好奇,但一看到那些技术文档就头疼?别担心,今天咱们就来手把手走一遍,从零开始,用最简单的Python代码,完…...
一文读懂DMXAPI:一个Key接入300+大模型,开发者降本增效新选择
导语:在大模型应用爆发式增长的今天,开发者面临模型选择多、接入成本高、并发限制严、发票合规难等痛点。有没有一种方案,能让开发者"一次接入,全模型可用"?本文带你深入了解国内新兴的AI大模型聚合平台——…...
弧形导轨精度等级适配策略
弧形导轨是用于实现曲线运动的线性导向装置,广泛应用于自动化设备、机器人、医疗机械等领域。弧形导轨作为机械传动中的核心部件,其精度等级直接影响设备性能与稳定性。从精密加工到重型机械,不同场景对导轨的制造精度、运行精度及耐磨性要求…...
别再手动敲命令了!用Ansible一键搞定Harbor 2.14.0高可用部署(附完整Playbook)
Ansible自动化部署Harbor 2.14.0高可用集群实战指南 在容器化技术普及的今天,企业级私有镜像仓库Harbor已成为DevOps工具链中不可或缺的一环。然而,传统的手动部署方式不仅耗时费力,更难以保证多环境的一致性。本文将展示如何通过Ansible实现…...
网站SEO优化与网站内容更新的关系_企业网站SEO优化与行业特点的关系
<h3 id"seo_seo">网站SEO优化与网站内容更新的关系_企业网站SEO优化与行业特点的关系</h3> <p>在当今数字化时代,网站的SEO优化与内容更新之间有着密切的关系。这不仅关系到企业网站的流量,还直接影响企业的品牌形象和市场竞…...
