语法:
1 | Syntax: proxy_cache zone | off; |
其中:
- path 定义缓存文件存放位置
- levels 定义缓存路径目录层级 , 最多3级,每级目录长度为1或者2字节
- use_temp_path
- on 直接使用proxy_temp_path定义的临时文件
- off 直接使用path路径存放临时文件
- keys_zone name为共享内存名字, 由proxy_cache 指令使用 size指其大小 ,1MB可以放约8000个key
- inactive 默认10分钟 , 在inactive时间没有被访问的缓存会被淘汰掉
- max_size 设置最大的缓存文件大小 , 超出后由cache manger进程按LRU链表淘汰
- manger_files 默认100 , cache_manger进程在1次淘汰中, 淘汰的最大文件数
- manger_sleep 默认200 执行一次淘汰循环后 ,cache manger进程的休眠时间
- manger_threshold 执行一次循环淘汰的最大耗时 , 默认50毫秒
- loader_files cache loader进程载入磁盘中缓存文件到共享内存 , 每批次最多处理的文件数,.默认100
- loader_sleep 执行一次缓存文件到共享内存后 , 进程的休眠时间 , 默认200
- loader_threshold 每次载入缓存文件到共享内存的最大耗时, 默认50毫秒
缓存关键字
1 | Syntax: proxy_cache_key string; |
缓存什么样的响应
1 | Syntax: proxy_cache_valid [code ...] time; |
例如对不同的响应码缓存不同的时间: code 404 5m;
通过响应头部控制缓存时长
- X-Accel-Expires 单位秒 ,0表示禁止nginx缓存内容 , 还可以通过设置@缓存到一天的某个时刻
- 响应头部有Set-Cookie则不缓存
- 响应头部有Vary:* 则不缓存
X-Accel-Expires
1
2
3 > Syntax: X-Accel-Expires [offseconds]
> Default: X-Accel-Expires of
>
0表示不缓存, @前缀表示缓存到当天的某个时间
set-cookie头部:
1
2
3
4
5
6
7
8
9
10
11 > Set-Cookie: <cookie-name>=<cookie-value>
> Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
> Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
> Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
> Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
> Set-Cookie: <cookie-name>=<cookie-value>; Secure
> Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
> Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
> Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
> Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
>
变更HEAD方法
1 | Syntax: proxy_cache_convert_head on | off; |
对那个mathod方法是用缓存返回响应
1 | Syntax: proxy_cache_methods GET | HEAD | POST ...; |
优化
###如何减少缓存失效时,上游的压力
####合并回源请求
1 | Syntax: proxy_cache_lock on | off; |
表示 , 同一个时间内 , 只有第一个请求发往上游, 其他的请求就用第一个取到的值的缓存来返回
1 | Syntax: proxy_cache_lock_timeout time; |
第一个请求的值的超时时间, 超过后其他请求会直接向上游发请求 ,但不缓存
1 | Syntax: proxy_cache_lock_age time; |
上一个请求返回响应的超时时间,到达后再放行下一个请求
减少回源请求—使用stale陈旧缓存
1 | Syntax: |
其中:
- updating 表示当缓存内容过期时, 有一个请求正在访问上游试图更新, 其他请求用过期的缓存
- stale-while-revalidate 缓存过期后 , 定义一段时间 , 在这段时间内updating设置有效, 否则请求仍然访问上游服务 例如:Cache-Control: max-age=600, stale-while-revalidate=30
- stale-if-error 缓存内容过期后, 定义一段时间 , 在这段时间内上游服务出错后就继续使用缓存, 否则请求仍然访问上游服务, stale-while-revalidate包括stale-if-error . 例如: Cache-Control: max-age=600, stale-if-error=1200
- error 当与上游建立连接, 发送请求 ,读取响应头部等情况出错时, 使用缓存
- timeout 当与上游建立连接, 发送请求 ,读取响应头部等情况出现定时器超时, 使用缓存
- http _(500|502|503|504|403|404|429) 缓存以上响应码内容
1 | Syntax: proxy_cache_background_update on | off; |
proxy_cache_use_stale允许使用过期响应时, 将同步生成一个子请求 , 通过访问上游服务更新过期的缓存
1 | Syntax: proxy_cache_revalidate on | off; |
更新缓存时,使用If-Modified-Since和If-None-Match作为请求头部,预期内容未发生变更时通过304来减少传输的内容
及时清理缓存
ngx_cache_purge ?https://github.com/FRiCKLE/ngx_cache_purge
1 | •syntax: proxy_cache_purge on|off|<method> [from all|<ip> [.. <ip>]] |