Nginx缓存基础

1 nginx缓存的流程

在这里插入图片描述
客户端需要访问服务器的数据时,如果都直接向服务器发送请求,服务器接收过多的请求,压力会比较大,也比较耗时;而如果在nginx缓存一定的数据,使客户端向基于nginx的代理服务器发送请求,可以有效节省时间。
如图所示,基于nginx缓存,客户端访问的流程是:客户端向nginx发送请求url。nginx检查自身缓存目录里有无要访问的数据,如果有则将缓存的数据发送给客户端。如果没有,则nginx向服务器发送请求,向服务器请求数据;服务器将数据发送给nginx后,nginx自身缓存的同时将数据转发给客户端。那么下一次有客户端有相同的数据请求时,就可以像有的情况一样,直接由nginx发送给客户端。

2 必备基础知识

2.1 listen和server_name

用户请求发来之后,同server{}下的listen和server_name进行匹配,如果匹配成功,那么将请求交给当前server里的location块来处理。
这里的listen和server_name自然是nginx所在服务器的端口和地址。如果nginx部署在内网服务器,虽然客户端发送请求的是外部地址和端口,但是这里还是要设置成内网的地址。

2.2 location块

2.2.1基本配置

server块可以同时配置多个location

server{
	listen port;
	server_name localhost;
	location /{
	}
	location /abc{
	}
	...
}

location:用来设置请求的URI

2.2.2 匹配

uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
=:用于不包含正则表达式的uri前,必须与指定的模式精确匹配

/:只要以ip:port/abc开头的全部都能访问

location /abc{
	}
location =/abc{
	}
# 精确匹配
# ip:port/abc、ip:port/abc?p1=TOM可以匹配
# ip:port/abcd不能匹配

~:正则匹配

location ~/abc{
	}

root:

location /abc{
	root html;
	# root为资源存放的目录
	inedx index.html;
	}

2.2.3 地址匹配优先级

location / {
}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /abc, 则 / 匹配, /abc 也匹配,\n但后面前缀路径会和最长字符串优先匹配(最长匹配)
location /abc/ {
}
匹配任何以 /abc/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
location /abc/def {
}
匹配任何以 /abc/def 开头的地址,匹配符合以后,还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条。
因此匹配优先级:精准=>一般/
都是一般的情况下,哪个location后跟的地址长度长,哪个优先级高,比如:
location /abc/def {}>location /abc {}>location / {}

3 指令解析

3.1 proxy_cache_path指令

3.1.1 语法

proxy_cache_path path [levels=a:b:c] keys_zone=zone_name:zone_size [inactive=time] [max_size=sizes]

path可以是/usr/local/proxy_cache

3.1.2 levels

levels可以将字符串密文与缓存目录进行结合,指定缓存空间对应的目录,最多可以设置三层,每层取值为1或2:
levels=1:2 缓存空间有两层目录,一层是1个字母,二层是2个字母
如果字符串密文为dsciwbdciow87y8hwdh29
那么levels=1:2最终的存储目录为:/usr/local/proxy_cache/9/h2

3.1.3 keys_zone

可以指定缓存区的名称与大小
keys_zone=impar:300m
缓存区名称为impar,大小为300m.

3.1.4 inactive

指定缓存的数据多久未被访问会被删除的时间
inactive =2d
2d表示2天

3.1.5 max_size

设置最大的缓存空间,如果缓存空间存满,会覆盖目前缓存时间最长的数据
max_size=10g

3.1.6 配置位置

http中,server外

3.3 proxy_cache

该指令用来开启或关闭缓存,如果是开启则自定使用哪个缓存区来缓存
开启

proxy_cache zone_name

关闭

proxy_cache off

位置:http、server、location里

3.4 proxy_cache_key

该指令用来设置web缓存中的key值,nginx会根据key值的MD5进行哈希缓存
位置同上

3.5 proxy_cache_valid

