etag的方式是这样:服务器通过某个算法对资源进行计算,取得一串值(类似于文件的md5值),之后将该值通过etag返回给客户端,客户端下次请求时通过If-None-Match或If-Match带上该值,服务器对该值进行对比校验:如果一致则不要返回资源 。
If-None-Match和If-Match的区别是:
If-None-Match:告诉服务器如果一致,返回状态码304,不一致则返回资源
If-Match:告诉服务器如果不一致,返回状态码412
如上http1.0、http1.1现在的http2.0,一些开发为了兼容复杂的环境,索性代码中一并兼容 。
nginx默认不支持http1.0 。如果要NGINX识别Pragma 。开发者需要额外配置 。
nginx默认支持是1.1的缓存控制,如果请求响应Cache-Control设置为Private, No-Cache, or No-Store 或者携带 cookie,nginx默认行为是不会缓存结果的 。同时GET,HEAD请求才有可能被缓存 。
服务器端可以Cache-Control:max-age=xxx (xxx is numeric),开控制缓存的过期时间 。
NGINX 可以改变缓存Cache-Control的行为吗?

文章插图
如上截图,nginx通过proxy_ignore_headers 指令可以忽略Cache-Control头部,强行设置缓存有效期是30分钟 。如果没有设置有效期,nginx默认行为是不会缓存内容的 。
缓存失效后,如何控制并发更新?nginx提供了proxy_cache_lock 指令,这个指令打开后,如果并发请求未命中缓存(MISS),只允许一个请求到后端请求结果,其他请求等待结果,从缓存中拿数据 。这个相当于一个分布式锁 。在高并发场景非常有用 。如果没有设置的话,多个请求都会直接回源到后端 。
proxy_cache_lock_age、proxy_cache_lock_timeout 可以进一步控制锁的行为 。
缓存失效后,如果触发自动更新?

文章插图
如上面截图,proxy_cache_use_stale指令中增加updating,同时proxy_cache_background_update 设置为on,当一个请求 返现缓存是过期的内容或者缓存正在被更新过程中,那么此时会先返回给客户端一个过期的内容,同时后台会自动更新缓存 。
缓存未失效,如何手动越过缓存直接回源?这样的场景,我理解可能有两种,一种是想验证下缓存是不是正确,第二种场景强制手动更新缓存 。可以通过nginx缓存提供的proxy_cache_bypass指令来实现 。

文章插图
proxy_cache_bypass告诉nginx缓存,如果请求参数或者cookie中有nocache,那么请求将回源到后端服务,而不是优先从缓存中取,请求之后的结果会被再次缓存 。如下面这个请求http://www.example.com/?nocache=true 。
如何统计缓存命中率?nginx内置的变量 $upstream_cache_status,可以获得缓存的使用情况,开发可以将此状态打在日志中,或者增加到http头部,此变量可能有的取值,MISS, BYPASS, EXPIRED, STALE, UPDATING, REVALIDATED, HIT 。统计请求中缓存状态,就可以知道缓存使用情况 。
后端服务挂了,服务如何降级?nginx缓存功能一大特点是当后端服务不能正常响应的时候,比如服务挂了,或者出现临时出现毛刺,可以通过配置服务降级,直接从缓存中取出内容,尽管此时缓存中的内容,已经不是最新值 。在某些场景下,服务降级比服务直接挂了,会带来更好的用户体验 。
proxy_cache_use_stale 指令可以设置服务出现问题后缓存的表现 。

文章插图
和上面同样的配置,只是额外增加proxy_cache_use_stale 指令,如果nginx收到后端服务error,timeout,或者500,502,503,504响应的时候,缓存虽然已经过期,但是还没有被缓存缓存管理器删除,那么此时nginx就可以直接给用户返回已经过期的内容 。
推荐阅读
- 分布式数据之缓存技术,今天就一起来揭开其神秘面纱
- 羽毛球技术的提升方法详解
- 罗布麻茶的栽培技术,罗布麻茶罗布麻茶的副作用
- 饵料|钓鱼还真是个技术活,盘点后会吃惊,钓鱼人的自豪感油然而生
- 白茶萎凋技术,白茶怎么区分
- 不知不觉已是容器化时代,这篇文章带你快速入门Docker容器技术
- 艾叶保健茶的生产技术,保健茶的种类介绍
- 2021年要了解的34种JavaScript优化技术
- 快速掌握Python中的循环技术
- 白茶开发及标准化技术,全国茶叶标准化技术委员会会议10日在福州召开
