浏览器缓存

校验过期机制

  • 校验是否过期的请求头
    • Expires
      • 1.1 版本
    • Cache_control(max-age)
      • 1.0 版本
  • 协议中 Etag 头信息校验
    • Etag
      • 独立字符串
  • Last-Modified 头信息校验

    • 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 头

内置缓存模块

  • 和 nginx 结构的 CM 和 CL 有关

    指令

    设置

  • 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:
          • 共享内存大小
      • 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
  • 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 第三方缓存清除模块

指令

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 的设置