代理缓存是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
}
}