媒介
在Asp.NetCoreNginx摆设一文中,重要是报告的怎样利用Nginx来实现应用程序的摆设,利用Nginx来摆设重要有两大长处,第一是利用Nginx的负载均衡功能,第二是利用Nginx的反向署理来低落我们后端应用程序的压力。那除了以上两点之外,着实我们还可以利用署理服务器的缓存功能来进一步的低落后端应用程序的压力,提拔体系的吞吐量(tps)。这一篇就来看一下具体应该怎样去做吧。
目次
WEB缓存
ASP.NETCore缓存
内存缓存
分布式缓存
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.NETCore缓存
内存缓存
最简单的一种缓存,ASP.NETCore提供了IMemoryCache接口来供我们利用。它存储在本地的WEB服务器内容中,留意是单机的WEB服务器,假如你必要摆设的是一个服务器集群的话,那么你应该用分布式缓存,而不是选择这个。
就不具体先容了,想相识的可以直接看官方文档。
分布式缓存
随着云应用和服务器集群以及docker等技能的成熟,越来越多的应用程序开始思量集群摆设,由于它具有更好的性能和可伸缩可扩展性。那么这个时间就必要用到分布式缓存了。
在ASP.NETCore应用中,已经对分布式缓存做了抽象,提供了IDistributedCache接口,该接口提供了添加,检索,删除等的同步和异步的方法。而且还默认提供了Redis和SQLServer的分布式缓存实现,我们也可以实现IDistributedCache接口来扩展本身的缓存体系。
必要阐明的是Get,GetAsync和Set,SetAsync。这两个接口方法默认是利用的byte[],之以是没有提供直接存储对象的方法是由于微软想把这个默认序列化的选择交给用户,由于每一个团队的偏好是不一样的,有些团队喜好利用XML,有些喜好利用JSON,有些喜好利用Protobuf等,以是在项目中,你可以根据本身的偏好来扩展想要的方法。
具体利用方法还是直接看官方文档好了。
关于利用也可以查察我的别的一篇博客:ASP.NETCore利用Redis和Protobuf举行Session缓存。
Response缓存
在ASP.NETCore中,有一种缓存叫做Response缓存,这个缓存重要是用来做署理服务器的缓存。它重要原理是在输出的HTTPResponse的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,20Jul201623:00:00GMT"/
在ASP.NETCoreMVC中,提供了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_dir12;#注: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天内都没有被访问,那么文件会被cachemanager进程删撤除#max_size=10g表现这个zone的硬盘容量为10GB
proxy_cache_path/usr/local/nginx/proxy_cache_dir/cache1levels=1:2keys_zone=cache1:100minactive=1dmax_size=10g;
#upstreamweb-app{
#serverwebapp1:5090;#serverwebapp2: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.logfomat1;#$upstream_cache_status表现资源缓存的状态,有HITMISSEXPIRED三种状态add_headerX-Cache$upstream_cache_status;#掷中的正则表达式location~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)${proxy_passhttps://127.0.0.1:5000;#proxy_passhttps://web-app;#proxy_set_headerHost$host;#proxy_set_headerX-Real-IP$remote_addr;#proxy_set_headerX-Forwarded-For$remote_addr;#proxy_set_headerAccept-Encoding"none";#设定proxy_set_headerAccept-Encoding'';(或是背景服务器关闭gzip),如许这台呆板才不会缓存被压缩的文件,造成乱码#proxy_set_headerAccept-Encoding"";这个也可#假如后端的服务器返回502、504、实行超时等错误,主动将哀求转发到upstream负载均衡池中的另一台服务器,实现故障转移。#proxy_next_upstreamhttp_502http_504errortimeoutinvalid_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.NETCore程序中比力紧张,就是proxy_ignore_headers这个设置项,它代表支持背景设定Cache-Control,Expires等。
此中upstream节点是用来设置负载均衡的服务器的,proxy_pass用来设置署理到upstream节点,proxy_next_upstream是用来设置故障转移。
应用设置
利用sudonginx-sreload下令来重新加载设置。
总结
关于缓存
缓存确实是提拔应用程序性能最快也是结果最显着的方式之一,ASP.NETCore也为提供了很多种缓存方法。但是,在利用之前肯定要相识每一种缓存的技能实现,切不可盲目利用。
关于摆设
个人以为,在ASP.NETCore抱负的分布式摆设环境有两种:
第一种是基于云的摆设,比如利用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.NETCore的一键发布。
原文地点:https://www.cnblogs.com/savorboard/p/dotnetcore-nginx-cache.html
.NET社区消息,深度好文,微信中搜刮dotNET跨平台或扫描二维码关注
我要评论