如何在.NET中使用Nginx缓存
如何在.NET中使用Nginx缓存
前言
缓存对于大家来说已经不是很陌生了,同学们或多或少都有听到过缓存,比如计算机硬件里的CPU,他就有缓存,还有呢就是经常使用的浏览器,也是有缓存的
那这里就有一个问题,我们直接去访问我们的WEB服务也是可以的,我们为什么要用缓存呢?
那在我们的项目中,缓存要怎么使用呢?
就是要把我们经常要用到或者说是要访问的东西,把他存起来,以便于我们下次访问的时候呢,我们就可以直接读取我们已经存到缓存中的东西或者是内容。缓存不仅可以加速我们的访问,还可以改善网站的性能,同时减轻上游服务器的负担。
Nginx同样也可以实现缓存,比如说像把一些热点的数据,或者说是经常访问的页面,还有经常访问的一些数据,他们呢,都可以缓存到我们nginx 的一个进程中
当我们要访问我们经常使用的数据的时候呢,Nginx 他就不会再去请求我们的服务器了,而是直接从Nginx自己的一个缓存进程的管理器中,把我们想要的数据都给提取出来,这样,我们就不通过服务器了,还有一个好处,可以减轻我们的服务器的一个压力,负载能力也随之降低了,返回给用户的响应就非常的快了
这时候可能会有人有些疑问,就是.NET中已经有缓存了,我们为什么要在Nginx中使用缓存?
举个例子再简单的说明一下:如果多客户端请求相同的资源,代理服务器缓存命中后,对于.NET WEB服务器来说,只发生了一次资源调度,而WEB服务器上的缓存设置,一般来说是用来减少本地IO的,请求目标的内容会放在客户端本地
所以说,缓存是可以加速我们页面访问的,同时也可以加速我们网站的响应速度。
缓存配置项
proxy_cache_path配置
语法: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [max_size=size] [inactive=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time];
可配置段: http
作用: 指定缓存位置、缓存名称、内存中缓存内容元数据信息大小限制、缓存总大小限制。缓存位置是一个目录应该先创建好,nginx并不会帮我们创建这个缓存目录。
参数释义:
- path:定义缓存文件存放位置;
- levels:定义缓存路径的目录层级,默认所有缓存文件都放在上面指定的根路径中,最多三级,每层目录长度为1或2字节;
- keys_zone:name表示共享内存名称,用于在共享内存中定义一块存储区域来存放缓存的 key,这样 nginx 可以快速判断一个请求是否命中缓存。size表示共享内存大小,1mb大约可以存放8000个key;
- max_size:设置缓存大小的上限。它是可选的,不指定值允许缓存增长以使用所有可用磁盘空间。当缓存大小达到限制时,称为缓存管理器的进程将删除最近最少用于将缓存大小恢复到限制之下的文件;
- inactive:在inactive时间内没有被访问的缓存会被淘汰掉,默认是10分钟;
- use_temp_path:如果为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 temp_path 指定的临时存储路径
proxy_cache配置
语法: proxy_cache zone | off
默认: proxy_cache off
可配置段: http、server、location
作用: 设置是否开启对后端响应的缓存,如果开启的话,参数值就是zone的名称。
proxy_cache_valid配置
语法: proxy_cache_valid [code ...] time;
可配置段: http、server、location
作用: 默认情况下,缓存的内容是长期存留的,除非缓存的总量超出限制,此字段可配置不同的响应码缓存不同的时长,即指定缓存的有效期。
proxy_cache_key配置
语法: proxy_cache_key string;
默认: proxy_cache_key $scheme$proxy_host$request
可配置段: http、server、location
作用: 给缓存设定key。如缓存url。
在Nginx中配置缓存如下所示:
# 缓存配置
# path:这里设置的是 /home/codeman/cache01
# levels:这里设置的是 levels=1:2 表示第一级目录是1个字符,第二级目录呢是2个字符
# keys_zone:这里设置的是 keys_zone=cache01:10m, cache01就是共享内存区的名字,10m呢就是开辟了10m的共享内存区
# max_size:这里设置的是 max_size=1g,表示当达到1G时会移除最近访问比较少的内容
# inactive:这里设置的是 inactive=1d,表示的是一天的意思
proxy_cache_path /home/codeman/cache01 levels=1:2 keys_zone=cache01:10m max_size=1g inactive=1d;
upstream local {
server 192.168.3.9:8888 weight=1;
server 192.168.3.9:9999 max_fails=1 fail_timeout=30s;
server 192.168.3.9:7777 backup;
}
server {
listen 80;
server_name codeman.kevin.pub;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X_Forwarded-For $proxy_add_x_forwarded_for;
# 设置proxy_cache是开启状态,那他的参数值 cache01就是他的名称,一般情况下,要跟上面配置的路径,还有共享内存的名称是一样的,也是便于我们自己进行查找
proxy_cache cache01;
# 响应状态码为 200,302时,10天内有效,响应状态码为404时,1天内有效
proxy_cache_valid 200 302 10d;
proxy_cache_valid 404 1d;
# 给缓存设定的key,为url
proxy_cache_key $uri;
# 添加头信息 add_header,头信息名称 cache_status,缓存状态有两个参数,一个是 hit 状态表示缓存命中,还有一个是miss 状态表示缓存未命中,这两个状态是经常用到的
add_header cache_status $upstream_cache_status;
proxy_pass http://local;
}
提示:在如上缓存工作中有两个附加进程:
- 缓存管理器:定期检查缓存状态,看缓存总量是否超出限制,如果超出,就移除其中最少使用的部分
- 缓存加载器:加载器只在nginx启动后运行一次,把缓存内容的元数据信息加载到内存空间,如果一次性加载全部缓存信息,会大量消耗资源,使nginx在启动后的几分钟里变慢,为避免此问题,有3种加载策略:
- loader_threshold:指定每次加载执行的时间
- loader_files:每次最多加载的数量
- loader_sleeps:每次加载的延时
Nginx配置之后我们重新启动Nginx,可以看到配置的缓存路径是没有值
然后我们在访问测试页面的,验证缓存是否生效
地址:codeman.kevin.pub
这是第一次访问页面,浏览器的缓存状态显示的是 MISS,缓存未命中状态
再次刷新访问页面,浏览器的缓存状态显示是 HIT,缓存命中状态
我们也可以看到我们设置的缓存路径也是有内容的
到此代理层缓存就介绍完了
了解更多可扫码关注公众号