1、浏览器缓存php
浏览器缓存,也称为客户端缓存,是静态缓存中最多见最直接的表现形式,不少时候都每每被人忽略掉。css
案例1:html
咱们常常在nginx的配置文件中看到如下缓存配置:前端
案例2:nginx
在常常写 jsp 的时候,html 标签中关于 http 头信息也能够注意到“ expires ”的字样:web
对于案例1和案例2中(nginx设置的expires优先级大于代码中设置的expires优先级),expires是给一个资源设定一个过时时间,也就是说无需去服务端验证,直接经过浏览器自身确认是否过时便可,因此不会产生额外的流量。此种方法很是适合不常常变更的资源。若是文件变更较频繁,就不要使用 expires 来缓存。chrome
好比对于常见类web网站来讲,css 样式和 js 脚本基本已经定型,因此最适合的方法是 expires 来缓存一些内容到访问者浏览器。apache
案例3:后端
经过 chrome 访问服务器端的一张图片,用F12键打开开发者前端调试工具:浏览器
第一次访问,响应200状态,当第二次及后续访问的时候,变成304状态,客户端已经开始获取浏览器缓存内容,而不须要去服务器端获取对应的请求内容,即 nginx 中 expires 参数设置已经生效。等待客户端缓存时间过时后,会再次请求服务器端内容来更新本地缓存。
介绍到这里,忽然想起一个有意思的需求。好比,访问一张静态文件,不想客户端缓存,须要每次都去服务器端取数据。咱们能够用“ last-modified ”参数来实现,即“ last-modified ”是根据文件更新时间来肯定是否再次发送加载。
Nginx核心配置以下:
咱们更改掉服务器传回客户端的“ last-modified ”文件修改时间参数的值,这样致使客户端本地保存的文件时间每次跟服务器端传回来的时间不一致,因此每次客户端“ 误认为 ”服务器端有静态文件更新,每次都会去服务器端取“ 所谓的最新数据 ”。这样咱们能够看到,无论在浏览器访问多少次,返回的 http 状态都是200,再也找不到304状态了。
误区:在 nginx 中设置 expires,并非指把静态内容缓存在 nginx 中,而是设置客户端浏览器缓存的时间,这是不少人的误区所在。
2、磁盘缓存
除了存储在客户端的静态缓存(浏览器静态)技术外,在服务器端的静态缓存技术主要分为磁盘缓存和内存缓存两大类。单纯围绕 nginx 的 squid、varnish 等一类中间件,处理静态数据的性能十分优秀。核心是 nginx 基于 epoll 网络模型,而相比 apache 基于 select 网络模型。因此 apache 的优点在于密计算型,稳定性好。而 nginx 偏向静态处理,反向代理,高并发。好比 apache+php 的稳定性比 nginx+php 要好,而性能是明显 nginx 要优秀许多。
以上仅单纯是对磁盘中静态数据处理的能力,所谓磁盘缓存,指另外的一种缓存静态文件的技术。以 nginx 配置为例:
能够看出 nginx 主要经过 proxy_cache 来实现 web cache,熟悉 nginx 的同窗,不难看出,以上配置在 location 这里,不只能够实现静态文件的缓存,还能够实现动态文件的缓存(这里放在下章节详细介绍)。咱们编写个 test.html测试文件,而后并访问。test.html 源码以下:
咱们发现服务器的 cache 目录里面,多了两个缓存文件:
有意思的,这两个文件里面的内容分别为(经过 less 命令查看):
(b0ad5d3e7f099bfff9e4fc6a159d868c)
(53edc39ed253e14415a29412cfc01faf)
因此不难看出,nginx 把 html 内容和图片二进制所有缓存到本地磁盘上了。下次用户再次来访问 test.html 的时候,nginx 直接将缓存在本地磁盘的文件返回给用户。特别是后端如如果部署的 tomcat、iis 等,nginx 强大的静态缓存能力,有效减小了服务器压力。
3、内存缓存
紧接上面描述的磁盘缓存,内存缓存顾名思义,就是把静态文件缓存在服务器端的内存中。因此这种缓存,如若命中缓存的话,取内存中的缓存数据返回比取磁盘中的缓存数据返回,性能要高不少。以 varnish 为例,varnish 核心配置以下:
启动命令:
参数简介:
default.vcl核心配置以下:
Varnish对.gif、.jpg、.jpeg、.png等结尾的 URL 缓存时间设置1小时。varnish设置完毕后,咱们用命令行方式,经过查看网页头来查看命中状况:
最后,咱们能够经过 varnishadm 命令来清理缓存,也能够经过 varnishstat 命令来查看 varnish 系统缓存状态。
4、Nginx 的内存缓存