当前位置: 首页 > 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;就…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...