404错误驱动web缓存
主要是利用proxy store 功能对404错误进行重定向;
当nginx处理客户端请求时,发现请求的资源数据不存在,产生404错误,然后通过捕获错误,进而转向后端服务器请求数据,
最后将后端服务器的响应数据返回给客户端,同时缓存在本地;
location /{
root /web/server/;
error_page 404 =200 /errpage$request_uri;
}
location /errpage/ {
internal; #该目录不能通过外部链接直接访问
alias /home/html/;
proxy_pass http://backend/;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /web/server/tmp; #临时目录要和/web/server在一个硬盘分区内
}
配置将404错误响应进行重定向,然后使用location捕获重定向,像后端发起请求获取数据,转发给客户端,同时缓存到本地;
资源不存在驱动web缓存
和404类似,不同在于该方法是通过location的if判断直接驱动nginx和后端服务器的通信和缓存
location / {
internal; #该目录不能通过外部链接直接访问
alias /home/html/;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /web/server/tmp; #临时目录要和/web/server在一个硬盘分区内
if(!-f $request_filename){
proxy_pass http://backend/;
}
}
以上2种方法,实际应用时可以将proxy store的缓存目录配置到/dev/shm中提高缓存的处理速度。如果不是在内存中缓存数据,这2种缓存不支持缓存数据清理,缓存文件会一直占用硬盘; 注意:这2种缓存机制只能缓存200状态下的响应数据;且不支持动态链接请求;
基于memcached缓存机制
memcached是一套高性能的基于分布式的缓存系统;它在内存中开辟一块空间,然后建立一个hash表,将缓存数据通过key/value存储在hash表中管理。
memcache由客户端和服务器2个核心组件组成;服务器先计算key的hash值来确定key/value在服务端所处的位置。
确定位置后,客户端会发送一个查询请求给对应的服务端,让它查找并返回确切的数据;
- memcached_pass address 配置memcached服务器地址。
Proxy cache 缓存机制
nginx启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率。
还会生成专门的管理进程对磁盘上的缓存文件进行过期判定,更新等方面的管理;
Proxy cache支持对任意链接响应数据的缓存,不仅限于状态码是200的数据;
缺点是没有实现自动清理磁盘上缓存源数据的功能;因此长时间使用会对服务器存储造成一定压力;
cache-control
cache-control值从2方面分析,即请求时的缓存指令和响应消息中的指令;
请求时的缓存指令:no-cache,no-store,max-age,max-stale,min-fresh,only-if-cached
响应消息中的指令:public,private,no-cache,no-store,no-transform,must-revalidate,proxy_revalidate,s-maxage
- no-cache:请求或响应不会缓存,它会强制浏览器在使用缓存复制前先提交一个http请求到服务器确认;RFC本意是允许被缓存的文件在类似浏览器的前进后退按钮时使用缓存,真的涉及页面加载则不能使用;
- no-store:无论远程还是本地,共享非共享都不能存储访问页面的缓存副本,如果在请求中发送该指令,则请求和响应都不会使用缓存; 即浏览器在任何情况下都不要数据缓存,不在本地保留复制;
- max-age: 该参数的值就是客户端可以在缓存中保存缓存页面的最大时间,单位是秒;max-age=30;30秒后过期,需要重新请求;
- max-stale:如果指定该值,客户端可以接收超出最大生存周期的响应,否则,对于超出生存期的响应,客户端不会接收; 该值表示只在该值范围内才提供数据访问;max-stale=30;30秒内即使缓存过期也使用该缓存;
- min-fresh: 客户端可以接收响应时间小于当前时间加上指定时间的响应时间;min-fresh=30;30秒内获取最新的响应;
- only-if-cached:设置为只读缓存;
- public:响应数据可以被任意缓冲区缓存;
- private:私有数据,不能缓存;
- no-transform:禁止下游代理服务器更改content-encoding,content-range或content-type指定的值,包括页面本身;
- must-revalidate:强制浏览器验证文件是否过期;
- proxy_revalidate:强制代理严格遵守在nginx服务器设置的缓存规则;
- s-maxage:类似max-age,但它只用在共享缓存上,比如proxy;