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缓存判断流程我花精力画了一张结构图分享如下:
测试举例,默认配置,一个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默认就是不存的。对于故障信息的存储根据实际业务处理,有些故障信息是有必要存储的,还有任何资源如果源站出问题,要设置吐过期资源给用户,做到起码用户可以访问,保护一下源站。个别资源的缓存处理根据业务需要个别设置。
自建个人原创站运维网咖社(www.net-add.com),新的博文会在网咖社更新,欢迎浏览。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Centos 7 DNS配置及理论详解
DNS是什么及BIND讲解内容 域名系统(英文:Domain Name System,缩写:DNS)是internet的一项服务。它作为将域名和IP地址相互映射服务,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。讲解内容: DNS名称解析方式 DNS查询类型 DNS服务器类型 区域数据库文件详解 Centos7安装配置BIND BIND主从服务器配置 BIND安全相关配置 BIND view视图配置 一、DNS名称解析方式 DNS名称解析方式分为两种: 名称 ---> IP 例如:此处命令会在后面工具中具体详解 # 可以看出“名称”www.magedu.com对应的ip是101.200.188.230 #dig-tAwww.magedu.com ;<<>>DiG9.9.4-RedHat-9.9.4-29.el7<<>>-tAwww.magedu.com ;;globaloptions:+cmd ;;Gotansw...
- 下一篇
HAProxy负载均衡与keepalived搭建高可用负载均衡web(Nginx/PHP/Tomcat)集群
HAProxy简介 HAProxy是基于TCP四层和HTTP七层的开源的第三方应用负载均衡软件。具有高可靠性、高稳定性、高并发处理能力、透明代理和支持ACL功能等特点。HAProxy是一个功能强大且优秀的负载均衡集群解决方案。 HAProxy负载均衡算法 Haproxy的负载均衡算法在backend模块中通过balance命令来定义,常见的算法有: roundrobin: 轮叫调度算法,可以通过定义权值来分配后端服务器static-rr : 静态的基于权重的轮叫调度算法source: 源IP地址哈希算法,按请求访问的IP地址进行hash运算,将来自用一个IP地址的访问固定到同一台后端服务器uri: URI哈希算法,按请求访问的URI进行hash运算,将请求转发到匹配的后端服务器uri_param: 根据访问的URL路径中的参数选择后端服务器leastconn: 最少连接调度算法,将连接请求转发到最少连接数目的后端服务器hdr(name): 表示根据HTTP请求头进行转发cookie: 表示根据定义的SERVERID转发请求 需求分析: 现有4个域名通过HAProxy代理对...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)