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级别。
基于连接和基于请求有啥区别:
基于连接,限制并发连接数;基于请求,限制访问频率。