网站首页 > 技术教程 正文
Nginx是综合型的大拿选手,他集web服务器、负载均衡、cache三种能力于一身,可以说是无所不能。比如说一个中型网站的场景选型,前端是负载,后端托着一堆apache服务器,现在该到前端负载选型的了,虽然lvs和ha单纯从负载的性能要比nginx好一些,但我还是会选nginx,因为nginx在做负载的同时,可以将热点的静态内容cache一遍,做一次加速,无形间减轻了后端web服务器的压力,提高了用户体验,一箭双雕。Nginx做cache配置是很灵活的,里面有各种缓存指令,起初接触会摸不到北,不知道缓存怎么生效、怎么过期、怎么更新,用了一段时间后我终于抽象出了一套缓存判断的万能公式——存不存、存多久、用不用?
Nginx的资源是否缓存是由客户端、源站与nginx的缓存配置共同决定,nginx如果没有缓存策略配置,默认按照request请求头、header响应头信息走标准的http缓存判断机制(看cache-control、expires、cookie这些属性),仅当一个资源没有被设为不能缓存的黑名单,且有大于0的存放时间的生命周期时,资源才被缓存,对于nginx做cache时缓存判断的万能公式集成到一张图上如下,一个资源只有同时具备可缓存和有缓存时间大于0的缓存生命周期双重属性,才能真正被缓存下来,至于存下来之后用不用还得再进行下一步的判断:
存不存:如果没有设置,会根据源站响应头信息走标准的http协议缓存判断机制,查看cache-control、expires以及cookie等属性,nginx主要设置参数有:
proxy_ignore_headers (X-Accel-Expires |Expires | Cache-Control |Set-Cookie)忽略这些header响应头属性的判断,是缓存的必要不充分条件。
proxy_no_cache ($cookie_nocache $arg_nocache $arg_comment)如果任何一个变量参数值不为空,或者不等于0,nginx就不会对资源进行缓存,直接进行代理转发,是缓存的必要不充分条件。
存多久:如果一个资源没有被加入不能存的黑名单,也就是说这个资源是可以存的,然后就会到这个判断环节“存多久”,如果存多久的时间参数为0,那么这个资源也是不会存的,存多久有其优先级的判断顺序:
1级、proxy_cache_path中inactive参数,意思是一个已存资源多久内一次访问也没有就将其删除,这个缓存时间优先于所有策略;
2级、响应头Expires属性,就是资源存到什么时候过期,这个是第二优先级策略,有这个属性后将停止后续的时间判断;
3级、响应头cache-control里的max-age,这个是第三优先级存多久的参数,如果有max-age将不再看后续的时间判断;
4级、 proxy_cache_valid 200 1d;默认的存储时间缓存策略,比如当前参数,如果一个200ok的资源是可以存的,但是没有其它策略说可以存多久,默认走的是这个参数的缓存时间,此参数设置是很灵活的,可以对各种状态码进行配置。
用不用:用不用有两种情况,一个是已经过期的资源用不用,另一个是没过期的资源用不用,日志打印有BYPASS、EXPIERD、STALE、UPDATING这些,具体如下:
proxy_cache_bypass($cookie_nocache $arg_nocache$arg_comment)任何一个变量参数不为空,都直接回源,不考虑缓存中有没有,request头里面有nocache直接回源;
proxy_cache_use_stale(error timeout invalid_header updating http_500 http_502 http_503 http_504)发现已经缓存的内容有这些问题,直接用过期的缓存资源回复;
proxy_cache_revalidate off;如果一个走默认缓存时间的资源过期了,且当前参数是off,直接忽略缓存资源直接回源,日志EXPIERD。
测试举例论证,默认配置,一个200ok资源(http://www.haixiano.com/member/login.php) 只有cookie信息没有max-age。
第一次测试配置参数:
proxy_cache_valid 200 10m;
#proxy_ignore_headers Set-Cookie; 注释掉
头信息以及测试如下:
多次访问操作如下:
多次访问日志如下(全部MISS):
小结:虽然有对于200ok的信息设置缓存时间为10分钟,但是cookie信息的首先判断是不能存,所以根本不会看你对200ok资源的缓存时间,最终结论是不能存。
第二次测试配置参数:
#proxy_cache_valid 200 10m;注释掉
proxy_ignore_headers Set-Cookie;
多次访问日志如下(全部MISS):
小结:虽然忽略了对cookie信息的判断,告诉nginx有cookie的信息是可以存的,但是对于200ok的信息设置缓存时间为0,所以最终资源还是不能存。
第三次测试配置参数:
proxy_cache_valid 200 10m;
proxy_ignore_headers Set-Cookie;
多次访问日志如下(1次访问MISS后,之后均为HIT):
小结:首先忽略了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默认就是不存的。对于故障信息的存储根据实际业务处理,有些故障信息是有必要存储的,还有任何资源如果源站出问题,要设置吐过期资源给用户,做到起码用户可以访问,保护一下源站。个别资源的缓存处理根据业务需要个别设置。
猜你喜欢
- 2024-10-13 Nginx 假死的原因以及解决方法(nginx故障)
- 2024-10-13 Nginx负载均衡出现扩容缩容如何减轻缓存失效的问题?
- 2024-09-28 Nginx 问题以及对应的解决方案(nginx常见问题)
- 2024-09-28 推荐一款nginx+redis+ehcache高并发与高可用缓存架构
- 2024-09-28 「Nginx」实现负载均衡、限流、缓存、黑白名单和灰度发布
- 2024-09-28 在nginx配置文件中设置nginx缓存(nginx怎么配置缓存)
- 2024-09-28 【Nginx基础】Nginx缓存使用案例(nginx做缓存)
- 2024-09-28 Nginx中浏览器缓存的执行流程(nginx 浏览器缓存)
- 2024-09-28 Nginx 缓存机制详解!非常详细实用
- 2024-09-28 vue项目如何有效解决的浏览器的缓存问题
你 发表评论:
欢迎- 最近发表
-
- Win10 TH2正式版官方ESD映像转换ISO镜像方法详解
- 使用iso镜像升级到Windows 10的步骤
- macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像
- 安利一个用ISO镜像文件制作引导U盘的的小工具RUFUS
- CentOS 7使用ISO镜像配置本地yum源
- 用于x86平台的安卓9.0 ISO镜像发布下载:通吃I/A/N、完全免费
- AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术
- Rufus写入工具简洁介绍与教程(写入模式)
- 新硬件也能安装使用了,Edge版Linux Mint 21.3镜像发布
- 开源工程师:Ubuntu应该抛弃32位ISO镜像
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)