Nginx 学习笔记 (8) —— 缓存加速指南
proxy_cache 运用局部性的原理,备存一些先前被访问过、料将被再度使用的资源,从而减少后端服务器的资源开销。缓存也是反代的用途之一。
1) 定义缓存目录,二级目录结构,10MB 的共享内存区存放缓存键和元数据,不活跃的缓存文件 1 小时后清除,磁盘上限 512MB;
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;
2) 启用缓存,并添加一响应头指示缓存状态(MISS / BYPASS / HIT …)。key 是决定缓存命中率的因素之一,要特别留心 Query String;
location / {
proxy_pass http://www.example.com;
proxy_cache the_cache_zone;
# (default) proxy_cache_key $scheme$proxy_host$request_uri;
add_header X-Cache-Status $upstream_cache_status;
}
3) 若希望抓取的源站内容总是新鲜,需要忽略上游的 Cache-Control 和 Expires,再来配置自己的缓存期限。proxy_cache_valid 控制的是有效期,inactive 决定的是保留期限,时间一到管你新不新鲜都要丢掉;
proxy_ignore_headers X-Accel-Expires Cache-Control Expires;
proxy_cache_valid 200 30m;
proxy_cache_valid any 1m;
proxy_cache_revalidate on;
4) 缓存一时爽,全家火葬场。一大波缓存同时失效,会导致缓存雪崩,使得大批请求涌向源站。网站不是特别大的话,可以加锁排队、暂时返回陈旧数据;但根本的还是要各别设定缓存期限,错峰更新缓存,不要一窝蜂。
proxy_cache_lock on;
proxy_cache_use_stale error timeout updating http_503;
proxy_cache_background_update on;
5) 倘若有手动清除缓存的需求,又用不起 NGINX Plus,不妨编译进 ngx_cache_purge。URI 前面加上 /purge 即为清除缓存接口(最好不要被外部访问)。
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
proxy_cache_purge the_cache_zone $scheme$proxy_host$1$is_args$args;
}
<small>原载 App-scope,有删改。</small>