缓存中间件-缓存架构的实现(上) (3)

与此同时,当后面的应用服务器无法提供服务时(如宕机),Nginx服务器上的缓存资源还能够回应相关的用户请求,提高了后面应用服务器的鲁棒性(健壮性)。

优势

商业成本无。Nginx是开源的,无需商业付费。

技术迭代成本低。现有的Web体系大多采用Nginx,进行技术迭代时,在Nginx只需要增加一个新的模块即可。

可定制。可以根据需要,对指定路径,指定资源等进行定制化的缓存策略。

缺点

需要对Nginx的缓存模块进行一定的认识与学习。毕竟很多人使用Nginx都只是CV一下配置。

需要根据业务需要与技术特点,进行缓存策略的调整。如果缺乏经验与足够的认识,可能会指定出不恰当的缓存技术规范(如哪些数据该走Nginx缓存模块等)。

基本认识 缓存文件位置设置

通过proxy_cache_path参数指定。proxy_cache_path有两个必填参数:

第一个参数为缓存目录。

第二个keys_zone参数指定缓存名称和占用内存空间的大小。

指定特定请求被缓存

Nginx默认会缓存所有get和head方法的请求结果,缓存的key默认使用请求字符串

自定义key。如proxy_cache_key "$host$request_uri$cookie_user";

指定请求至少被发送了多少次以上才被缓存,从而避免低频请求被缓存。如proxy_cache_min_uses 5;

指定哪些方法的请求被缓存。如proxy_cache_methods GET HEAD POST;

缓存有效期

默认情况下,缓存内容是长期留存,除非缓存的容量超出谁知的限制。也可以自定义设置有效时间。如:

响应状态码为200 302时,10分钟有效期限:proxy_cache_valid 200 302 10m;

对任何状态码,5分钟有效期限:proxy_cache_valid any 5m;

部分请求跳过缓存

通过proxy_cache_bypass指令,明确请求对应的响应来自原始数据,而不是缓存。

例如(该示例来自网易云课堂) proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

表示:如果任何一个参数不为空,或者不等于0,nginx就不会查找缓存,直接进行代理转发。

扩展

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private,no-cache,max-age,must-revalidate等,默认为private。详见下表:

在这里插入图片描述

Squid缓存服务器

其实Squid缓存服务器与Nginx缓存十分类似(毕竟Nginx的缓存就是仿照Squid的),所以这里只是表示有这么个选择,不做深入。

Lua扩展

Nginx是C语言开发(这也是Nginx高性能的根本原因之一),并且Nginx模块需要用C开发,并且需要符合一系列复杂的规则,还需要熟悉Nginx源码。

ngx_lua模块

所以Nginx提供了ngx_lua模块,通过lua解释器集成进Nginx。而ngx_lua模块具备以下特性:

高并发,非阻塞地处理各种请求。

Lua内建协程(可对比golang),从而将异步回调转换成顺序调用的形式。

每个协程都有一个独立的全局环境(变量空间),继承于全局共享的,只读的“comman data”。

上述只是简单提一下Lua扩展,感兴趣的可以查询相关资料。

这里继续阐述Lua扩展,实现缓存功能。

实际应用

为了帮助大家理解,先说一下实际应用。

Nginx针对HTTP请求处理,有十一个阶段。与之相对的,ngx_lua模块的执行指令都包含在了上述的十一个阶段。这里只说一下其中的content_by_lua指令,针对的是Nginx的content阶段,可以在location,location if范围内使用,主要作为内容处理器,接收请求处理并输出响应。

具体配置如下:

在这里插入图片描述

这样配置后,直接浏览器访问本地ip(或者通过curl命令),可以看到“Hello,world”。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfxfw.html