Nginx 缓存配置

# Buffer和Cache
# Buffer(缓冲):
# 客户端访问服务器某个资源文件的时候,因为服务器的性能远远比客户端机子的性能好,所以服务器要返回客户端所访问的资源的时候,服务器发送的速度远比客户端读取的速度要快,所以服务器先把资源放到缓冲中,让客户端慢慢读取。
# Cache(缓存):
# 客户端频繁访问服务器某个资源的时候,服务器上的资源没有改动,每次客户端访问的时候都需要从硬盘中读取到内存,然后返回到客户端。Cache缓存就减少了读取硬盘的频率,它是把频繁访问的文件一直放到缓存中,当客户端访问的时候直接从缓存中返回。

# nginx缓存流程
# 1.生成一个资源对应的唯一值key:URL + .[其他标识] = key
# 2.然后根据key进行MD5运算生成一个密文:key + MD5 = 字符串(密文)
# 3.缓存目录:/usr/local/proxy_cache
# 4.因为如果将所有缓存的资源都存放在同一个目录的话,缓存文件一多的话将会影响缓存检索速度。所以解决方案是:
# 根据字符串密文来创建目录进行存放:/usr/local/proxy_cache/a/d5/...
# 5.判断缓存目录有没有所访问的数据,有的话就从缓存中返回
# Nginx缓存的时候会将404、301、302也进行缓存
# 那么问题来了,缓存资源和服务器资源不一致怎么办?
# Nginx可以设置缓存资源的有效期来控制。

# Nginx缓存设置的相关指令
# Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成
# proxy_cache_path指令:用于设置缓存文件的存放路劲
# 语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]
# 默认值:无
# 位置:http
# path:缓存路劲地址,如:/usr/local/proxy_cache
# levels:指定该缓存控件对应的目录层次,最多可以设置3层,每层取值为1|2。具体这个目录名怎么来的,上面讲了nginx缓存流程,该目录名是根据第2步中key + MD5 = 字符串(密文)的字符串密文来创建的;假设有一个密文为:e10adc3949ba59abbe56e057f20f883e。
# 如果设置:level=1:2,那么该密文资源缓存存放在/usr/local/proxy_cache/e/83目录下。
# 如果设置:level=2:1:2,那么该密文资源缓存存放在/usr/local/proxy_cache/3e/8/f8目录下。
# 注意最多只能设置3层
# keys_zone:用来为这个缓存区设置名称和指定大小,这里设置的大小指的是存放keys的大小,如:keys_zone=itcast:200m   缓存区的名称是itcast,大小为200M,1M大概能存储8000个keys。
# inactive:指定缓存的数据多久时间未被访问就会被删除,如:inactive=1d   缓存数据在1天内没有被访问就会被删除
# max_size:设置最大缓存空间,如果缓存空间存满,默认覆盖缓存时间最长的资源,如:max_size=20g
# 实例配置
http {
  proxy_cache_path /usr/local/proxy_cache keys_znoe=itcast:200m levels=1:2:2 inactive=1d max_size=20g;
}

# proxy_cache:该指令用来开启或关闭代理缓存,如果开启则自定使用哪个缓存区来进行缓存
# 语法:proxy_cache zone_name|off;    # zone_name就是上面proxy_cache_path配置的keys_zone中的name
# 默认:off
# 位置:http、server、location

# proxy_cache_key:该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存,也就是“nginx缓存流程”中的第1步,key生成的参数配置
# 语法:proxy_cache_key key;
# 默认:proxy_cache_key $scheme$proxy_host$request_uri;
# 位置:http、server、location

# proxy_cache_valid:该指令用来对不同返回响应状态码的URL设置不同的缓存时间
# 语法:proxy_cache_valid [code ...] time
# 默认值:无
# 位置:http、server、location
# 如:为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;  # 对所有响应状态码的URL都设置1分钟缓存。这里具体哪个生效:从上往下找到,满足就不往下找了。


# proxy_cache_min_uses:该指令用来设置资源被访问多少次后被缓存
# 语法:proxy_cache_min_uses number;
# 默认值:1;  
# 位置:http、server、location

# proxy_cache_methods:该指令用户设置缓存哪些HTTP方法
# 语法:proxy_cache_methods GET | HEAD | POST;
# 默认值:GET HEAD;
# 位置:http、server、location

# 例子:
http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      proxy_cache itcast;
      #proxy_cache_key itheima;  # 这里设置的固定值,当前目录有多个文件的话,缓存就会出问题
      proxy_cache_key $scheme$proxy_host$request_uri;  # 协议+主机名+资源uri,这样每个资源都能有自己的key
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
  }
}

# 删除相关缓存
# 方式一:直接删除目录
# 方式二:使用第三方扩展模块 ngx_cache_purge
# 安装方式之前也有安装过
# 七层负载均衡 安装过fair:https://www.cnblogs.com/watermeloncode/p/15497613.html
# 下载:ngx_cache_purge-2.3.tar.gz然后压缩配置configure……
http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      proxy_cache itcast;
      proxy_cache_key itheima;  
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
    location ~ /purge(/.*) {
      proxy_cache_purge itcast itherma;  # 删除缓存
    }
  }
}

# proxy_no_cache:该指令定义不将数据进行缓存的条件
# 语法:proxy_no_cache string ...;
# 默认值:无
# 位置:http、server、location
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  # 这里每一个变量都是条件,当变量的值为0或者空,则代表不成立,否则就是成立。这里只有当$cookie_nocache $arg_nocache $arg_comment只要其中有一个条件成立就不会缓存

# proxy_cache_bypass:该指令是用来设置不从缓存中获取数据的条件
# 语法:proxy_cache_bypass string ...;
# 默认值:无
# 位置:http、server、location
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

http {
  proxy_cache_path /usr/local/proxy_cache levels=2:2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  upstream backend {
    server 192.168.100.1:8080;
  }
  server {
    listen 8080;
    server_name: localhost;
    location / {
      if ($request_uri ~ /.*\.js$){
        set $mychoise 1;
      }
      proxy_cache itcast;
      proxy_cache_key itheima;  
      proxy_cache_min_uses 5;
      proxy_cache_valid 200 5d;
      proxy_cache_valid 404 30s;
      proxy_cache_valid any 1m;
      proxy_no_cache $cookie_nocache $arg_nocache $arg_comment $mychoise;
      proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment $mychoise;
      add_header ngin-cache "$upstream_cache_status";
      proxy_pass http://backend/js/;
    }
    location ~ /purge(/.*) {
      proxy_cache_purge itcast itherma;  # 删除缓存
    }
  }
}

# $cookie_nocache:代表当前请求cookie中键的名称为nocache对应的值
# $arg_nocache:指的是当前请求参数中美味nocache的值
# $arg_comment:指的是当前请求参数中美味comment的值
# 你可以这样去获取他们的值

log_format params $cookie_nocache | $arg_nocache | $arg_comment
server {
  listen 8081;
  server_name localhost;
  location / {
    access_log logs/access_params.log params;
    root html;
    index index.html;
  }
}

 

posted @ 2021-11-02 16:07  看一百次夜空里的深蓝  阅读(3213)  评论(0编辑  收藏  举报