HAOJX

nginx中缓存用法和优化

字数统计: 1.2k阅读时长: 5 min
2018/10/15 Share

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
Syntax:  proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location


Syntax:
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_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];
Default: —
Context: http

其中:

  • 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
2
3
Syntax:  proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

缓存什么样的响应

1
2
3
Syntax:  proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location

例如对不同的响应码缓存不同的时间: 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
2
3
Syntax:  proxy_cache_convert_head on | off;
Default: proxy_cache_convert_head on;
Context: http, server, location

对那个mathod方法是用缓存返回响应

1
2
3
Syntax:  proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

优化

###如何减少缓存失效时,上游的压力

####合并回源请求

1
2
3
Syntax:  proxy_cache_lock on | off;
Default: proxy_cache_lock off;
Context: http, server, location

表示 , 同一个时间内 , 只有第一个请求发往上游, 其他的请求就用第一个取到的值的缓存来返回

1
2
3
Syntax:  proxy_cache_lock_timeout time;
Default: proxy_cache_lock_timeout 5s;
Context: http, server, location

第一个请求的值的超时时间, 超过后其他请求会直接向上游发请求 ,但不缓存

1
2
3
Syntax:  proxy_cache_lock_age time;
Default: proxy_cache_lock_age 5s;
Context: http, server, location

上一个请求返回响应的超时时间,到达后再放行下一个请求

减少回源请求—使用stale陈旧缓存

1
2
3
4
5
6
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

其中:

  • 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
2
3
Syntax:  proxy_cache_background_update on | off;
Default: proxy_cache_background_update off;
Context: http, server, location

proxy_cache_use_stale允许使用过期响应时, 将同步生成一个子请求 , 通过访问上游服务更新过期的缓存

1
2
3
Syntax:  proxy_cache_revalidate on | off;
Default: proxy_cache_revalidate off;
Context: http, server, location

更新缓存时,使用If-Modified-Since和If-None-Match作为请求头部,预期内容未发生变更时通过304来减少传输的内容

及时清理缓存

ngx_cache_purge ?https://github.com/FRiCKLE/ngx_cache_purge

1
2
3
4
5
6
7
•syntax:  proxy_cache_purge on|off|<method> [from all|<ip> [.. <ip>]]
•default: none
•context: http, server, location

•syntax: proxy_cache_purge zone_name key
•default: none
•context: location
CATALOG
  1. 1. 缓存关键字
  2. 2. 缓存什么样的响应
  3. 3. 变更HEAD方法
  4. 4. 对那个mathod方法是用缓存返回响应
  5. 5. 优化
    1. 5.0.1. 减少回源请求—使用stale陈旧缓存
    2. 5.0.2. 及时清理缓存