1 缓存概念

  • nginx缓存原理

当第一个用户(蓝)访问网站,他的请求首先会到NGINX PROXY SERVER,随后NGNIX发往后端服务器(灰),后端会将请求的响应首先发往NGINX,由其返回给用户(蓝色),如果这个响应是可以缓存的,则NGINX会保留一份响应副本,当其他用户(橙色)发起相同的request请求时,NGINX会根据request请求的内容是否存在于缓存中,来直接返回给用户,不再经过后端。

这个场景同样适用于浏览器,CDN,用于缓存静态资源。

2 HTTP缓存机制

后端服务器会通过响应包头来定义缓存特性

  • Origin Server定义的缓存特性

缓存服务器可通过设置一些参数来忽略或重写后端服务器的缓存特性,但后端服务器的缓存特性也是极其重要的。

  • Expires
    最原始的配置策略,即设置过期时间,但使用效率低下,目前绝大部分已经被Cache-Control替代

  • Cache-Control
    定义缓存资源属性是private或public,并且设置缓存多久后过期,本例中,属性为public,60秒过期

  • X-Accel-Expires
    只有nginx能识别的缓存特性header,优先级大于上面两个header,可以设置此header,在nginx侧来重新定义缓存特性

  • Etag和Last-Modified
    捆绑生成的: 有些场景下,你希望client端的浏览器长时间缓存,而缓存服务器只短时间缓存文件,以至于当后端服务器更新后,缓存服务器会及时同步,我们就可以使用最后两个header,Last-Modified表示最后修改时间,并声明一个ETag(哈希值),做为缓存内容的标签,具有唯一性;客户端访问请求带有If‑Modified‑Since或者If‑None‑Match header,并申明自己的客户端带有静态缓存文件,以及文件修改日期和ETag值,如果服务器端的版本和Etag值与客户端一致,则服务端会直接返回304 not modified,这个验证流程是非常快的,并且节省网络带宽;

  • 如果Cache-Control设置为public,则客户端不会去验证资源的有效性,将会一直使用直到过期,同时public也代表资源可以被缓存在web proxy中;

  • 如果Cache-Control包含must-revalidate,则客户端每一次访问请求资源都会去验证缓存是否有更新;

NGINX都会缓存哪些资源

