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; } }