缓存是提升浏览器访问效率最有效的方法
不仅要考虑nginx要作为缓存服务时的使用方法,还需要考虑浏览器中缓存生效的场景(因为浏览器中缓存是否生效,可以通过nginx指令控制,而浏览器的缓存对用户的体验提升也是最大的)
浏览器缓存:
优点:
(1)使用有效缓存时,没有网络消耗,速度最快
(2)即使有网络消耗,但对失效缓存使用304响应做到网络流量消耗最小化
缺点:
仅提升一个用户的体验
nginx缓存
优点:
(1)提升所有用户的体验
(2)相比浏览器缓存,有效降低上游服务的负载
(3)通过304响应减少nginx与上游服务间的流量消耗
缺点:
用户仍然保持网络消耗
同时使用浏览器缓存与nginx缓存.
1.etag指令
语法:etag on | off;
默认:etag on;
放置位置:http,server,location
2.expires指令
语法:expires [ modified ] time;expires epoch | max | off ;
默认:expires off;
放置位置:http,server,location,if in location
off : 不添加或者修改Expires和Cache-Control字段
epoch: Expires : 1970 00:00:01GMT Cache-Control:no-cache
time:一天内的具体时刻可以加@。正数:设定Cache-Control时间,计算出expires。负数:Cache-Control:no-cache,计算出expires
not_modified过滤模块
功能:客户端拥有缓存,但不确定缓存是否过期,于是在请求中传入If-Modified-Since或者If-None-Match头部,该模块通过将其值与响应中的Last-Modified值相比较,决定是通过200返回全部内容,还是仅返回304 Not Modified头部,表示浏览器仍使用之前的缓存
使用前提:原返回响应码为200
1.if_modified_since指令
语法:if_modified_since off | exact | before;
默认:if_modified_since exact;
放置位置:http,server,location
off : 忽略请求中的if_modified_since头部
exact:精确匹配if_modified_since头部与last_modified的值
before:若if_modified_since大于等于last_modified的值,则返回304
nginx缓存:定义存放缓存的载体
1.proxy_cache 指令
语法:proxy_cache zone | off
默认:proxy_cache off;
放置位置:http,server,location
2.proxy_cache_path指令(存放缓存文件路径)
语法:proxy_cache_path path;
默认:空
放置位置:http
3.proxy_cache_valid指令(缓存什么样的响应)
语法:proxy_cache_valid [ code ] time;
默认:空
放置位置:http,server,location
4.proxy_cache_method指令(对哪个method方法使用缓存返回响应)
语法:proxy_cache_method GET | HEAD | POST;
默认:proxy_cache_method GET HEAD;
放置位置:http,server,location
如何减轻缓存失效时上游服务器的压力
合并回源请求---减轻峰值流量下的压力
1.proxy_cache_lock指令(打开on时,同一时间仅第一个请求发向上游,其他请求等待第一个响应返回或者超时后,使用缓存响应客户端)
语法:proxy_cache_lock on | off
默认:proxy_cache_lock off;
放置位置:http,server,location
2.proxy_cache_lock_timeout 指令(等待第一个请求返回响应的最大时间,到达后直接向上游发送请求,但不缓存响应)
语法:proxy_cache_lock_timeout time;
默认:proxy_cache_lock_timeout 5s;
放置位置:http,server,location
3.proxy_cache_lock_age 指令(上一个请求返回响应的超时时间,到达后再放行一个请求发向上游)
语法:proxy_cache_lock_age time;
默认:proxy_cache_lock_age 5s;
放置位置:http,server,location
减少回源请求---使用stale陈旧的缓存
1.proxy_cache_use_stale 指令(返回旧缓存,提升体验)
语法:proxy_cache_use_stale error | timeout | invalid_head | updating;
默认:proxy_cache_lock_age off;
放置位置:http,server,location
2.proxy_cache_background_update 指令(当使用proxy_cache_use_stale允许使用过期缓存时,将同步生成一个子请求,通过访问上游服务更新过期的缓存)
语法:proxy_cache_background_update on | off;
默认:proxy_cache_background_update off;
放置位置:http,server,location
缓存有问题的响应
1.proxy_cache_revalidate 指令(更新缓存时,使用If-Modified-Since和If-None-Match作为请求头部,预期内容未发生变更时通过304来减少传输的内容)
语法:proxy_cache_revalidate on | off;
默认:proxy_cache_revalidate off;
放置位置:http,server,location