美文网首页Nginx高端成长之路Api设计
【充电】《Nginx核心知识100讲》 减轻缓存失效时上游服务的

【充电】《Nginx核心知识100讲》 减轻缓存失效时上游服务的

作者: 言十年 | 来源:发表于2019-01-20 15:52 被阅读22次

    极客专栏《Nginx核心知识100讲》102~103小节,笔记
    注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。

    102 | 如何减轻缓存失效时上游服务的压力

    当我们的服务器面对非常大的流量的时候。如果我们的缓存服务,例如nginx出现了一些问题,比如新增了或者一些nginx服务宕机了,它的缓存已经全部失效了。这时候nginx新起来的时候会导致大量的用户穿透nginx,因为此时nginx缓存是失效的,全部打到了上游服务。特别是对于一些热点文件,很多用户访问的是同一个资源。但因为nginx突然这个资源失效了,导致这些并发的请求同时打到上游服务,而导致上游服务一直起不来。nginx对于这些情况有很多种处理方法。接下来介绍,nginx怎样通过合并回源请求等等方式来减轻上游服务在高峰期的并发访问压力。

    合并回源请求

    image.png

    正常情况下(看图右),nginx对某个热点资源没有做缓存而有四个客户端同时访问的话,四个请求同时达到上游服务。我们怎样解决这个问题呢?使用proxy_cache_lock。

    减少回源请求

    image.png image.png image.png image.png

    proxy_cache_revalidate :If-None-Match后面跟的是Etag,If-Modified-Since后面跟的是Last Modified。这个是什么意思?我希望上游服务和nginx之间发送响应的时候不要总是发送200,因为nginx已经有一个过期的缓存了。如果你告诉我这个缓存没有过期,你返回我304就可以了。不需要返回一个完整的大文件的内容。这和浏览器与nginx交互时的流程是一模一样的。

    image.png

    看上面的例子,比如说访问的时候nginx跟上游之间会发生200,但是加上proxy_cache_revalidate 之后,会把If-None-Match 、If-Modified-Since传给上游服务,上游服务就返回304而不用传相应很大的body 了。

    以上我们介绍了,nginx怎样在峰值情况下减轻上游服务的压力。在生产环境中当我们的服务面对非常大的流量压力的时候,这几个指令所能够提供的帮助是非常大的,它可以在突发故障的情况下保证我们的nginx不会对上游服务产生巨大的流量冲击。

    留言问题

    1. 请问老师一个问题,在实际项目中使用nginx做静态资源的转发,在tomcat中使用jemeter做压力测试之后访问nginx的图片就非常慢,老师能告之其中慢的原因以及原理吗?非常感谢。

     作者回复
    jmeter的那一点压力是不会造成Nginx出现性能问题的,关注下Nginx的error.log上有没有大量错误日志。建议你查一下请求到达Nginx前的路径上有没有限制速度的因素,例如网络带宽、是否直连的Nginx等,

    1. 这种缓存机制当然是非常好了,可是我想问下 实际生产环境的上游服务是否应该针对每次请求进行一些相关合法性请求验证?如果是的话那我们是否无法使用到ngx缓存的好处?因为需要上游服务针对每次请求合法性验证?

     作者回复
    上游服务性能远不及nginx,使用缓存时是否应验权限,需要根据业务需求,这里只讨论技术解决方案。如果每次访问缓存前都需要验证请求,可以绕过上游应用服务,使用openresty直接访问mysql或者redis验证后再用nginx访问静态资源是个方案。

    103 | 及时清除缓存

    前面的课程我们介绍nginx失效的时候,都是通过nginx通过proxy_cache_valid定义多长时间失效, 以及通过上游服务发来的响应中的一些头部比如cache_control、Accel一系列命令来定义缓存何时失效。这些失效都是基于一个时间段后,像一个定时器一样过期。怎么能让缓存立刻失效呢?nginx商业版提供了一个破解指令。在免费版中可以引入第三方模块使用这样的功能。

    及时清除缓存模块——ngx_cache_purge

    image.png

    github 地址 https://github.com/FRiCKLE/ngx_cache_purge

    示例

    image.png

    proxy_cache_key schemeuri :scheme是http或https。

    proxy_cache_purge two scheme1:保证跟proxy_cache_key 的key一模一样。

    proxy_cache_purge two 跟 proxy_cache two 指向的共享内存一致。这样在发起purge请求(请求location ~ /purge(/.*),我们借由这个location清除之前访问的location,故正则匹配uri,看下面的示例图就明白了)的时候,找到同样的共享内存,通过同样的key在红黑树中找到缓存就把那个缓存删掉了。可以用location ~ /purge(/.*)及时的来清除缓存了。

    image.png image.png

    ngx_cache_purge完全达到了生产级别的使用,可以用它在生产环境中使用。

    1.缓存键一般场景中更多的使用前缀匹配怎么处理呢

     作者回复
    不是很明白,能举个例子吗?或者,你是说在purge场景下,一个purge请求清理一批用户请求的缓存吗?前缀是说url吗?ngx_http_cache_purge_module模块肯定是不行的,它只能定点清理。

    相关文章

      网友评论

        本文标题:【充电】《Nginx核心知识100讲》 减轻缓存失效时上游服务的

        本文链接:https://www.haomeiwen.com/subject/pnpxjqtx.html