Nginx 缓存系统 proxy_cache详解

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
    • 功能特点
    • proxy_cache工作原理
    • 示意图
    • 配置文件示例
    • 参数详尽说明
    • 性能优化方案
  • 总结


前言

Nginx 的 proxy_cache 模块是 Nginx 代理功能的一部分,它允许 Nginx 缓存来自后端服务器的响应,以便在后续的请求中可以直接从缓存中提供内容,而无需再次向后端服务器请求。这种机制可以显著提高静态内容的响应速度,减轻后端服务器的负载,并提高网站的可扩展性。

功能特点

减少后端负载:通过缓存静态内容,减少对后端服务器的请求,降低负载。
提高响应速度:缓存的内容可以快速响应后续相同的请求,提高用户体验。
灵活的缓存策略:可以根据不同的 HTTP 响应状态码设置不同的缓存有效期。
缓存控制:提供了丰富的指令来控制哪些请求可以被缓存,哪些请求应该绕过缓存。

`

proxy_cache工作原理

Nginx 的 proxy_cache 模块允许 Nginx 作为反向代理服务器时缓存后端服务器的响应。以下是 proxy_cache 模块的工作原理:

  1. 请求到达:客户端向 Nginx 发送请求。
  2. 缓存查找:Nginx 首先检查请求是否命中缓存。这是通过查找共享内存中的缓存键(由 proxy_cache_key 定义)来完成的。
  3. 缓存命中:如果请求命中缓存,Nginx 直接从缓存中读取响应并返回给客户端。
  4. 缓存未命中:如果请求未命中缓存,Nginx 将请求转发到后端服务器。
  5. 后端响应:后端服务器处理请求并返回响应给 Nginx。
  6. 缓存存储:Nginx 将后端服务器的响应存储在本地文件系统中,同时在共享内存中更新缓存键和元数据。
  7. 返回响应:Nginx 将后端服务器的响应返回给客户端,并根据 proxy_cache_valid 指令设置的规则决定缓存时间。

示意图

+--------+     +---------+     +-----------+     +----------+
| 客户端  | --> |   Nginx  | --> | 后端服务器 | --> |   Nginx   |
|         |--> |  (查找缓存) |     |           | <-- |  (返回    |
|         |    |  (缓存命中) |     |           |     |  响应)   |
|         |    |  (缓存未命中) |     |           |     +----------+
+---+----+    +---------+     +-----+---+---+|                |              ||                |              | (缓存存储)|                |              |+----------------+--------------+

配置文件示例

# 定义 http 块,Nginx 的主要配置都在这个块内
http {# 设置缓存路径及其参数proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=7d use_temp_path=off;# levels 定义缓存目录的层级,1:2 表示两层# keys_zone 定义缓存键和大小,my_cache:10m 表示名称为 my_cache,大小为 10MB# max_size 控制缓存区域的最大磁盘空间,这里设置为 10GB# inactive 定义缓存数据在指定时间内未被访问则自动清除的时间,这里设置为 7 天# use_temp_path 设置为 off,表示缓存文件直接写到 cache 中而不使用 temp_path,避免文件拷贝导致影响性能# 定义 server 块,用于监听 80 端口并处理对 example.com 的请求server {# 监听 80 端口listen 80;# 设置服务器名,这里为 example.comserver_name example.com;# 定义 location 块,用于处理根路径下的请求location / {# 将请求代理到后端服务器,这里为 http://backendproxy_pass http://backend;# 启用缓存,并指定缓存区域为 my_cacheproxy_cache my_cache;# 设置缓存键,这里包括请求方法、主机和请求 URIproxy_cache_key "$request_method$host$request_uri";# 设置不同 HTTP 状态码的缓存有效期,200 和 302 状态码的响应缓存 10 分钟proxy_cache_valid 200 302 10m;# 设置 404 状态码的响应缓存 1 分钟proxy_cache_valid 404 1m;# 定义条件跳过缓存,如果请求中包含 no_cache 参数或特定的 HTTP 头,则不使用缓存proxy_cache_bypass $cookie_no_cache $arg_no_cache$http_pragma$http_authorization;# 定义条件不缓存响应,如果请求中包含 no_cache 参数或特定的 HTTP 头,则不缓存响应proxy_no_cache $cookie_no_cache $arg_no_cache$http_pragma$http_authorization;}}
}

这段配置注释详细解释了 Nginx 配置文件中的每个指令和它们的参数,以便更好地理解配置文件的作用和行为。

参数详尽说明

  • proxy_cache_path:定义缓存文件存储路径和参数。

    • levels:定义缓存目录的层级。
    • keys_zone:定义共享内存中用于缓存键的区域。
    • max_size:定义缓存的最大磁盘空间。
    • inactive:定义缓存数据在指定时间内未被访问则自动清除的时间。
    • use_temp_path:定义是否使用临时路径。
  • proxy_cache:启用缓存并指定缓存区域。

  • proxy_cache_key:定义缓存的键,用于识别缓存数据。

  • proxy_cache_valid:为不同的响应状态码设置缓存时间。

  • proxy_cache_bypassproxy_no_cache:定义条件跳过缓存和避免缓存特定响应。

性能优化方案

  1. 缓存策略优化:合理配置 proxy_cache_valid 指令,为不同的响应状态码设置不同的缓存时间。
  2. 缓存空间管理:通过 proxy_cache_path 指令合理设置缓存空间的大小和有效期。
  3. 缓存键优化:使用 proxy_cache_key 指令定制缓存键,减少缓存冲突,提高缓存命中率。
  4. 缓存锁定:通过 proxy_cache_lockproxy_cache_lock_timeout 指令,控制同时对同一缓存项的请求,减少对后端的并发请求。
  5. 使用 CDN:结合 CDN 使用 Nginx 缓存,可以将静态资源缓存到离用户更近的节点。
  6. 监控和调整:定期监控缓存命中率和响应时间,根据实际情况调整缓存配置。

总结

通过以上配置和优化方案,可以有效地管理 Nginx 的缓存行为,提高网站的性能,同时保证敏感或动态数据的实时性和安全性。

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

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

相关文章

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…

网络药理学:(待更)Alphafold3和批量分子动力学模拟(Desmond、AutoMD)

批量动力学模拟 注意全都需要在类linux平台上进行 安装Desmond模块&#xff1a; https://github.com/Wang-Lin-boop/Schrodinger-Script 安装AutoMD模块&#xff1a; Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况&#xff0c;就是爬虫最初是正常运行、正常抓取数据的&#xff0c;一切看起来都是那么美好&#xff0c;然而一杯茶的工夫就出现了错误&#xff0c;例如 403 Forbidden&#xff0c;这时打开网页一看&#xff0c;可能会看到“您的IP访问频率太…

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题③

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题③ 模块A 基础设施设置与安全加固(200分)A-1 登录安全加固&#xff08;Windows, Linux&#xff09;A-2 Nginx安全策略&#xff08;Linux&#xff09;A-3日志监控&#xff08;Windows&#xff09;A-4中间件…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…

05 在 Linux 使用 AXI DMA

DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术&#xff0c;传输过程无需 CPU 参与&#xff08;但是CPU需要提前配置传输规则&#xff09;&#xff0c;可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下&#xff1a; CPU 向…

linux 安装 vsftpd 服务以及配置全攻略,vsftpd 虚拟多用户多目录配置,为每个用户配置不同的使用权限

linux 安装 vsftpd 服务以及配置全攻略&#xff0c;vsftpd 虚拟多用户多目录配置&#xff0c;为每个用户配置不同的使用权限。 linux 安装 vsftpd 服务以及配置全攻略 FTP 是 File Transfer Protocol 的简称&#xff0c;用于 Internet 上的控制文件的双向传输。同时&#xff0…

SQL语句在MySQL中如何执行

MySQL的基础架构 首先就是客户端&#xff0c;其次Server服务层&#xff0c;大多数MySQL的核心服务都在这一层&#xff0c;包括连接、分析、优化、缓存以及所有的内置函数&#xff08;时间、日期、加密函数&#xff09;&#xff0c;所有跨存储引擎功能都在这一层实现&#xff1…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

力扣-汉明距离

1.两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 看到这题&#xff0c;当然想到了按位异或^,并且c内置了计算二进制数中1数量的函数__builtin_popcount() class Solution { publ…

关于成功插入 SQLite 但没有数据的问题

背景 技术栈&#xff1a;SpringBoot Mybatis-flex SQLite 项目中集成了SQLite&#xff0c;配置如下&#xff1a; spring:datasource:url: jdbc:sqlite::resource:db/project.dbdriver-class-name: org.sqlite.JDBC在进行测试时&#xff0c;使用Mybatis-flex往表中插入数据&…

C#常见错误—空对象错误

System.NullReferenceException&#xff1a;未将对象引用设置到对象的实例 在C#编程中&#xff0c;System.NullReferenceException是一个常见的运行时异常&#xff0c;其错误信息“未将对象引用设置到对象的实例”意味着代码试图访问一个未被初始化或已被设置为null的对象的成…

沁恒CH32V208蓝牙串口透传例程:修改透传的串口;UART-CH32V208-APP代码分析;APP-CH32V208-UART代码分析

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

Scala的隐式对象

Scala中&#xff0c;隐式对象&#xff08;implicit object&#xff09;是一种特殊的对象&#xff0c;它可以使得其成员&#xff08;如方法和值&#xff09;在特定的上下文中自动可用&#xff0c;而无需显式地传递它们。隐式对象通常与隐式参数和隐式转换一起使用&#xff0c;以…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …

DVWA亲测sql注入漏洞

LOW等级 我们先输入1 我们加上一个单引号&#xff0c;页面报错 我们看一下源代码&#xff1a; <?php if( isset( $_REQUEST[ Submit ] ) ) { // Get input $id $_REQUEST[ id ]; // Check database $query "SELECT first_name, last_name FROM users WHERE user_id …