nginx-14 代理缓存

代理缓存是ngx_http_proxy_module代理模块所有指令的一部分。ngx_http_proxy_module模块一些常用配置再这里就不说了。下面介绍有关代理缓存的部分。
缓存

缓存分为服务端侧(比如 Nginx,redis,memcached)和客户端侧(比如 web browser)。

客户端侧缓存一般指的是浏览器缓存、app缓存等等,目的就是加速各种静态资源的访问,降低服务器压力。

服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理就可以设置缓存)

上一节介绍了浏览器缓存,即客户端缓存。此节介绍服务端缓存之一,nginx代理缓存。

cache-control
在这之前,先了解http和缓存十分有关的头信息,cache-control。
cache-control控制浏览器要不要缓存,缓存多久,nginx也会根据这个判断是否做缓存。
百度百科里介绍的挺详细的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,NGINX不会进行缓存。
如果你不想源服务器控制是否缓存,也可以在nginx当中配置忽略利用proxy_ignore_headers Cache-Control 指令实现

代理缓存
在这里插入图片描述
缓存的作用即减少网络IO和磁盘IO。凡是速度相差较大的两种介质之间(如内存的相应速度是硬盘的10倍等),都可能有缓存。它用于协调两者数据传输速度差异的结构。

那么代理缓存,和浏览器缓存的作用是差不多的,它会减少向web server发送请求,由nginx缓存http请求,由nginx返回响应。

nginx对应的模块是
ngx_http_proxy_module 模块允许传送请求到其它服务器。
关于代理缓存的指令:

  • proxy_cache_path 设置缓存的路径和其他参数
    上下文http
http {
proxy_cache_path 
 /usr/local/nginx/cache  #路径
 levels=1:2  #层级 1、2代表文件夹命名长度  /usr/local/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
 keys_zone=my_cache:10m  #内存空间 相当于命名空间 10m=10兆 缓存key的存贮大小(而不是缓存大小)
 max_size=1g  #缓存上限1G 
 inactive=10s #不被访问的情况下 保存的时间 超过10秒自动删除
 use_temp_path=off; #默认写入临时缓存目录然后进行拷贝入自定义缓存目录 关闭后直接写入自定义缓存目录
}
  • proxy_cache 默认关闭off 指定缓存空间名称 例如my_cache
    上下文: http, server, location
http {
proxy_cache_path  /usr/local/nginx/cache  levels=1:2 keys_zone=my_cache:10m  max_size=1g inactive=10s use_temp_path=off;
server {
   	 listen       80;
     server_name  xxx.com;
     location ~ \.php$ {
        proxy_pass  https://www.jd.com; #代理到的webserver源服务器
		proxy_cache my_cache;  #对应上边的keys_zone
    }
 }
  • proxy_cache_key 定义如何生成缓存的键

上下文http, server, location
/usr/local/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
默认是proxy_cache_key $scheme$proxy_host$uri$is_args$args;
可以根据内嵌变量自定义key的组成元素。
注意:一定要在开启proxy_cache my_cache;选项的下方设置。

  • proxy_cache_lock 对于相同的请求,同时只允许一个请求发往后端

请求没有被缓存的情况下,那么nginx会请求到源服务器获取数据,然后将其缓存起来。那么只需要一个请求到源服务器获取数据即可。
其他请求相同条目的请求将一直等待,直到缓存中出现相应的内容,或者锁在proxy_cache_lock_timeout指令设置的超时后被释放。

  • proxy_cache_lock_timeout
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
  • proxy_cache_min_uses 设置响应被缓存的最小请求次数。

默认请求一次即被缓存,如proxy_cache_min_uses 3;请求三次才会被缓存。

  • proxy_cache_valid 为不同的响应状态码设置不同的缓存时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

如404可以不缓存 或者 减少缓存时间

  • proxy_cache_use_stale

如果后端服务器出现状况,nginx是可以使用过期的响应缓存的。这里就不作介绍了

  • proxy_cache_bypass 定义nginx不从缓存取响应的条件

本指令可和与proxy_no_cache一起使用
将进一步介绍这个指令。

设置不缓存的条件
比如后台,不被缓存。

指令:proxy_cache_bypass

proxy_cache_bypass定义nginx不将响应写入缓存的条件。如果至少一个字符串条件非空而且非“0”,nginx就不将响应存入缓存:

用map指令对uri对应0和非0字符串,如果匹配到指定正则,则返回非0字符串,相当于proxy_cache_bypass true, 如果未匹配到正则,则返回0,相当于false。

http{
	map $request_uri  $no_cache {
       default  0;
       ~*/admin 1; #uri当中包含了admin
	}
	server {
   	 listen       80;
     server_name  xxx.com;
     location ~ \.php$ {
        proxy_pass  https://www.jd.com; 
		proxy_cache my_cache;
		proxy_cache_bypass  $no_cache; #对应上面的$no_cache
    }
 }

猜你喜欢

转载自blog.csdn.net/yt_php/article/details/88025893