Nginx缓存基础

news2024/12/25 9:05:21

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缓存详解(二)之服务端缓存

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

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

相关文章

ChatGPT - 在ChatGPT中设置通用提示模板

文章目录 Prompt设置验证 Prompt VERBOSITY: 我可能会使用 V[0-3] 来定义代码的详细程度:V0 简洁明了 V1 简练 V2 详细 V3 非常详细,附有例子助理回应 您是用户问题背景下的主题专家。我们一步一步来:除非您只是回答一个简短的问题&#xff…

Confluence 漏洞复现(CVE-2023-22515)

Confluence 漏洞复现(CVE-2023-22515,CVE-2023-22518) 1.CVE-2023-22515权限提升漏洞 1.1漏洞描述 Confluence近期推出的严重漏洞cve-2023-22515,由于未授权和xwork框架问题,导致攻击者可以未授权将系统设置为未安装…

分布式事务的华丽进化

说到分布式事务,大家并不陌生。之前我已做过相关的总结(连接附本文后面),不过比较偏理论。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做…

使用nginx作为图片服务器

第一步: 下载nginx版本,去官网下载,这里不建议下载最新版本,因为有时候最新版本还不太稳定。 nginx下载地址官网:nginx: download,然后把下载好的安装包解压出来。 第二步: 在nginx目录下载创建…

在新的服务器上成功安装mysqlclient的方法【解决No matching distribution found for mysqlclient的问题】

前言:在某台Centos服务器上安装mysqlclient时一直报下面的错: WARNING: Discarding https://mirrors.aliyun.com/pypi/packages/6a/91/bdfe808fb5dc99a5f65833b370818161b77ef6d1e19b488e4c146ab615aa/mysqlclient-1.3.0.tar.gz#sha25606eb5664e3738b28…

【2】Spring Boot 3 项目搭建

目录 【2】Spring Boot 3 初始项目搭建项目生成1. 使用IDEA商业版创建2. 使用官方start脚手架创建 配置与启动Git版本控制 个人主页: 【⭐️个人主页】 需要您的【💖 点赞关注】支持 💯 【2】Spring Boot 3 初始项目搭建 项目生成 1. 使用IDEA商业版创…

[sd_scripts]之config

https://github.com/kohya-ss/sd-scripts/blob/main/docs/config_README-ja.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/config_README-ja.md[Stable Diffusion]训练你的LoRA(Linux) - 知乎简介LoRA 是一种参数高效微调方法(PEFT)&#x…

原型链污染漏洞

想要很清楚了理解原型链污染我们首先必须要弄清楚原型链这个概念 可以看这篇文章:对象的继承和原型链 目录 prototype和__proto__分别是什么? 原型链继承 原型链污染是什么 哪些情况下原型链会被污染? 例题1:Code-Breaking 2…

软件测试|PO设计模式在 UI 自动化中的实践

PO的思想最早是2013年由IT大佬Martin Flower提出的:https://martinfowler.com/bliki/PageObject.html 没错,就是他 — 没错,就是他 — 在他的文章里有这样一张经典样图,图片中展示了测试代码中直接操作HTML元素和使用PO模式将page对象封装成…

Android JVM内存模型——老生常谈

jvm简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 jvm作用 Java中的所有类,必须…

Web自动化测试入门篇详解

一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持&…

阿里云e实例服务器3M固定带宽40G ESSD entry系统盘99元/年

阿里云99元服务器新老用户均可以买,你没看错,老用户可以买,活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘,并且续费不涨价,原价99元即可续费&#xff0c…

阿里云99元服务器40G ESSD Entry云盘、2核2G3M带宽配置

阿里云99元服务器新老用户均可以买,你没看错,老用户可以买,活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘,并且续费不涨价,原价99元即可续费&#xff0c…

学之思项目的搭建部署 打jar包失败的解决方法

学之思系统介绍部署java环境安装maven安装node.js前端打包工具命令npmGit命令获取源代码安装配置mysql前端打包打包jar包服务上线!!!打jar包失败的解决方法 学之思系统介绍 学之思开源考试系统是一款 java vue 的前后端不分离的考试系统。主要优点是开发、部署简单快捷、界面…

咖啡机、电热水壶、豆浆机上架亚马逊美国站UL1082认证标准

咖啡机、电热水壶、豆浆机UL1082报告亚马逊美国站,UL1082标准是指室内用的,咖啡机、电热水壶、豆浆机以及滴落式类加热产品的标准。UL标准是美国的检测标准,目前跨境电商亚马逊美国站需要商家提供产品的UL报告,其中UL1082报告就是…

centos配置docker环境

CentOS系统更换软件安装源 yum默认链接的还是国外的镜像,速度相对不理想,配置成国内的镜像会快很多,这里以阿里镜像为例进行配置: 首先进行更新: yum updatebase源 第一步:备份你的原镜像文件,以免出错后…

常孝元宇宙·《神由都城》首场招商会圆满举办

11月4日,常孝元宇宙《神由都城》首场招商会在常州中华孝道园召开。《神由都城》招商会面向所有合伙人,全面展现常孝股份元宇宙得天独厚的线上线下相结合的模式、广阔的发展空间和优质的运营环境,以一场高规格的招商盛会,吹响常孝股份全面推进元宇宙高质量发展的奋进号角。 招商…

[鹏程杯2023]复现

SecretShare X的20个值和R的21个值已经被全部泄露,X和R都是1024bit的值,此时X总共泄露了32*20 640,于是,此时我们可以使用mt19937将其还原,还原之后,我们往前推20个1024bit的值,便可以求得A的…

华为ipsec vpn模版型(总部固定地址,其它分部无固定地址)

fw_c和fw_b配置一样 上表路由部分就是防火墙都要有默认路由指向公网 那个auto-neg如果不加,分部访问分部可能会不通。 查看 dis ike sa 此架构,总部不能主动访问分部

运行springboot时提示:源值 7 已过时,将在未来版本中删除,并且提示java.time not exist, LocaDateTime类找不到。

运行springboot时提示:源值 7 已过时,将在未来版本中删除,并且提示 java.time not exist, LocaDateTime类找不到。 解决方法: 方式一:通过IDEA修改这几个地方的JDK版本 1)打开ProjectStructure->Proj…