该指令用来对不同返回状态码的URL设置不同的缓存时间
位置同上

proxy_cache_valid 404 1m;
proxy_cache_valid 202 302 1m;
proxy_cache_valid any 1m;

1该设置从上到下进行,如果在上面的步骤中被设置(如404,202,302),就不会更改,最后的any只能设置除404,202,302以外的状态。
2nginx缓存代理中常有情况:nginx尚未缓存某数据,但是客户端发出请求该数据的信息,nginx往往只能先回复404。但是稍后nginx从服务器请求到了该数据后,客户端再请求该数据那按照原理必然要返回该数据,而不是404。因此,之前请求对应的返回状态码应该有一个“限定有效的时间”。这就需要靠proxy_cache_valid来设置了。

3.6 proxy_cache_min_uses

该指令用来设置资源被访问多少次后会被缓存

proxy_cache_min_uses number

位置同上

3.7 proxy_cache_methods

该指令用户设置缓存哪些http方法

proxy_cache_methods method

method可选方式为GET, HEAD, POST.
默认方式为GET, HEAD。
位置同上。

4 add_header 可选项

1下面的可选项不是必须的,只是方便在测试的时候查看是否命中缓存

add_header nginx-cache $upstream_cache_status;

效果:
在这里插入图片描述
2add_header Access-Control-Allow-Methods
明确了客户端所要访问的资源允许使用的方法或方法列表,可以是"GET,OPTIONS,POST,HEAD,PUT,DELETE"

3add_header Accept-Ranges
此字段的值表示可用于定义范围的单位,可以是"bytes"

4add_header Access-Control-Allow-Origin "*";
表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。

5add_header Access-Control-Allow-Headers
可支持的请求首部名字。请求头会列出所有支持的首部列表,用逗号隔开。
示例:

add_header Access-Control-Allow-Headers "*";

注意以下这些特定的首部是一直允许的:Accept, Accept-Language, Content-Language, Content-Type,这些被称作simple headers,无需特意声明它们。

参考

[1]nginx教程nginx教程
[2]Access-Control-Allow-HeadersAccess-Control-Allow-Headers
[3]Access-Control-Allow-Origin
[4]Accept-Ranges
[5]NGINX缓存详解(二)之服务端缓存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FRC-EP系列--你的汽车数据一站式管家

FRC-EP系列产品主要面向汽车动力总成测试的客户,主要应用方向为残余总线仿真及网关。本文将详细介绍FRC-EP的产品特性和应用场景。 应用场景: 汽车电子生成研发过程中,需要对汽车各个控制器进行仿真测试,典型的测试对象有&#…

原语:串并转换器

串并转换器OSERDESE2 可被Select IO IP核调用。 OSERDESE2允许DDR功能 参考: FPGA原语学习与整理第二弹,OSERDESE2串并转换器 - 知乎 (zhihu.com) 正点原子。 ISERDESE2原语和OSERDESE2原语是串并转换器,他的的功能都是实现串行数据和并行…

基于安卓android微信小程序的物流仓储系统

项目介绍 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对物流仓储系统进行需求分析,得出物流仓储系统主要功能。接着对物流仓储系统进行总体设计和详细…

Halcon的相机内参外参的标定

halcon标定相机内参只能使用方向标定板和圆点标定板。并且方向标定板可也可用性极高。 1.打开halcon的标定助手,选择标定板的描述文件,填写标定板的厚度,根据相机选择像元的尺寸和镜头的焦距。如果已有相机内参,只标定外参&#…

Project#2: Extendible Hash Index

文章目录 准备Task #1-Read/Write Page GuardsBasicPageGuard/ReadPageGuard/WritePageGuardUpgradeWrappersTests Task #2-Extendible Hash Table PagesHash Table Header Pages**成员变量:****方法实现:** Hash Table Directory Pages**成员变量&#…

什么是Node.js的NVM(Node Version Manager)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【ZYNQ】裸机 PS + PL 双网口实现之 SDK 程序设计