首先看下nginx proxy cache最基本的配置:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {set $upstream http://ip:portlocation / {proxy_cache my_cache;proxy_pass $upstream; }}

配置项

/path/to/cache : 本地路径,缓存文件存放地址;
levels : 默认所有缓存文件都放在同一个/path/to/cache下,从而影响缓存的性能,大部分场景推荐使用2级目录来存储缓存文件;
key_zone : 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key;
max_size : 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件;
inactive : 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件,默认为10分钟;“需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件”;
use_temp_path : 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝;
proxy_cache : 启用proxy cache,指定key_zone;
附:缓存和代理中常用的配置项
上文讲述了如何配置最基础的proxy cache,接下来,会对常用的高级配置项进行梳理。

proxy_no_cache string;
Default: —
Context: http , server , location
config example:
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;

$cookie_nocache a r g n o c a c h e . . . 皆 为 变 量 , 可 以 根 据 你 访 问 的 匹 配 策 略 来 设 置 , 其 值 只 有 2 类 , 0 和 非 0 ; 访 问 匹 配 策 略 例 如 : i f ( arg_nocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0; 访问匹配策略例如: if ( argn​ocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0;访问匹配策略例如:if(request_uri ~ ^/(login|register|password/reset)/) { set $cookie_nocache 1; }
如果在此链式配置中,只要有一个值不为0,则不会cache;例如:proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0),不会被cache。`
注:一般会配合proxy_cache_bypass共同使用;

proxy_cache_bypass string;
Default: —
Context: http , server , location
config example:
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;

定义在哪些情况下不从cache读取,直接从backend获取资源;配置方式同proxy_no_cache。

proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

自定义cache key,例如:
proxy_cache_key “ h o s t host hostrequest_uri $cookie_user”;
默认值为:
proxy_cache_key s c h e m e scheme schemeproxy_host u r i uri uriis_args$args;

proxy_cache_methods GET| HEAD|POST…;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

指定客户端那些方法被缓存,默认为GET|HEAD。

proxy_cache_purge string ...;
Default: —
Context: http, server, location
config example:
proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;
map $request_method $purge_method {PURGE 1;default 0;
}
server {...location / {proxy_pass http://backend;proxy_cache cache_zone;proxy_cache_key $uri;proxy_cache_purge $purge_method;}
}

定义缓存清除场景,同proxy_no_cache,proxy_cache_bypass链式配置方式,只要又一个不为0,则清除对应的cache key则会被清除,并返回204 response。注意,这里是删除内存中的cache key,而不是disk上的cache文件!!!disk的cache文件是由inactive控制;
当purege request的cache key以通配符*结束时,所有匹配到通配符的cache入口的cachekey都会被删除。

proxy_cache_valid *[code...] time *;
Default: —
Context: http, server, location

设置不同相应码的缓存时间,当不指定响应码的时候,例如
proxy_cache_valid 5m;
只对响应码为200,301,302的访问请求资源设置缓存时间,此外可以个性化定制,例如:
proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid 404 1m; proxy_cache_valid any 1m;
此外,还可以在相应header里设置优先级更高的缓存有效时间:

“X-Accel-Expires”,设置响应的缓存过期时间,以秒为单位;0为不缓存;
如果没有设置“X-Accel-Expires” header,则关于缓存的配置策略可能会在“Expires”或者“Cache-Control” header中;
如果header含有“Set-Cookie”,则响应不会被缓存,类似的配置可以在“proxy_ignore_header”中可见;
header包含“Vary”并且设置为“*”,则请求不会被缓存,如果“Vary”有具体的值,则对应的请求会被缓存;
proxy_ignore_headers field;
Default: —
Context: http, server, location

不缓存包含在field的响应header,可以设置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”。
如果上述的header field没有设置为忽略,则header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的话,响应会被缓存。

proxy_pass_headers field;
proxy_hide_headers field;
Default: —
Context: http, server, location

参考

  • https://www.jianshu.com/p/625c2b15dad5

Nginx Proxy Cache原理和最佳实践相关推荐

  1. 《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.5 大数据系统应有的属性...

    本节书摘来自华章出版社<大数据系统构建:可扩展实时数据系统构建原理与最佳实践>一书中的第1章,第1.1节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren ...

  2. rocketmq存储结构_阿里专家分享内部绝密RocketMQ核心原理与最佳实践笔记

    本文源码以RocketMQ 4.2.0 和 RocketMQ 4.3.0 为 基 础 , 从RocketMQ的实际使用到RocketMQ的源码分析,再到RocketMQ企业落地实践方案,逐步讲解.使读 ...

  3. clickhouse原理解析与应用实践 pdf_阿里专家分享内部绝密RocketMQ核心原理与最佳实践PDF...

    前言 本文源码以RocketMQ 4.2.0 和 RocketMQ 4.3.0 为 基 础 , 从RocketMQ的实际使用到RocketMQ的源码分析,再到RocketMQ企业落地实践方案,逐步讲解 ...

  4. SVN分支/合并原理及最佳实践

    #SVN分支/合并原理及最佳实践 SVN是一种常用的版本控制工具,一种典型的项目代码实践方式是: 存在一个代码基线(Base Line)或称主干,不同的模块使用各自的分支进行功能开发,在开发完毕后合并 ...

  5. AssetBundle的原理及最佳实践

    本篇包含了Addressable基础篇系列的第三节和第四节,第一节<浅谈Assets--Unity资源映射>,第二节<Resources目录的优点与痛点>,可点击回顾.本文主要 ...

  6. RocketMQ 设计原理与最佳实践

    介绍 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的.高可靠的消息发布与订阅服务.同时,广泛应用于多个领域,包括异步通信解耦.企业解决方案.金融支付.电信.电子商 ...

  7. 学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

    分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Mac ...

  8. iOS 稳定性问题治理:卡死崩溃监控原理及最佳实践

    不同于 Android 系统中的卡死(ANR)问题,目前业界对 iOS 系统中 App 发生的卡死崩溃问题并无成熟的解决方案,主要原因是: 通常 App 卡死时间超过 20s 之后会触发操作系统的保护 ...

  9. 腾讯云Elasticsearch集群多可用区容灾实现原理及最佳实践

    导语 | 为了进一步满足腾讯云 Elasticsearch 客户对服务稳定性.集群高可用性等容灾能力的要求.腾讯云 ES 产品提供了跨可用区部署的解决方案,本文将为大家介绍实现原理与实践案例.文章作者 ...

最新文章

  1. linux php 断点调试,PHP断点调试工具Xdebug的安装
  2. Python练习3-XML-RPC实现简单的P2P文件共享
  3. hdu4282 x^z+y^z+x*y*z=k 解的个数
  4. HttpHelper之我见
  5. 算法设计与分析——递归与分治策略——线性时间选择
  6. 致盲目标检测算法,阿里清华发起 “对抗攻击” 挑战赛!
  7. 安装GD 完美解决make error
  8. 奇瑞采用英伟达GPU,将实现L3自动驾驶
  9. 免杀需要的基本汇编知识
  10. 【NOI2001】【Vijos1531】食物链(并查集拓展域)
  11. 用Neo4j图形数据库打造专属于你的高bigger关系图
  12. android手游开发三维地图高清版,全球地图3D模拟器
  13. 当AI邂逅电能:与图知科技一起探索工业AI王座|白洞战报
  14. 什么情况下选用mysql_在MySQL中,‘%’可以用在什么情况下?
  15. 未明学院:被腾讯群面虐完后,我找到了未来的方向…
  16. python判断一个字符串在数组中的位置
  17. 计算机专业去空军地勤能干嘛,空军地勤退役后能干什么?
  18. 参加这些学术会议,还怕发不了SCI?
  19. 山沟沟里的技术脱贫:阿里工程师助平武蜂农物联网养蜂
  20. Collection集合,List集合

热门文章

  1. Oracle OR条件的优化与改写
  2. 开源的app后台开源框架汇总
  3. Android开发规范[Java+android]
  4. 树莓派开发ADC芯片CS1237(C语言和python库开发)
  5. CanMV K210 AI开发板全网首发,项目代码完全开源,千套开发板限时优惠!
  6. centos如何安装软件
  7. 英菲克I5M_I6M_I7M_I10M-晶晨S805处理器-当贝纯净桌面-线刷固件包
  8. 大数据必学语言Scala(三十一):scala面向对象 特质(trait)
  9. CodeForces 1463 C. Busy Robot 模拟
  10. 通过bower 下载管理angularjs