• 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{
    	}
    	...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    location:用来设置请求的URI

    2.2.2 匹配

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

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

    location /abc{
    	}
    
    • 1
    • 2
    location =/abc{
    	}
    # 精确匹配
    # ip:port/abc、ip:port/abc?p1=TOM可以匹配
    # ip:port/abcd不能匹配
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ~:正则匹配

    location ~/abc{
    	}
    
    • 1
    • 2

    root:

    location /abc{
    	root html;
    	# root为资源存放的目录
    	inedx index.html;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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]
    
    • 1

    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
    
    • 1

    关闭

    proxy_cache off
    
    • 1

    位置: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
    • 2
    • 3

    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
    
    • 1

    位置同上

    3.7 proxy_cache_methods

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

    proxy_cache_methods method
    
    • 1

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

    4 add_header 可选项

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

    add_header nginx-cache $upstream_cache_status;
    
    • 1

    效果:
    在这里插入图片描述
    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 "*";
    
    • 1

    注意以下这些特定的首部是一直允许的: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缓存详解(二)之服务端缓存

  • 相关阅读:
    un7.27:如何在idea中成功搭建若依框架项目?
    BevFusion (2): nuScenes 数据介绍及点云可视化
    Python中print()打印如何不换行?
    【算法100天 | 18】回文链表的多种解法(JAVA实现)
    基于springboot的实习管理系统设计与实现-计算机毕业设计源码
    基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置
    ansible安装及快速应用
    [附源码]计算机毕业设计疫情防控管理系统Springboot程序
    pytest-fixture固件的使用
    【知识网络分析】耦合网络(bibliographic coupling)
  • 原文地址:https://blog.csdn.net/woshicaiji12138/article/details/134032204