Chap4 大规模可扩展的内容缓存
简介
- 内容缓存减少上游服务器的压力,避免重复的计算过程
- 可扩展的分布式缓存服务器在用户体验上有战略性意义,让缓存离用户近一点,这就是内容分发网络的模式(CDN)
- 当上游服务器失效时,仍能通过缓存服务用户请求
缓存区域
- 我们需要定义缓存的位置和内容:在指定路径下创建一个名为CACHE的60MB大小的共享内存区域,文件目录层级为两级,3小时无访问即将对应缓存释放,目录最大大小为20G,参考此处 (opens new window)
proxy_cache_path:仅在HTTP的context下有效 proxy_cache在HTTP,server,location的context下均有效
缓存的哈希键
缓存绕道
- 在某些情况下,请求不应该读取cache而是直接从后端的服务器上获取资源
- 或者直接设置
proxy_cache off;来完全关闭cache
缓存表现
- 客户端缓存可以提高性能
- 下面的配置指定缓存CSS和JS文件,缓存时间为一年,会在应答头中加上Cache-Control字段,值为public,意思是允许Nginx到客户端中间的任何服务器缓存此内容,若值为private,则仅允许客户端缓存此内容
缓存清除
- 我们需要能从缓存中清除一个对象,仅在Nginx Plus中提供此命令
- 若请求方法为PURGE,则指定对象的缓存会被清除,如
curl -XPURGE localhost/main.js,可以通过与geoip相结合或者简单的认证机制结合,确保不是所有人都能随意清除缓存 - 可以使用通配符来指定清除特定目录下缓存,需要在
proxy_cache_path配置中加入purger=on参数 - 一种常见办法是在静态文件名中加入文件内容的哈希信息,这样,改动过的文件会因为URI的变化而被认为是新的文件,
缓存分片
- 通过切分文件来提高缓存效率
- 在视频传输方面,使用byte-range requests 传输数据流到浏览器中
- 若一个request要求的byte-range不在缓存中,Nginx会从origin请求整个文件,若使用了Cache Slice module,则只会从远端请求必要的部分,若Range requests比slice size都大,则会触发次级请求,当所有分段都缓存了,才会返回应答给客户,Cache slice module 适用于较大的不变的文件