引言
- 静态资源WEB服务
- 代理服务
- 负载均衡调度器SLB
- 动态缓存
本文介绍Nginx的最后一种使用场景----缓存服务。
缓存服务
1.缓存类型
为什么要用到nginx作缓存服务呢?
首先,其实用到缓存就是为了减少后端的压力,让所有的请求都能集中在前端就能取到数据,因为前端是很好的去中心化,对于后端往往是集中式的。对于网站设计呢,我们更希望将所有的请求集中在前端处理。
如果缓存放在服务端,那我们称呼它为服务端缓存,服务端缓存最常见的就是memory-cache、redis这种存取key-value型的数据
当缓存集中放在代理或者中间件上,我们称呼为代理缓存。它的内容是在服务端获取到的,然后再缓存在代理端一份,直接返回给客户端使用。
缓存在浏览器上,称呼为客户端缓存
proxy_cache配置语法
Syntax: proxy_cache_path path [levels=levels]
[use_temp_path=on|off] keys_zone=name:size [inactive=time]
[max_size=size] [manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time]
[purger_threshold=time];
Default:—
Context:http
Syntax:proxy_cache zone | off;
Default:proxy_cache off;
Context:http, server, location
缓存过期周期
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
缓存的维度
Syntax:proxy_cache_key string;
Default:proxy_cache_key $scheme$proxy_host$request_uri;
Context:http, server, location
配置场景:
upstream{
server 116.62.103.228:8001;
server 116.62.103.228:8002;
server 116.62.103.228:8003;
}
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off;
server{
listen 80;
server_name localhost www.gongxu8023.xin
access_log /var/log/nginx/test_proxy.access.log main;
location /{
proxy_cache imooc_cache;
proxy_pass http://imooc;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10min;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}
}
levels=1:2 的意思是按两层分级
keys_zone 指的是开辟zone的名字
inactive=60m 指的是在60分钟之内,如果这个缓存文件没有被访问过,就把它清理掉
use_temp_path建议将它关闭
add_header是返回客户端时向response中添加头信息。
proxy_next_upstream 指的是当出现error、timeout等原因导致无法访问后端服务的话,直接跳过到下一个后端服务。
补充:如何清理指定缓存
- 方式一、rm -rf 缓存目录内容
- 方式二、第三方扩展模块ngx_cache_purge
补充:如何让部分页面不缓存
Syntax: proxy_no_cache string ...;
Default:--;
Context:http,server,location;
示例:
upstream{
server 116.62.103.228:8001;
server 116.62.103.228:8002;
server 116.62.103.228:8003;
}
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off;
server{
listen 80;
server_name localhost www.gongxu8023.xin
access_log /var/log/nginx/test_proxy.access.log main;
if($request_uri ~ ^/(url3)|login|register|password\/reset){
set $cookie_nocache 1;
}
location /{
proxy_cache imooc_cache;
proxy_pass http://imooc;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10min;
proxy_cache_key $host$uri$is_args$args;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}
}
大文件分片请求
Syntax:slice size;
Default:slice 0;
Context:http,server,location;
优势:每个子请求收到的数据都会形成一个独立文件,一个请求断了,其他请求不受影响。
缺点:当文件很大或者slice很小的时候,可能会导致文件描述符耗尽等情况。