Nginx缓存,减轻应用服务压力

108 阅读1分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

Nginx为什么还要做缓存?

nginx 性能非常高,并发处理能力强,处理能力远远高于后端的应用服务器,所以nginx做一层缓存能大大的提高后端应用服务的处理能力.

Rubik-U服务存的问题

早期的Rubik-U的业务代码是没有做前后端分离,所以很多的静态资源会请求到后端的应用服务器虽然终端用户手机会缓存一些静态资源,但是还是会有验证资源是否过期会发送到应用服务器上,造成性能的浪费.

如下图:\

image.png

nginx 缓存优化配置

proxy_cache_path /data/nginx/tmpcache levels=2:2 keys_zone=rubik:10m max_size=10g use_temp_path=off; 


# CSS and Javascript
location ~* .(?:css|js)$ {
  proxy_cache rubik;
  # 缓存请求返还状态为200,缓存有效期10分钟
  proxy_cache_valid 200 10m;
  # 缓存触发的状态HIT:击中缓存, MISS:没有触发缓存
  add_header X-Cache-Status $upstream_cache_status;


}

nginx proxy_cache_path

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

在缓存失效的情况下,会有大量的请求直接击穿nginx,压力直接传递到应用服务器上面,这种情况下我们需要按照下面方式合并回源请求

image.png

#同一个时间,仅第一个请求向上游发送,其他请求等待第一个相应返回或超时后使用缓存相应客户端
proxy_cache_lock on;
# 等待第一个请求返回的最大响应时间,到达后直接向上游发送请求,但是缓存响应.也就是2,4,5等待这么久直接发送给上游服务
proxy_cache_lock_age 5s;
#上一个请求返回响应超时时间,到达之后再放行下个请求发送上游, 也就是在2在5s没有返回,4在发送
proxy_cache_lock_timeout 5s;