浏览器缓存
校验过期机制
- 校验是否过期的请求头
- Expires
- 1.1 版本
- Cache_control(max-age)
- 1.0 版本
- Expires
- 协议中 Etag 头信息校验
- Etag
- 独立字符串
- Etag
Last-Modified 头信息校验
浏览器的实现可能不会遵循服务器设置的 Cache_control 和 Expires 的设置
指令
Syntax: | **expires** [ modified] time; **expires** epoch` |
max |
off ;` |
---|---|---|---|
Default: | expires off; | ||
Context: | http , server , location , if in location |
||
Desc: | 添加 Cache-Control、Expires 头 |
内置缓存模块
-
指令
设置
proxy_cache <zone_name> | off
- 是否开启缓存,写入指定名称的 zone 空间中
- 上下文 http server location
- 默认值 off
proxy_cache_path <path> [levels=levels] [use_temp_path=on|off] keys_zone=<zone_name>:<size> [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
- 设置缓存磁盘位置
- 上下文 http
- 默认值 off
- 参数
- path
- 缓存磁盘文件目录
- levels
- path 的目录层级
- use_temp_path
- off 直接使用 path 路径
- on 使用
proxy_temp_path
路径
- keys_zone
- zone_name
- 共享内存名称
- size:
- 共享内存大小
- zone_name
- inactive
- 指定时间内没有被访问缓存会被清理
- 默认 10 Min
- max_size
- 设置最大的缓存文件大小
- 超过由 CM(cache manager) 清理
- manager_files
- CM 清理一次缓存文件,最大清理文件数
- 默认 100
- manager_sleep
- CM 清理一次后进程的休眠时间
- 默认 200ms
- manager_threshold
- CM 清理一次最长耗时
- 默认 50ms
- loader_files
- CL(cache loader) 载入文件到共享内存,每批最多文件数
- 默认 100
- loader_sleep
- CL 加载缓存文件到内存后,进行休眠时间
- 默认 200ms
- loader_threshold
- CL 每次载入文件到共享内存的最大耗时
- 默认 50ms
- path
proxy_cache_key <string>
- 缓存文件中的缓存 key
- 上下文 http server location
- 默认值 $scheme$proxy_host$request_uri
淘汰
proxy_cache_valid [code ...] <time>
- 设置指定响应状态的缓存文件的缓存时间,间隔之后再访问该缓存文件时,文件会过期,从而去源服务器重新取数据。
- 上下文 http server location
- 默认值 200 301 302
- 参数
- time 缓存时间
设置不缓存
proxy_no_cache <string>
- 如果某个变量有值,则不缓存
- 上下文 http server location
- 默认值 nothing
proxy_cache_bypass <string>
- 如果某个变量有值,则不缓存
- 上下文 http server location
- 默认值 nothing
内置变量
$upstream_cache_status
- MISS 未命中缓存
- HIT 命中缓存
- EXPIRED 缓存过期
- STALE 命中陈旧缓存
- REVALIDDATED nginx 验证陈旧缓存依旧有效
- UPDATING 内存陈旧,但是正在更新
- BYPASS 响应从原始服务器获取
缓存失效问题
- 避免缓存穿透
合并缓存请求的指令
| Syntax: |**proxy_cache_lock**
on|
off;
| | :—- | —- | | Default: | proxy_cache_lock off; | | Context: |http
,server
,location
| | Desc: | on 时,多个对同一个缓存的请求,只有第一个请求会穿透 nginx ,生成缓存;而其他会排队,等待第一个请求设置的缓存 |
This directive appeared in version 1.1.12.
Syntax: | **proxy_cache_lock_timeout** time; |
---|---|
Default: | proxy_cache_lock_timeout 5s; |
Context: | http , server , location |
Desc: | 给 proxy_cache_lock 参数设置一个超时时间,如果首个请求没有在超时时间内设置成功缓存,剩下的待排队的请求,即所有的请求都会被转发到代理服务上。但相应的数据,不会被生成缓存 |
This directive appeared in version 1.1.12.
Syntax: | **proxy_cache_lock_age** time; |
---|---|
Default: | proxy_cache_lock_age 5s; |
Context: | http , server , location |
Desc: | 如果第一个进入的请求,没有在该参数设置的时间内完成,则会放行下一个请求,以生成缓存 |
This directive appeared in version 1.7.8.
启用陈旧缓存的指令
- 处理时效性较低的数据
| Syntax: |
**proxy_cache_use_stale**
error|
timeout|
invalid_header|
updating|
http_500|
http_502|
http_503|
http_504|
http_403|
http_404|
http_429|
off...;
| | :—- | —- | | Default: | proxy_cache_use_stale off; | | Context: |http
,server
,location
| | Desc: | 启用陈旧缓存,在更新缓存的请求还没有获取到最新数据并且设置进缓存时,其他请求直接获取陈旧缓存 |
Syntax: | **proxy_cache_background_update** on` |
off ;` |
---|---|---|
Default: | proxy_cache_background_update off; | |
Context: | http , server , location |
|
Desc: | 逻辑上发起更新缓存的请求也会读取陈旧缓存,nginx 自身会另外发起一个更新缓存的请求 |
This directive appeared in version 1.11.10.
ngx_cache_purge 第三方缓存清除模块
- 缓存清除模块
- 获取 https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
--add-module=./bundle/ngx_cache_purge-2.3/
进行安装
指令
Syntax: | proxy_cache_purge zone_name key |
---|---|
Default: | none |
Context: | http , server , location |
Desc: | 根据 https://github.com/FRiCKLE/ngx_cache_purge 描述,该指令是单独位置语法,即不和原生的相同存在;需要使用 proxy_cache_path 设置 zone ;其中 key 类似 proxy_cache_key 的设置 |