媒介
在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跨平台或扫描二维码关注