涉及 lwip 库文件及 ZYNQ 配置相关可参考以下文章: 【ZYNQ】裸机 PS PL 双网口实现之 LWIP 库文件修改 【ZYNQ】裸机 PS PL 双网口实现之 ZYNQ 配置 工程配置 启动 SDK ,创建模板工程,配置 BSP。 勾选 lwip141 库。 对 lwip 做如下配置…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者:Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability(技术预览版)、Universal ProfilingTM 和 Elastic APM 集成,以及针对 Elastic Observability 的新 SLO &#…

GD32单片机远程升级下载,手机在线升级下载程序,GD32在线固件下载升级,手机下载程序固件方法

GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统B…

Ubuntu22.04配置Go环境

Ubuntu上配置Go环境biCentOS简单多了,有两种方案,一种直接使用apt进行安装,一种自己从官网下载安装包进行安装。 1、使用apt直接安装 更新apt安装包,常规操作 apt update 然后看看apt自带的Go版本是多少 apt list golang 是1…

数据结构——二叉树(2)

接上一篇文章http://t.csdnimg.cn/nsKsW,本次我们接着讲解关于二叉树的相关知识。 一、二叉树的相关性质: 1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 第 i 层上最多有 2^(i-1) 个结点. 2. 若规定根节点的层数为 1 ,则 深度…

【QT】QT自定义C++类

在使用Qt的ui设计时,Qt为我们提供了标准的类,但是在很多复杂工程中,标准的类并不能满足所有的需求,这时就需要我们自定义C类。 下面以自定义的QPushButton作一个很简单的例子。 先新建默认Qt Widgets Application项目 一、自定义…

LabVIEW如何才能得到共享变量的引用

LabVIEW如何才能得到共享变量的引用 有一个LabVIEW 库文件 (.lvlib) ,其中有一些定义好的共享变量。但需要得到每个共享变量的引用以便在程序运行时访问其属性。 共享变量的属性定义在“变量”类属性节点中。为了访问变量类,共享变量的引用必须连接到变…

Leetcode543. 二叉树的直径

Every day a Leetcode 题目来源:543. 二叉树的直径 解法1:深度优先搜索 首先我们知道一条路径的长度为该路径经过的节点数减 1,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减 1。 而任意一条…

linux系统,确认账户密码正确

linux系统,确认账户密码正确 1、问题背景2、解决方法 1、问题背景 有时在linux系统安装软件时,有的软件可能会在安装过程中创建系统用户,同时会给出这个用户的密码。过了一段时间我们不确定这个密码是否还正确,那怎么确认这个密码…

Effective C++ 系列和 C++ Core Guidelines 如何选择?

Effective C 系列和 C Core Guidelines 如何选择? 如果一定要二选一,我会选择C Core Guidelines。因为它是开源的,有300多个贡献者,而且还在不断更新,意味着它归纳总结了最新的C实践经验。最近很多小伙伴找我&#xff…

(自适应移动端)响应式门窗定制pbootcms板 门窗门业网站板下载-带视频功能

(自适应移动端)响应式门窗定制pbootcms模板 门窗门业网站模板下载-带视频功能 PbootCMS内核开发的网站模板,该模板适用于门窗门业网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可; 自适应移动端,…

【ubuntu】ubuntu系统查看服务命令

查看正在运行的服务 sudo service --status-all [] 代表服务是在启动运行的状态 [-] 代表服务是在关闭停止的状态

记录第一次银行测试岗面试【总结几点面试不要犯得错误】

LZ在一个18线小城市做测试,近来想走出自己的舒适区,去做一点不一样的测试工作。 18线地区,测试工作并不多。最好的差不多就是LZ目前待着的公司了。遂决定去魔都闯荡几年,对一个在魔都无房无车无户口的人来讲,这意味着…

LeetCode【30. 串联所有单词的子串】

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["ab","cd","ef"], 那么 "abcdef&…