Nginx学习笔记(五、Nginx缓存与限流)

目录:

  • Nginx缓存
  • Nginx限流

Nginx缓存

顾名思义,Nginx缓存就是Nginx在接受到代理服务器的数据后,根据Cache的配置将这样写数据缓存到本地硬盘。

当客户端下次访问相同数据时,Nginx服务器直接从硬盘检索到响应的数据给客户,从而减少于被代理服务器交互的时间。

1、Cache配置:

 1 proxy_temp_path  /usr/local/nginx/proxy_temp 1 2;
 2 proxy cache_path /usr/local/nginx/proxy_cache/mycache levels=1:2 keys_zone=mycache:100m inactive=1d max_size=1g;
 3 
 4 location ~^.(png|jpg|gif|css|js|html)$ {
 5     # cache config
 6     proxy_cache         mycache;
 7     proxy_cache_key     $host$uri;
 8     proxy_cache_valid   200 206 304 301 302 10m;
 9     expires             30d;
10     
11     # proxy_pass
12     proxy_set_header    Host $host:$server_port;
13     proxy_set_header    X-Real-IP $remote_addr;
14     
15     # cache有HIT、MISS、EXPIRED三种状态
16     proxy_set_header    X-Cache $upstream_cache_status;
17     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
18     proxy_pass          http://127.0.0.1:8080/;
19 }
  • proxy_temp_path:临时文件存放路径。1 2的意思是文件按照二级hash目录存放,一级目录1个字符,二级目录2个字符。
    • 目录字符按照16进制存放,1级0-f,2级00-ff;nginx会把请求hash后,再放入对应的路径,取出同理(注意:它是懒hash,非一开始全部创建所有的一级二级目录)。
  • proxy_cache_path:缓存文件的存放路径。
    • levels:1:2表示两级hash目录存放,同proxy_temp_path。
    • keys_zone:设置缓存名字和缓存内存的大小(格式=缓存名:内存大小)。
    • inactive:在指定时间内没有被访问的cache将被删除。
    • max_size:最大缓存空间,如果缓存空间满了,默认会覆盖掉缓存时间最长的资源。
  • proxy_cache_key:定义缓存唯一key,判断缓存存放的路径就是用此key的hash值。
  • proxy_cache_valid:设置缓存内容和时间,上述示例则是对httpcode=200、206、304、301、302进行10分钟的缓存。

Nginx限流

Nginx限流的方式:

测试限流的压测工具:apache bench(可用于简单的压测)。

1、令牌桶:

原理解析:

  • 令牌以固定速率产生,并缓存到令牌桶中;令牌桶最多存放N个令牌,放满时多余的令牌将被丢弃
  • 请求数量要与产生的令牌数量等比才能都被处理;当令牌不足N个时,多余令牌也不会被删除;当请求大于令牌数量时,请求会被缓存或丢弃(看所需的策略)。

2、漏桶:

原理解析:

  • 固定容量的漏桶,按照固定速率流出请求;
  • 漏桶的容量不便,可以以任意速率放入请求到漏桶;
  • 如果桶是空的,则不需要流出请求;如果放入的请求超过桶的容量,则多余的请求将被丢弃。

 令牌桶和漏桶的区别:

令牌桶算法和漏桶算法最明显的区别就是是否允许突发流出的处理。

我们可以想想,令牌桶是均匀的产生令牌放入桶中,当流量低峰时,桶中的令牌数任然保持为N-X(N=桶的容量,X=当前时间的请求数),即使是突发流量的到来也能处理最大为N的请求数。

而漏桶则不能应对突发流量,因为漏桶的流速是始终固定的,突发流量的到来会导致请求溢出。

Nginx连接数限流配置:

 1 http {
 2     # limit connections
 3     limit_conn_zone      $binary_remote_addr zone=addr:10m;
 4     limit_conn_zone      $server_name zone=preserver:10m;
 5     limit_conn_log_level error;
 6     limit_conn_status    503;
 7     
 8     server {
 9         listen      80;
10         server_name www.xxxxxx.com
11         
12         location / {
13             root  html;
14             index index.html index.htm
15             
16             limit_conn_addr 1;
17             limit_conn preserver 2;
18         }
19     }
20 }

limit_conn:存key和计数器的共享内存区域和指定key的最大连接数。

limit_conn_zone:用于配置限流key及存放key对应信息的共享内存区域大小。$binary_remote_addr标识根据IP地址,也可以使用$server_name来限制域名最大数。

limit_conn_status:被限流后返回的状态码。

limit_conn_log_level:被限流后记录日志的级别,默认error级别。

Nginx请求限流配置(漏桶算法):

 1 http {
 2     limit_req_zone       $binary_remote_addr zone=addr:10m rate=1r/s;
 3     limit_conn_log_level error;
 4     limit_conn_status    503;
 5     
 6     server {
 7         listen      80;
 8         server_name www.xxxxxx.com
 9         
10         location / {
11             root  html;
12             index index.html index.htm
13             
14             # burst默认值是0;延迟模式默认是delay。
15             limit_req zone=addr 1 burst=5 noelay;
16         }
17     }
18 }

limit_req:配置限流区域、桶容量(突发容量,默认为0)、是否延迟(默认延迟)。

limit_req_zone:限流key,存放key对应信息的共享内存区域大小、固定请求速率。固定请求速率支持10r/s或者60r/m,即每秒10个请求或每分钟60个请求。

limit_conn_status:被限流后返回的状态码。

limit_conn_log_level:被限流后记录日志的级别,默认error级别。

基于连接和基于请求有啥区别:

基于连接,限制并发连接数;基于请求,限制访问频率。

原文地址:https://www.cnblogs.com/bzfsdr/p/14014633.html