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

bash 复制代码
server{
	listen port;
	server_name localhost;
	location /{
	}
	location /abc{
	}
	...
}

location:用来设置请求的URI

2.2.2 匹配

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

=:用于不包含正则表达式的uri前,必须与指定的模式精确匹配

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

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

~:正则匹配

bash 复制代码
location ~/abc{
	}

root:

bash 复制代码
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 语法

python 复制代码
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

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

开启

python 复制代码
proxy_cache zone_name

关闭

python 复制代码
proxy_cache off

位置:http、server、location里

3.4 proxy_cache_key

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

位置同上

3.5 proxy_cache_valid

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

位置同上

python 复制代码
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

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

python 复制代码
proxy_cache_min_uses number

位置同上

3.7 proxy_cache_methods

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

python 复制代码
proxy_cache_methods method

method可选方式为GET, HEAD, POST.

默认方式为GET, HEAD。

位置同上。

4 add_header 可选项

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

bash 复制代码
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

可支持的请求首部名字。请求头会列出所有支持的首部列表,用逗号隔开。

示例:

bash 复制代码
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缓存详解(二)之服务端缓存

相关推荐
IT女孩儿1 小时前
CSS查缺补漏(补充上一条)
前端·css
贰十六1 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
学Linux的语莫2 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
虾球xz2 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇2 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐3 小时前
前端图像处理(一)
前端
程序猿阿伟3 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端