本文正在参与 “网络协议必知必会”征文活动
一、缓存的作用?
Web 浏览器和应用服务器之间可能存在多个缓存:客户端的浏览器缓存、中间缓存、内容交付网络 (CDN) 以及位于应用服务器前面的负载平衡器或反向代理,即使在反向代理/负载平衡器级别的缓存,也可以大大提高性能。
二、怎么开启缓存功能?
1、两步开启缓存功能
# 1、设置缓存的基本配置
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
# ...
location / {
# 2、开启缓存功能
proxy_cache my_cache;
proxy_pass http://my_upstream;
}
}
2、proxy_cache_path
/path/to/cache/:设置缓存的存储目录;levels:上面目录下的文件目录层次结构,这里设置2层目录结构,单个文件夹包含大量文件会降低文件访问速度。如果不设置此参数,表示采用1层目录结构。keys_zone:设置共享内存大小,用于存储缓存的key和相关数据,内存访问速度要比硬盘块很多,内存1MB大约可存储8000个 key, 这里的 10m 可以存储大于80,000个 可以。max_size:设置缓存大小的上限,如果不设置,缓存上限就是硬盘大小,缓存到达上限后,会自动删除不常用的缓存。inactive:表示文件在给定时长内没有被使用,就会被删除。默认值为10分钟。use_temp_path=off:是否将缓存文件先写入临时存储区域,推荐关闭此选项,避免不必要的文件复制操作。
3、proxy_cache
proxy_cache:使用上面的缓存配置,来启动匹配 URL 的缓存功能,这里的 URL 是指/;- 当把
proxy_cache放到 server 下,那么 server 下的所有 location 匹配的 URL 都会启动缓存功能。
三、怎么处理源服务器故障?
当源服务器遇到 故障 或 流量太大,无法提供服务时,Nginx 可以使用缓存继续为用户提供服务。
通过设置 proxy_cache_use_stale 指令,当 Nginx 访问源服务器,发生 超时、500、502、503、504 这几种情况时,Nginx会先使用缓存来响应客户,如果没有缓存,才返回错误给客户。
location / {
# ...
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}
四、微调缓存,提高性能
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 3;
proxy_cache_use_stale error timeout updating http_500 http_502
http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_pass http://my_upstream;
}
}
proxy_cache_revalidate:表示使用条件请求向源服务器发送GET请求。If-Modified-Since、If-Unmodified-Since等请求头会被使用,最大可能减少数据的传输。条件请求相关的请求头信息,看这里!proxy_cache_min_uses:表示 缓存 被使用的最小次数,默认值为1。这个属性用在缓存空间达到上限时,低于此属性设置的次数的缓存,会被删除。proxy_cache_use_stale updating+proxy_cache_background_update on,表示新资源正在下载,用旧的缓存资源来响应现在的请求,直到新资源下载完毕。proxy_cache_lock on:当多个请求都没找到相应缓存时,只能按照时间顺序,一个一个地向源服务器请求资源;如果此属性设置为 off,那么多个请求之间不会等待,多个请求一起向源服务器请求资源。
五、拆分缓存目录
可以把缓存目录拆分成多个,分别保存到多个硬盘中,达到缓存扩容的需求。
# 1、设置两块硬盘的缓存目录及配置
proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
max_size=10g inactive=60m use_temp_path=off;
# 2、访问URL 作为key,两个硬盘各负责一半的缓存
split_clients $request_uri $my_cache {
50% “my_cache_hdd1”;
50% “my_cache_hdd2”;
}
server {
# ...
location / {
# 3、启动缓存服务
proxy_cache $my_cache;
proxy_pass http://my_upstream;
}
}
六、通过 Cookie 和 Session 区分缓存文件
希望给每一个登录用户指定专门的缓存,提升用户的访问体验,可以通过 proxy_cache_key 设定特定的 key ,这样用户常用的网页,都被缓存。
# 组合 主机名、url、cookie、sessionid 作为缓存文件的唯一标识
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
七、支持 ETag 和 Vary?
-
NGINX 1.7.3 和 NGINX Plus R5 版本开始支持
ETag与If-None-Match,这两个头的功能,可以看这里! -
NGINX Plus R5 和 NGINX 1.7.7 版本开始支持
Vary,Vary 的功能,可以看这里!