相关文章推荐
爱看球的毛豆  ·  腾飞的独龙江·  1 年前    · 
时尚的海豚  ·  S90L今日首秀 ...·  1 年前    · 
坚强的玉米  ·  米哈游 春季校园招聘 ...·  1 年前    · 
活泼的弓箭  ·  Amazon.com: DoTerra ...·  1 年前    · 

Nginx缓存&优雅清除缓存

1.Nginx缓存

前面我们知道Nginx可以对浏览器缓存进行配置,让一些静态资源缓存到用户本地存储,以提高页面的响应速度,也能降低服务端的压力。浏览器执行缓存的流程如下:



试想一下,如果用户主动清空了本地的浏览器缓存,那么是不是请求的压力又来到了服务端,为此我们可以增加web缓存服务器,当用户本地缓存失效时,可以去web缓存服务器中获取数据,而不是直接将请求打到后端服务器。

Nginx就可以担当这样的角色。其作为一个高性能的web服务器,同时也可以是一个缓存服务器。其为我们提供了 ngx_http_proxy_module 模块,用来实现缓存功能。

官方文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html

Tips:缓存的资源也不是一成不变的,因此缓存也需要有更新的机制。

因此,对于Nginx的缓存主要围绕以下几点展开:

  • 缓存文件存放在哪儿
  • 缓存的有效期
  • 如何指定哪些请求走缓存,哪些请求不缓存
  • 如何删除缓存

2.Nginx配置缓存

2.1 缓存文件存放在哪儿

  • proxy_cache :定义共享内存区域的名称。
  • proxy_cache_path :定义缓存的存储路径。

2.1.1 proxy_cache

作用域 :http, server, location
语法 :proxy_cache zone | off;
默认值 :proxy_cache off;
  • zone :用于定义共享内存区域的名称。可以使用变量。此参数是 proxy_cache_path 指令的基础。
  • off :表示禁用缓存。

2.1.2 proxy_cache_path

作用域 :http
语法 :proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];

该指令可以配置缓存的路径,并设置相关的参数。

  • path :设置缓存的路径。
  • levels :用于设置缓存的目录结构,例如 levels=1:2 ,意味着生成两层目录。该参数与 proxy_cache_key 指令有关, proxy_cache_key 的默认值为 $scheme$proxy_host$request_uri ,然后将获取到的值MD5加密,然后依次从末尾按照 levels 的设置取值来创建目录。
  • keys_zone :其中 name proxy_cache 定义的值。 size 表示共享内存区域的大小。1M的内存可以存储大约8000个key。
  • inactive :指定缓存失效的时间,如果在该段时间内,缓存文件没被访问,缓存将被删除。
  • max_size :指定最大的缓存大小,当超出大小,会根据LRU算法,删除最近最少使用的数据。

2.2 缓存有效期

2.2.1 proxy_cache_valid

该指令可以设置不同响应码对应的缓存时间,超过时间缓存就会过期,但是不会删除缓存。

作用域 :http, server, location
语法 :proxy_cache_valid [code ...] time;

前面我们在配置 proxy_cache_path 指令时, inactive 参数可以指定一定时间内缓存未被访问就会被删除。而 proxy_cache_valid 指定的是缓存的过期时间,超过该时间缓存将会过期,但是不会被删除。

因此我们在配置的时候,一般 inactive 的值会大于 proxy_cache_valid 中的值,否则将会导致缓存还不过期就被删除了。

  • 不指定响应码,则只对200、301和302进行缓存。
proxy_cache_valid 10m;
  • 对指定响应码进行缓存。
proxy_cache_valid 200 301 10m;
  • 对任何响应码进行缓存。
proxy_cache_valid any 10m;

2.3 如何指定哪些请求走缓存,哪些请求不缓存

2.3.1 proxy_cache_bypass

该指令配置不走缓存响应的条件,如果条件命中,则不走缓存。可与 proxy_no_cache 配合使用。

作用域 :http, server, location
语法 :proxy_cache_bypass string ...;

如果参数中的值至少有一个值不为空且不为"0",则不走缓存响应。

# 以$arg开头的参数表示url中的对应的参数。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

2.3.2 proxy_no_cache

该指令配置不缓存响应的条件,如果条件命中,则不缓存。可与 proxy_cache_bypass 配合使用。

作用域 :http, server, location
语法 :proxy_no_cache string ...;

如果参数中的值至少有一个值不为空且不为"0",则不缓存响应。

# 以$arg开头的参数表示url中的对应的参数。
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

2.3.3 proxy_cache_min_uses

该指令设置某个请求达到指定次数后,才对其进行缓存。

作用域 :http, server, location
语法 :proxy_cache_min_uses number;
默认值 :proxy_cache_min_uses 1;

2.4 综合案例

1)环境

Nginx缓存服务器:192.168.110.101

服务端:192.168.110.100

2)配置

Nginx缓存服务器配置:

$upstream_cache_status 为缓存命中状态。状态值分别为 MISS BYPASS EXPIRED STALE UPDATING REVALIDATED HIT .
http {
    # 缓存在10分钟之内未被访问即删除
    proxy_cache_path /home/stone/proxy_cache levels=1:2 keys_zone=my_cache:10M inactive=10m max_size=10G;
    server {
        listen       80;
        server_name  localhost;
        location /cache {
            proxy_cache my_cache;
            proxy_cache_key $uri$is_args$args;
            # 缓存的有效期会10s
            proxy_cache_valid any 10s;
            proxy_cache_min_uses 1;
            # 添加缓存命中状态,$upstream_cache_status
            add_header Nginx-Cache $upstream_cache_status;
            proxy_pass http://192.168.110.100;
}

服务端配置:

同时在html文件夹下创建cache文件,并放入test.html文件。
http {
    server {
        listen 80;
        server_name localhost;
        location /cache {
            root html;
}

3)访问 192.168.110.101/cache/t

第一次访问:缓存状态为 MISS ,即未命中。



第二次访问:缓存状态为 HIT ,即已命中缓存。



查看缓存文件夹,已经按照 levels 参数指定的规则生成目录结构,并缓存文件。



第三次访问:缓存状态为 EXPIRED ,缓存已过期,因为我们设置的10s过期。



3.Nginx删除缓存

如果服务端的文件发生变化,那么也需要将文件同步到Nginx的缓存中去,因此我们需要对缓存进行删除。

  • 删除对应缓存目录 :这种方式看上去简单粗暴,但是想要删除指定的缓存,则犹如大海捞针。
  • ngx_cache_purge :第三方模块,通过请求删除指定的缓存文件。

3.1 删除对应的缓存目录

rm -rf /home/stone/proxy_cache

3.2 ngx_cache_purge

我们可以借助第三方模块 ngx_cache_purge 来实现对指定缓存的删除。

下载地址: github.com/FRiCKLE/ngx_

作用域 :location
语法 :proxy_cache_purge keys_zone key;
  • keys_zone :该参数为 proxy_cache 指令指定的值。
  • key :该参数为 proxy_cache_key 指定的值。

配置示例:

server {
    listen       80;
    server_name  localhost;
    location /cache {
        proxy_cache my_cache;
        # 设置proxy_cache_key
        proxy_cache_key $uri$is_args$args;
        proxy_cache_valid 200 302 10s;
        # 添加缓存命中状态
        add_header Nginx-Cache $upstream_cache_status;
        proxy_pass http://192.168.110.100;