1 缓存概念
- nginx缓存原理
- 当第一个用户(蓝)访问网站,他的请求首先会到NGINX PROXY SERVER,随后NGNIX发往后端服务器(灰),后端会将请求的响应首先发往NGINX,由其返回给用户(蓝色),如果这个响应是可以缓存的,则NGINX会保留一份响应副本,当其他用户(橙色)发起相同的request请求时,NGINX会根据request请求的内容是否存在于缓存中,来直接返回给用户,不再经过后端。
这个场景同样适用于浏览器,CDN,用于缓存静态资源。
2 HTTP缓存机制
后端服务器会通过响应包头来定义缓存特性
- Origin Server定义的缓存特性
缓存服务器可通过设置一些参数来忽略或重写后端服务器的缓存特性,但后端服务器的缓存特性也是极其重要的。
Expires
最原始的配置策略,即设置过期时间,但使用效率低下,目前绝大部分已经被Cache-Control替代
Cache-Control
定义缓存资源属性是private或public,并且设置缓存多久后过期,本例中,属性为public,60秒过期
X-Accel-Expires
只有nginx能识别的缓存特性header,优先级大于上面两个header,可以设置此header,在nginx侧来重新定义缓存特性
Etag和Last-Modified
捆绑生成的: 有些场景下,你希望client端的浏览器长时间缓存,而缓存服务器只短时间缓存文件,以至于当后端服务器更新后,缓存服务器会及时同步,我们就可以使用最后两个header,Last-Modified表示最后修改时间,并声明一个ETag(哈希值),做为缓存内容的标签,具有唯一性;客户端访问请求带有If‑Modified‑Since或者If‑None‑Match header,并申明自己的客户端带有静态缓存文件,以及文件修改日期和ETag值,如果服务器端的版本和Etag值与客户端一致,则服务端会直接返回304 not modified,这个验证流程是非常快的,并且节省网络带宽;
如果Cache-Control设置为public,则客户端不会去验证资源的有效性,将会一直使用直到过期,同时public也代表资源可以被缓存在web proxy中;
如果Cache-Control包含must-revalidate,则客户端每一次访问请求资源都会去验证缓存是否有更新;
NGINX都会缓存哪些资源
首先看下nginx proxy cache最基本的配置:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { set $upstream http://ip:port location / { proxy_cache my_cache; proxy_pass $upstream; } }