Nginx/tengine做cache时缓存机制—存不存、存多久、用不用方法论

    Nginx/tengine(后面名称只写nginx了)单纯做cache性能比不过ats,特别是在磁盘处理方面,不过论综合能力nginx就是大拿了,他集web服务器、负载均衡、cache三种能力于一身,可以说是非常综合性的选手。比如说一个中型网站的场景选型,前端是负载,后端托着一堆apache服务器,现在该到前端负载选型的了,虽然lvs和ha单纯从负载的性能要比nginx好一些,但我还是会选nginx,因为nginx在做负载的同时,可以将热点的静态内容cache一遍,做一次加速,无形间减轻了后端web服务器的一些压力,提高了用户体验,一箭双雕。Nginx做cache配置是很灵活的,里面有各种缓存指令,起初接触会摸不到北,我用了也有一段时间了,现在总结一下nginx做cache时我认为的三大症结——存不存、存多久、用不用?

    nginx的资源是否缓存是由客户端、源站与nginx的缓存配置共同决定,nginx如果没有缓存策略配置,默认按照request请求头、header响应头信息走标准的http缓存判断机制(看cache-control、expires、cookie这些属性),仅当一个资源没有被设为不能缓存的黑名单,且有大于0的存放时间的生命周期时,资源才被缓存,对于nginx缓存判断流程我花精力画了一张结构图分享如下:


wKioL1cPbISQd-9iAAE4m5H2iTY852.png


 

   测试举例,默认配置,一个200ok资源(http://www.haixiano.com/member/login.php)  只有cookie信息没有max-age。

第一次测试配置参数:

proxy_cache_valid 200 10m;

#proxy_ignore_headers Set-Cookie; 注释掉


头信息以及测试如下:

wKioL1cPbnayRC0JAAAsHoXTdhw133.png

多次访问操作如下:

wKiom1cPbm7TYRB_AABpzo-8Hb0722.png


多次访问日志如下(全部MISS):

wKiom1cPdxzTAO0OAACtDhgeoWQ438.png


小结:虽然有对于200ok的信息设置缓存时间为10分钟,但是cookie信息的首先判断是不能存,所以根本不会看你对200ok资源的缓存时间,最终结论是不能存。


第二次测试配置参数:

#proxy_cache_valid 200 10m;注释掉

proxy_ignore_headers Set-Cookie; 


多次访问日志如下(全部MISS):

wKioL1cPd-jgaDnrAAD8HZBtfGw201.png


小结:虽然忽略了对cookie信息的判断,告诉nginx有cookie的信息是可以存的,但是对于200ok的信息设置缓存时间为0,所以最终资源还是不能存。


第三次测试配置参数:

proxy_cache_valid 200 10m;

proxy_ignore_headers Set-Cookie; 


多次访问日志如下(1次访问MISS后,之后均为HIT):


wKiom1cPeL7A0f8QAAC6thsutOU785.png


小结:首先忽略了cookie信息的判断,告诉nginx说cookie信息是可以存的,后查询没有expires和max-age就去找默认缓存时间,发现对于200ok的默认缓存时间是10m,所以最终判定可以缓存,有效缓存时间为10分钟。


    综上,一个资源只有同时具备可缓存和有缓存时间大于0的生命周期的双重属性,才能真正被缓存下来,至于存下来之后用不用还得再进行下一步的判断。所以nginx对于资源是否缓存要经过两步判断,第一步存不存,第二步存多久,对于是否用缓存了的资源为用户进行服务还得进行下一层用不用的判断,详细的走的判断参数可以看我画的那张图。


    优化建议为了做到cache加速的同时,又不影响业务,在缓存策略配置上最好遵循头部信息的要求,不要忽略nocache等字样强制存储,也就是说proxy_ignore_headers指令慎用,比如一些图片验证码和一些php、jsp、asp等动态内容在存储了后,用户多次访问会返回同样的信息,导致用户报障。还有一类资源是没有明确生命周期缓存头的(无cache-control或expires),也就是没有任何缓存要求,建议采用保守方式不要存储,主要是proxy_cache_valid指令的配置,有cookie的信息nginx默认就是不存的。对于故障信息的存储根据实际业务处理,有些故障信息是有必要存储的,还有任何资源如果源站出问题,要设置吐过期资源给用户,做到起码用户可以访问,保护一下源站。个别资源的缓存处理根据业务需要个别设置。

自建个人原创站运维网咖社(www.net-add.com),新的博文会在网咖社更新,欢迎浏览。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://blog.51cto.com/benpaozhe/1763897

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。