添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

指令

1




    

2
3
4
5
6
7
8
#语法
proxy_cache zone | off;
#默认值
proxy_cache off;
#上下文:http, server, location

定义用于缓存的共享内存空间;同一个zone可以在多个地方使用。
off参数禁用从先前配置级别继承的缓存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#语法
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [min_free=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

设置缓存的路径和其他参数。缓存数据存储在文件中。
缓存中的文件名是对cache key(proxy_cache_key)应用MD5函数的结果
levels参数定义缓存的层次结构级别:从13,每个级别接受值12


#当levels=1:2时,表示是两级目录,1和2表示用1位和2位16进制来命名目录名称。在此例中,第一级目录用1位16进制命名,如b;第二级目录用2位16进制命名,如2b。所以此例中一级目录有16个,二级目录有16*16=256个;
/data/nginx/cache/b/2b/d7b6e5978e3f042f52e875005925e51b
总目录数为16*256=4096个。

#当levels=1:1:1时,表示是三级目录,且每级目录数均为16个:
/data/nginx/cache/b/c/d/d7b6e5978e3f042f52e87500592
总目录数为16*16*16=4096个。

#当levels=2:2:2时,表示是三级目录,且每级目录数均为16*16个:
/data/nginx/cache/2b/3c/4d/d7b6e5978e3f042f52e875005925e51b
总目录数为256*256*256个。

#被缓存的响应首先写入临时文件,然后文件被重命名
keys_zone=name:size 必选 所有活动的密钥和有关数据的信息都存储在共享内存区域中,其名称和大小由 keys_zone 参数配置
name是共享内存名称;size是共享内存大小;
1M的区域可以存储大约 8000 个密钥。 inactive=time 在指定时间内没有被访问的缓存会被清理;默认10分钟 max_size=size 设定最大缓存文件大小
当超过大小时,CM(Cache Manager)会删除最近最少使用的数据 min_free=size 设定最小可用空间大小
当没有足够的可用空间时,CM(Cache Manager)会删除最近最少使用的数据 manager_files=number CM清理一次缓存文件,最大清理文件数;默认100 manager_sleep=time CM清理一次后进程的休眠时间;默认50ms manager_threshold=time CM清理一次最长耗时;默认200ms loader_files=number CL(Cache Loader)每次加载文件的最大数量;默认100 loader_sleep=time CL加载缓存文件到共享内存后,进程休眠时间;默认50ms loader_threshold=time CL每次载入文件到共享内存的最大耗时,默认200ms
1
2
3
4
5
6
7
8
9
10
11
12
13
#语法
proxy_temp_path path [level1 [level2 [level3]]];
#默认值
proxy_temp_path proxy_temp;
#上下文:http, server, location

定义一个目录,用于存储从代理服务器接收到的数据的临时文件;指定目录下最多可以使用三级子目录层次结构

#示例
在以下配置中:
proxy_temp_path /spool/nginx/proxy_temp 1 2;
临时文件可能如下所示:
/spool/nginx/proxy_temp/7/45/00000123457
1
2
3
4
5
6
7
#语法
proxy_cache_key string;
#默认值
proxy_cache_key $scheme$proxy_host$request_uri;
#上下文:http, server, location

定义缓存的key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#语法
proxy_cache_valid [code ...] time;
#默认值:无
#上下文:http, server, location

为不同的响应代码设置缓存时间

#为200和302的响应设置10分钟的缓存,为404的响应设置1分钟
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

#如果只指定time,那么只有200、301和302响应被缓存。
proxy_cache_valid 5m;

#此外,可以指定 any 参数来缓存任何响应
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;

#缓存的参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级。
header中的X-Accel-Expires字段设置响应的缓存时间(以秒为单位);设置为0则禁止使用响应缓存。
如果header中不包含“X-Accel-Expires”字段,可以在header中的“Expires”或“Cache-Control”字段设置缓存参数
如果header中包含“Set-Cookie”字段,则不会缓存此类响应
如果header中包含具有特殊值“*”的“Vary”字段,则不会缓存此类响应
1
2
3
4
5
6
7
8
9
10
11
12
13
#变量
$upstream_cache_status

资源缓存的状态

状态可以是以下值:
MISS:未命中缓存,请求被发送到应用服务器,应用服务器响应后将响应内容缓存
HIT:命中缓存,直接返回缓存内容
EXPIRED:缓存过期,请求被发送到应用服务器,应用服务器响应后将响应内容缓存
STALE:命中 proxy_cache_use_stale 指令设置的条件时,既服务器出现错误时,返回过期的缓存数据时,会返回这个状态码
REVALIDDATED:Nginx验证陈旧缓存依然有效
UPDATING:当缓存已经过期,正在被其他nginx worker进程更新时,返回该状态
BYPASS:当命中 proxy_cache_bypass 中设置的条件时,直接从后端源站返回内容,该变量状态变为BYPASS
1
2
3
4
5
6
7
8
9
10
11
12
#语法
proxy_cache_bypass string ...;
#默认值:无
#上下文:http, server, location

定义不从缓存中获取响应的条件
如果string参数中至少有一个值不为空且不等于“0”,则不会从缓存中获取响应

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;

可以与 proxy_no_cache 指令一起使用

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#上游服务器
server {
listen 8009;
root /var/www/html/test1;

add_header X-Accel-Expires 5; #通过响应头来设置缓存过期时间
location / {
index index.html;
}
}
server {
listen 8010;
root /var/www/html/test2;

add_header X-Accel-Expires 5; #通过响应头来设置缓存过期时间
location / {
index index.html;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#设置共享内存及缓存路径
proxy_cache_path cache levels=1:2 keys_zone=cache_temp:10m;

upstream cache_server {
server ip|domain:8009;
server ip|domain:8010;
}

server {
listen 95;

location / {
proxy_cache cache_temp; #开启缓存并指定共享内存空间
proxy_cache_valid 200 5m; #针对200响应设置5分钟缓存时间
proxy_cache_key $host$request_uri; #设置cache key
add_header Nginx-cache-status $upstream_cache_status; #添加响应头字段,用来展示缓存状态
proxy_pass http://cache_server;
}
}
1
2
3
#注意:X-Accel-Expires优先级比proxy_cache_valid高,所以X-Accel-Expires会导致proxy_cache_valid设置无效,
#所以可以注释掉其中一个来模拟缓存情况,当然两个都存在也不影响正常运行
#本次示例上游服务器设置X-Accel-Expires为5秒,代理服务器proxy_cache_valid设置为5分钟

配置Nginx不缓存特定内容

1
2
3
4
5
6
7
8
9
10
11
12
#语法
proxy_no_cache string ...;
#默认值:无
#上下文:http, server, location

定义不将响应保存到缓存的条件
如果string参数中至少有一个值不为空且不等于“0”,则不会保存响应

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma $http_authorization;

可以与 proxy_cache_bypass 指令一起使用

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#上游服务器
server {
listen 8011;
root /var/www/html/test1; #目录下有123.txt,abc.text,index.html

location / {
index index.html;
}
}
server {
listen 8012;
root /var/www/html/test2; #目录下有123.txt,abc.text,index.html

location / {
index index.html;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
proxy_cache_path cache levels=1:2 keys_zone=cache_temp:10m;

upstream cache_server {
server ip|domian:8009;
server ip|domain:8010;
}

server {
listen 96;

#如果uri以.txt或.text结尾,则设置自定义变量$no_cache
if ( $request_uri ~ \.(txt|text)$ ) {
set $no_cache "no cache";
}

location / {
proxy_cache cache_temp;
proxy_cache_valid 200 5m;
proxy_cache_key $host$request_uri;
proxy_no_cache $no_cache; #如果$no_cache不为空或0,则不进行缓存
add_header Nginx-cache-status $upstream_cache_status;
proxy_pass http://cache_server;
}
}
1
2
3
4
5
6
curl 127.0.0.1:96/index.html -I
curl 127.0.0.1:96/index.html -I
#访问index.html可以看到会命中缓存(或去proxy_cache_path目录查看缓存文件)

curl 127.0.0.1:96/123.txt -I 或者 curl 127.0.0.1:96/abc.text -I
#运行多次此命令,也不会进行缓存,Nginx-cache-status标识为MISS(或去proxy_cache_path目录查看是否有新缓存文件)

缓存失效降低上游压力机制

合并源请求

image
1
2
3
4
5
6
7
8
9
#语法
proxy_cache_lock on | off;
#默认值
proxy_cache_lock off;
#上下文http, server, location
This directive appeared in version 1.1.12.

当参数为on时,一次只允许一个请求(cache key相同的请求)通过,将请求传递给代理服务器,并缓存返回的响应。
其他请求要么等待响应出现在缓存中,要么等待缓存锁被释放,直到proxy_cache_lock_timeout指令设置的时间。
1
2
3
4
5
6
7
8
#语法
proxy_cache_lock_timeout time;
#默认值
proxy_cache_lock_timeout 5s;
#上下文:http, server, location
This directive appeared in version 1.1.12.

为 proxy_cache_lock 设置超时时间;当时间到期时,其他请求将被传递到代理服务器,但是响应不会被缓存。
1
2
3
4
5
6
7
8
#语法
proxy_cache_lock_age time;
#默认值
proxy_cache_lock_age 5s;
#上下文:http, server, location
This directive appeared in version 1.7.8.

如果在指定时间内,传递给代理服务器以填充新缓存的最后一个请求未完成,则可能会再向代理服务器传递一个请求
简单示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
proxy_cache_path cache levels=1:2 keys_zone=cache_temp:10m;

upstream cache_server {
server ip|domian:8009;
server ip|domain:8010;
}

server {
listen 96;

#如果uri以.txt或.text结尾,则设置自定义变量$no_cache
if ( $request_uri ~ \.(txt|text)$ ) {
set $no_cache "no cache";
}

location / {
proxy_cache cache_temp;
proxy_cache_valid 200 5m;
proxy_cache_key $host$request_uri;
proxy_no_cache $no_cache; #如果$no_cache不为空或0,则不进行缓存
add_header Nginx-cache-status $upstream_cache_status;
proxy_pass http://cache_server;

proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_lock_age 5s;
}
}

启用陈旧缓存

1
2
3
4
5
6
7
#语法
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
#默认值
proxy_cache_use_stale off;
#上下文:http, server, location

确定在哪些情况下可以在与代理服务器通信期间使用过时的缓存响应。该指令的参数与 proxy_next_upstream 指令的参数相似。
1
2
3
4
5
6
7
8
9
#语法
proxy_cache_background_update on | off;
#默认值
proxy_cache_background_update off;
#上下文:http, server, location
This directive appeared in version 1.11.10.

允许启动后台子请求以更新过期的缓存项,同时将过时的缓存响应返回给客户端。(后台更新缓存,先把过期缓存返回给客户端)
如果参数为on,请注意,有必要在更新时允许使用过期的缓存响应( proxy_cache_use_stale updating )
简单示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
proxy_cache_path cache levels=1:2 keys_zone=cache_temp:10m;

upstream cache_server {
server ip|domian:8009;
server ip|domain:8010;
}

server {
listen 96;

#如果uri以.txt或.text结尾,则设置自定义变量$no_cache
if ( $request_uri ~ \.(txt|text)$ ) {
set $no_cache "no cache";
}

location / {
proxy_cache cache_temp;
proxy_cache_valid 200 5m;
proxy_cache_key $host$request_uri;
proxy_no_cache $no_cache; #如果$no_cache不为空或0,则不进行缓存
add_header Nginx-cache-status $upstream_cache_status;
proxy_pass http://cache_server;

proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_lock_age 5s;

proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on;
}
}

ngx_cache_purge第三方缓存清除模块