高并发的三剑客 缓存、降级和限流
缓存分类
应用服务器端缓存
redis 、 memcache 、文件缓存、mongodb,等
代理服务器缓存
一般是文件缓存,或者redis
客户端缓存
一般采用浏览器数据库缓存,或者内存机制缓存
nginx 缓存模块配置
upstream imooc {
server 192.168.1.112:8001;
server 192.168.1.112:8002;
server 192.168.1.112:8003;
}
#需要首先配置 缓存目录,文件目录层级2级,空间名字 10m大小,目录最大大小(超过启动nginx自己的淘汰规则),
#在60分钟的时间内没有被访问就会被清理,存放临时文件
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name localhost jeson.t.imooc.io;
#如果url中包含以下路径参数,那么 cookie_nocache 的值为1
if($request_uri ~^/(url3|login|register|password\/reset)){
set $cookie_nocache 1;
}
location / {
proxy_cache imooc_cache; #开启缓存,imooc_cache对应上面keys_zone=imooc_cache:10m ;关闭off
proxy_pass http://imooc;
proxy_cache_valid 200 304 12h; #200和304头信息过期时间12小时
proxy_cache_valid any 10m; #其他过期时间10分钟
proxy_cache_key $host$uri$is_args$args; #定义缓存的key
add_header Nginx-Cache "$upstream_cache_status";#增加一个头信息
#部分不设置缓存 cookie_nocache上面配置的参数, cookie_nocache不为0或者空 那么是不会进行缓存的
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # 一个服务报错请求下一个
}
}
解释:
proxy_cache_path
/opt/app/cache 缓存的跟路径 levels=1:2 采用两级目录来存储缓存文件
keys_zone=imooc_cache:10m
用来在共享内存中定义愉快存储区域来存储缓存的key和metadata(类似使用次数什么的),用来判断是否命中,1M 可以存储8000个key
max_size=10g 最大的cache空间,如果不指定会占用所有disk,当达到设置上线后,会删除最少使用的cache
inactive=60m 过期检查周期,
周期到后,会删除缓存,(注意:expire只判断过期时间,不删除数据,而inactive则直接删除数据)
use_temp_path=off; 如果为off
则将缓存直接写入cache文件中。如果为on,则会把数据写入临时文件。临时文件目录设置proxy_temp_path
proxy_temp_path
定义 proxy_cache 生成临时文件的根路径
proxy_cache_key
定义 proxy_cache 生成文件的名称
proxy_no_cache
用来设定什么情况下不缓存。里面设置的值只要有一项不为0或者不为空时,不缓存数据
proxy_cache_bypass
什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。设置的值只要任何一个不为0或者不为空时,则响应数据不从cache中获取,而是直接从后端的服务器上获取。
proxy_cache
缓存插件的开关,off为关闭,需要开启则填写 keys_zone 填写的内容 从nginx
0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的"Cache-Control"、"Expire"头域。
如,Cache-Control为no-cache时,是不会缓存数据的
proxy_cache_valid
对指定的 HTTP 状态进行缓存,并指定缓存时间。可以自定义写入多个配置项 eg:proxy_cache_valid 304
2h; proxy_cache_valid 403 444 24h; proxy_cache_valid any 10m;
针对多有请求状态
proxy_next_upstream
nginx的重试机制
error # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header # 服务器返回空的或无效的响应;
http_500 # 服务器返回代码为500的响应;
http_502 # 服务器返回代码为502的响应;
http_503 # 服务器返回代码为503的响应;
http_504 # 服务器返回代码504的响应;
http_403 # 服务器返回代码为403的响应;
http_404 # 服务器返回代码为404的响应;
http_429 # 服务器返回代码为429的响应(1.11.13);
non_idempotent # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
off # 禁用将请求传递给下一个服务器。
负载均衡配置
proxy_pass http://app-proxy;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3; # 重试三次
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s; # 连接 读取 发送都为60秒
proxy_pass_request_headers on; #设置请求头,类似改写请求头
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $domain default;