开启缓存时,http请求的流程如下
1 接收请求,解析请求头
2 查询本地副本
3 新鲜度检测,验证副本是否足够新鲜
4 创建响应并发送
新鲜度检测
expires:指定绝对过期日期,
cache-control:http1.1引入,以秒为单位,为相对过期日期;
服务器再验证
文档过期不代表已经修改,缓存需要询问原始服务器文档是否发生变化,发送条件GET,
If-modified-since:
If-none-match:
控制缓存
即控制在文档过期之前可以将其缓存多长时间,
响应首部,按优先级递减排序
cache-control:no-store:禁止使用缓存
cache-control:no-cache:进行缓存,但每次使用前必须与服务器进行新鲜度再验证之前
cache-control:max-age:设置为0表示禁用缓存
expires:指定绝对日期
cache-control:must-revalidate:缓存可提供一些陈旧对象,但在同服务器再验证之前不可使用
要使用代理缓存,必须在nginx.conf进行必要的配置
1 连接选项
主要由proxy_pass和upstream组成, 还有一些用于设置等待超时和请求头的选项,如proxy_hide_header,proxy_pass_header和proxy_set_header等;
Proxy_connect_timeout:nginx与后端服务器建立连接的超时时间
Proxy_read_timeout:nginx向后端服务器发出read请求后等待响应的超时时间
Proxy_send_timeout:nginx向后端服务器发出write请求后等待响应的超时时间
Proxy_redirect:修改被代理服务器响应头中的location
2 Proxy buffer
开启后,nginx先将被代理服务器的响应存于buffer,然后异步地发给客户端,若buffer不够大则暂存于临时文件;
若关闭proxy buffer,则ngnix只能同步将数据传输给客户端,Proxy buffer是per-request level,而非全局共享;
Buffer向客户端发送数据期间状态为busy,任何针对该buffer的请求都将失败;
Proxy_buffering:on|off,是否启用proxy buffer;
Proxy_buffers number size:buffer的个数和大小;
Proxy_busy_buffers_size: 处于busy状态的buffer大小;
3 Proxy cache
除了充当代理服务器,nginx还可行使类似varnish/squid的缓存职责,即将客户端的请求内容缓存在Nginx服务器,下次同样的请求则由nginx直接返回,减轻了被代理服务器的压力;
cache使用一块公共内存区域(共享内存),存放缓存的索引数据,Nginx启动时cache loader进程将磁盘缓存的对象文件(cycle->pathes,以红黑树组织)加载到内存中,加载完毕后自动退出;
只有开启了proxy buffer才能使用proxy cache;
注1:若被代理服务器返回的http头包含no-store/no-cache/private/max-age=0或者expires包含过期日期时,则该响应数据不被nginx缓存;
配置项
Proxy_cache zone|off:公共内存的名称,存放缓存的索引数据,nginx启动时由cache loader进程建立,而后由cache manager进程管理;off则关闭proxy_cache;
Proxy_cache_bypass string …:有一个字符串不为空或不等于0时,nginx向客户端发送响应时不使用缓存;
Proxy_no_cache string:规定何种情况下不使用cache;
Proxy_cache_key string;为缓存建立索引时使用的关键字;
Proxy_cache_min_uses number:默认为1,当客户端发送相同请求达到规定次数后,nginx才对响应数据进行缓存;
Proxy_cache_path:缓存的存储路径和索引信息;
path 缓存文件的根目录;
level=N:N在目录的第几级hash目录缓存数据;
keys_zone=name:size 缓存索引重建进程建立索引时用于存放索引的内存区域名和大小;
interval=time强制更新缓存时间,规定时间内没有访问则从内存中删除,默认10s;
max_size=size硬盘中缓存数据的上限,由cache manager管理,超出则根据LRU策略删除;
loader_sleep=time索引重建进程在两次遍历间的暂停时长,默认50ms;
loader_files=number重建索引时每次加载数据元素的上限,进程递归遍历读取硬盘上的缓存目录和文件,对每个文件在内存中建立索引,每建立一个索引称为加载一个数据元素,每次遍历时可同时加载多个数据元素,默认100;