媒介
在Asp.Net Core Nginx摆设 一文中,重要 是报告 的怎样 利用 Nginx来实现应用程序的摆设 ,利用 Nginx来摆设 重要 有两大长处 ,第一是利用 Nginx的负载均衡 功能,第二是利用 Nginx的反向署理 来低落 我们后端应用程序的压力。那除了以上两点之外 ,着实 我们还可以利用 署理 服务器的缓存功能来进一步的低落 后端应用程序的压力,提拔 体系 的吞吐量(tps)。这一篇就来看一下具体 应该怎样 去做吧 。
目次
WEB 缓存
ASP.NET Core 缓存
内存缓存
分布式缓存
Response 缓存
Nginx 缓存
总结
WEB 缓存
之以是 加这个目次 是由于 有一部分 初学者对缓存的认知不敷 ,特别 是WEB中的缓存。
缓存它是一种空间调换 时间的一种技能 。
Web缓存(或HTTP缓存)是用于Web文档 ,如HTML页面和图像,镌汰 带宽的利用 ,服务器的负载的一种信息技能 。一个Web缓存体系 存储通过Cache来转达 的文件的副本;假如 满意 某些条件 ,则可以从缓存中得到后续的哀求 。
WEb缓存有几种方式:
1、服务端缓存
利用 Memcached,Redis,In-Memery 等缓存技能 实现对数据的缓存。
2、署理 服务器缓存
利用 雷同 nginx的反向署理 服务器 ,对哀求 的url对应的输出的举行 缓存 。这个缓存和应用程序实现的动态页面缓存雷同 ,只不外 用反向署理 充当了应用程序的缓存实现。
3 、客户端缓存
欣赏 器缓存,着实 重要 就是HTTP协议界说 的缓存机制(如: Last-Modified,If-Modified-Since,Expires; Cache-control等)。
ASP.NET Core 缓存
内存缓存
最简单 的一种缓存 ,ASP.NET Core 提供了 IMemoryCache 接口来供我们利用 。它存储在本地 的 WEB 服务器内容中,留意 是单机的 WEB 服务器,假如 你必要 摆设 的是一个服务器集群的话 ,那么你应该用分布式缓存,而不是选择这个。
就不具体 先容 了,想相识 的可以直接看官方文档。
分布式缓存
随着云应用和服务器集群以及 docker 等技能 的成熟 ,越来越多的应用程序开始思量 集群摆设 ,由于 它具有更好的性能和可伸缩可扩展性 。那么这个时间 就必要 用到分布式缓存了。
在 ASP.NET Core应用中,已经对分布式缓存做了抽象 ,提供了 IDistributedCache 接口,该接口提供了添加,检索 ,删除等的同步和异步的方法。而且 还默认提供了 Redis 和 SQLServer 的分布式缓存实现,我们也可以实现 IDistributedCache 接口来扩展本身 的缓存体系 。
必要 阐明 的是Get,GetAsync和Set,SetAsync 。 这两个接口方法默认是利用 的byte[],之以是 没有提供直接存储对象的方法是由于 微软想把这个默认序列化的选择交给用户,由于 每一个团队的偏好是不一样的 ,有些团队喜好 利用 XML,有些喜好 利用 JSON,有些喜好 利用 Protobuf 等 ,以是 在 项目中,你可以根据本身 的偏好来扩展想要的方法。
具体 利用 方法还是 直接看官方文档好了。
关于利用 也可以查察 我的别的 一篇博客: ASP.NET Core 利用 Redis 和 Protobuf 举行 Session 缓存 。
Response 缓存
在 ASP.NET Core中,有一种缓存叫做Response缓存 ,这个缓存重要 是用来做署理 服务器的缓存。它重要 原理是在输出的HTTP Response的header内里 添加指定的缓存标记 。这些缓存标记 用来让客户端大概 署理 服务器来辨认 必要 缓存的内容 。然后当客户端有哀求 到署理 服务器的时间 ,署理 服务器可以辨认 出一部分 哀求 ,然后直接把结果 返回给欣赏 器 ,从而进步 后端应用程序的性能和吞吐。
从这个图中看出来,在第一次的时间 ,一个客户端哀求 颠末 署理 服务器哀求 的我们后端的WEB服务器上 ,然后WEB服务器在返回结果 的META上添加了cache-control标签,它的值为public。
下面是cache-control标签一些值的阐明 :
public 指示相应 可被任何缓存区缓存 。
private 指示对于单个用户的整个或部分 相应 消息,不能被共享缓存处理 惩罚 。这答应 服务器仅仅形貌 当用户的部分 相应 消息,此相应 消息对于其他用户的哀求 无效。
no-cache 指示哀求 或相应 消息不能缓存(HTTP/1.0用Pragma的no-cache更换 )根据什么能被缓存
max-age 指示客户机可以吸取 生存期不大于指定时间(以秒为单位 )的相应 。
min-fresh 指示客户机可以吸取 相应 时间小于当前时间加上指定时间的相应 。
max-stale 指示客户机可以吸取 超出超时期间的相应 消息。假如 指定max-stale消息的值 ,那么客户机可以吸取 超出超时期指定值之内的相应 消息。
Expires 表现 存在时间,答应 客户端在这个时间之前不去查抄 (发哀求 ),等同max-age的
结果 。但是假如 同时存在 ,则被Cache-Control的max-age覆盖。
格式:
Expires = "Expires" ":" HTTP-date
通过HTTP的META设置expires和cache-control
metahttp-equiv="Cache-Control"content="max-age=7200"/metahttp-equiv="Expires"content="Mon, 20 Jul 2016 23:00:00 GMT"/
在 ASP.NET Core MVC 中,提供了ResponseCache这个特性用来做上面这些事变 。它被作为一个Attribute添加的Controller的Action上 。
Duration 指示缓存的逾期 时间,对应到Cache-Control 的 max-age 。
Location 有三个值Any,Client,None分别对应到Cache-Control的 public ,private,no-cache。
NoStore 设置值是否被存储 。假如 是true,它将设置Cache-Control为no-store
VaryByHeader 将在header中添加Vary标记 。
CacheProfileName 利用 的战略 ,在startup.cs中设置。
Order 在过滤器中的排序 。
如今 ,我们已经知道了假如 在Action中设置缓存标记 了。
Nginx 缓存
对于一些静态文件,比如 程序用到的图片 ,css,js等,Nginx是可以直接处理 惩罚 的,只必要 设置 一下。
假如 利用 Nginx来处理 惩罚 静态文件的话 ,那么程序中startup.cs就可以不消 添加app.UseStaticFiles();中心 件了 。
设置
打开nginx.conf文件,在ubuntu体系 下位于/etc/nginx/conf.d/nginx.conf没有的话就新建一个。内容如下:
proxy_temp_path/usr/local/nginx/proxy_temp_dir 12; #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#keys_zone=cache1:100m 表现 这个zone(缓存地区 )名称为cache1,分配的内存巨细 为100MB
#/usr/local/nginx/proxy_cache_dir/cache1 表现 cache1这个zone的文件要存放的目次
#levels=1:2 表现 缓存目次 的第一级目次 是1个字符 ,第二级目次 是2个字符,即/usr/local/nginx/proxy_cache_dir/cache1/a/1b这种情势
#inactive=1d 表现 这个zone中的缓存文件假如 在1天内都没有被访问,那么文件会被cache manager进程 删撤除 #max_size=10g 表现 这个zone的硬盘容量为10GB
proxy_cache_path/usr/local/nginx/proxy_cache_dir/cache1 levels=1:2keys_zone=cache1:100minactive=1dmax_size=10g;
#upstream web-app {
# server webapp1:5090;# server webapp2:5090;#}
server{
listen80;
server_name*.example.com; #在日记 格式中参加 $upstream_cache_statuslog_formatformat1 '$remote_addr- $remote_user[$time_local] ''"$request" $status$body_bytes_sent''"$http_referer" "$http_user_agent" $upstream_cache_status'; #访问日记 access_loglog/access.log fomat1; #$upstream_cache_status表现 资源缓存的状态 ,有HIT MISS EXPIRED三种状态add_headerX-Cache $upstream_cache_status; #掷中 的正则表达式location~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)${ proxy_passhttps://127.0.0.1:5000; #proxy_pass https://web-app; #proxy_set_header Host $host;#proxy_set_header X-Real-IP $remote_addr;#proxy_set_header X-Forwarded-For $remote_addr;#proxy_set_header Accept-Encoding "none";#设定proxy_set_header Accept-Encoding '';(或是背景 服务器关闭gzip),如许 这台呆板 才不会缓存被压缩的文件,造成乱码#proxy_set_header Accept-Encoding ""; 这个也可#假如 后端的服务器返回502、504、实行 超时等错误 ,主动 将哀求 转发到upstream负载均衡 池中的另一台服务器,实现故障转移。#proxy_next_upstream http_502 http_504 error timeout invalid_header;#设置资源缓存的zoneproxy_cachecache1; #设置缓存的keyproxy_cache_key$host$uri$is_args$args; #设置状态码为200和304的相应 可以举行 缓存,而且 缓存时间为10分钟proxy_cache_valid20030410m; # **!!!紧张 !!!** 这段设置 加上后 ,proxy_cache就能支持背景 设定的Cache-Control,Expires。 proxy_ignore_headers"Cache-Control""Expires"; expires30d; } }
上面有一个设置 项在 ASP.NET Core 程序中比力 紧张 ,就是proxy_ignore_headers这个设置 项,它代表支持背景 设定Cache-Control ,Expires等 。
此中 upstream节点是用来设置 负载均衡 的服务器的,proxy_pass用来设置署理 到upstream节点,proxy_next_upstream是用来设置 故障转移。
应用设置
利用 sudo nginx -s reload下令 来重新加载设置 。
总结
关于缓存
缓存确实是提拔 应用程序性能最快也是结果 最显着 的方式之一 ,ASP.NET Core也为提供了很多 种缓存方法 。但是,在利用 之前肯定 要相识 每一种缓存的技能 实现,切不可盲目利用 。
关于摆设
个人以为 ,在 ASP.NET Core 抱负 的分布式摆设 环境 有两种:
第一种是基于云的摆设 ,比如 利用 Azure,AWS ,阿里云等,那么我们可以利用 他们提供的负载均衡 器来资助 我们拦截大水 般的哀求 ,然后借助于云提供的高可用的实例集群大概 Docker集群来低落 应用程序的压力 ,提拔 吞吐。
比如 我们项目如今 利用 的AWS的摆设 环境 ,借助于AWS来实现企业的私有云,包罗 高可用的Redis集群,弹性EC2集群 ,RDS集群,S3等,这个时间 只必要 专注于业务 。
第二种是本身 搭建集群环境 ,可以在服务器前端利用 Nginx的负载均衡 和缓存来拦截大部分 的HTTP哀求 ,然后后端利用 Docker集群来做摆设 。
Docker摆设 可以拜见 本人的别的 一篇文章:https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==mid=2654067746idx=1sn=5038e9ab3460066e736894c7ac8846eascene=21#wechat_redirect
在版本的快速迭代过程中,你还必要 做的工作有怎样 进步 摆设 的工作服从 ,那么可以利用 一些Docker集群管理工具,背面 会写一篇文章专门先容 Docker的集群管理和 ASP.NET Core的一键发布。
原文地点 :https://www.cnblogs.com/savorboard/p/dotnetcore-nginx-cache.html
.NET社区消息 ,深度好文 ,微信中搜刮 dotNET跨平台或扫描二维码关注