Skip to content

缓存

proxy_cache

是否开启缓存,如开启则设置缓冲共享内存地址空间。

sh
# 上下文 http server location

# 语法
# zone为开辟共享内存地址空间
proxy_cache zone | off;

# 默认值
proxy_cache off;

proxy_cache_path

是否开启缓存,如开启则设置缓冲共享内存地址空间。

sh
# 上下文 http 

# 语法
# 1M大约可以缓存8K个key
proxy_cache_path path [level=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];

# 默认值
proxy_cache_path off;

可选参数

可选参数含义
path缓存文件的存放路径
levelpath的目录层级
use_temp_pathoff直接使用path路径;on使用proxy_temp_path路径
keys_zonename是共享内存名称;size是共享内存大小
inactive在指定时间内没有被访问缓存会被清理;默认十分钟
max_size设定最大的缓存文件大小,超过酱油CM清理,CM指缓存管理器进程
manager_filesCM清理一次缓存文件,最大清理文件数;默认100
manager_sleepCM清理一次后进程的休眠时间;默认200ms
manager_thresholdCM清理一次最长耗时;默认50ms
loader_filesCL载入文件到共享内存,每批最多文件数;默认100,CL是缓存加载进程
loader_sleepCL加载缓存文件到内存后,进程休眠时间;默认200ms
loader_thresholdCL每次载入文件到共享内存的最大耗时;默认50ms

示例

sh
# levels的第一个2代表目录长度,第二个代表目录层级
proxy_cache_path /opt/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32g inactive=60m use_temp_path=off;

upstream cache_server {
	server 192.168.0.2:1010;
	server 192.168.0.2:1011;
}

server {
	listen 80;
	server_name cache.love.com;
	
	location / {
		proxy_cache cache_zone; # 对应在proxy_cache_path中的keys_zone里的cache_zone
		proxy_cache_valid 200 5m;
		add_header Nginx-Cache-Status "$upstream_cache_status";
		proxy_pass http://cache_server;
	}
}

proxy_cache_key

缓存内容的时候所保存的key信息。

sh
# 上下文 http server location

# 语法
proxy_cache_key string;

# 默认值
proxy_cache_key $scheme$proxy_host$request_uri

proxy_cache_valid

决定对那些内容进行响应,给上游服务器添加header X-Accel-Expires time,这个time需小于proxy_cache_valid的time,则可以将缓存到点置为过期。

sh
# 上下文 http server location

# 语法
proxy_cache_valid [code...] time;

# 默认值
proxy_cache_valid 60m; # 只对200、301/302响应码缓存

upstream_cache_status变量

upstream_cache_status 值含义
MISS未命中缓存
HIT命中缓存
EXPIRED缓存过期
STALE命中了陈旧缓存
REVALIDDATEDNginx验证陈旧缓存依然有效
UPDATING内容陈旧,但正在更新
BYPASS响应从原始服务器获取

配置Nginx不缓存特定内容

proxy_no_cache

不缓存某些内容,参数的string和proxy_cache_key的string是同一个意思。

sh
# 上下文 http server location

# 语法
proxy_no_cache string;

proxy_cache_bypass

不缓存某些内容,参数的string和proxy_cache_key的string是同一个意思。

sh
# 上下文 http server location

# 语法
proxy_cache_bypass string;

示例

sh
# levels的第一个2代表目录长度,第二个代表目录层级
proxy_cache_path /opt/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32g inactive=60m use_temp_path=off;

upstream cache_server {
	server 192.168.0.2:1010;
	server 192.168.0.2:1011;
}

server {
	listen 80;
	server_name cache.love.com;
	
	if ( $request_uri ~ \.(text)$ ){
		set $cookie_name "no cache";
	}
	
	location / {
		proxy_cache cache_zone; # 对应在proxy_cache_path中的keys_zone里的cache_zone
		proxy_no_cache $cookie_name; 
		proxy_cache_valid 200 5m;
		add_header Nginx-Cache-Status "$upstream_cache_status";
		proxy_pass http://cache_server;
	}
}

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

proxy_cache_lock

请求同一资源的URL同一时间到到Nginx,只有一个请求可以穿透请求上游服务器,返回响应并存储后再处理其它同一资源。

sh
# 上下文 http server location

# 语法
proxy_cache_valid on | off;

# 默认值
proxy_cache_valid off;

proxy_cache_lock_timeout

请求同一资源的URL同一时间到到Nginx,只有一个请求可以穿透请求上游服务器,返回响应并存储后再处理其它请求同一资源请求。假如超时,则其它请求同一资源的多个请求也会穿透Nginx同时传到上游服务器。

sh
# 上下文 http server location

# 语法
proxy_cache_lock_timeout time;

# 默认值
proxy_cache_lock_timeout 5s;

proxy_cache_lock_age

请求同一资源的URL同一时间到到Nginx,只有一个请求可以穿透请求上游服务器,返回响应并存储后再处理其它请求同一资源请求。假如超时,则其它请求同一资源的多个请求也会穿透Nginx同时传到上游服务器。这个参数就是限制超时后其它请求应该是以一定时间为间隔一个一个的传到上游服务器。

sh
# 上下文 http server location

# 语法
proxy_cache_lock_age time;

# 默认值
proxy_cache_lock_age 5s;

启动陈旧缓存

proxy_cache_use_stale

启用久的缓存。

sh
# 上下文 http server location

# 语法
# 1M大约可以缓存8K个key
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;

可选参数

可选参数含义
error向上游服务器传输请求或读取响应头发生错误
timeout向上游服务器传输请求或读取响应头发生超时
invalid_header无效头部时
http_500http响应状态码为500时等
updating缓存过期,正在更新时。
off禁用请求失败转发功能,直接将上游服务器结果返回给客户端

proxy_cache_background_update

如果是on,第一个请求也是读取缓存,然后Nginx自身向上游服务器发起第一个请求需要的请求资源,然后缓存起来。

sh
# 上下文 http server location

# 语法
proxy_cache_background_update  on | off;

# 默认值
proxy_cache_background_update off;

缓存清除

需要通过--add-modulengx_cache_purge添加编译,功能是根据接收的http请求立即清除缓存。

proxy_cache_purge

sh
# 上下文 http server location

# 语法
# zone_name 共享内存的地址,由proxy_cache_path定义
# key 由proxy_cache_key定义
proxy_cache_purge  zone_name key;

# 示例
location ~ /cache_purge(/.*) {
	proxy_cache_purge cache_zone $host$1;
}

location / {
  proxy_cache cache_zone; # 对应在proxy_cache_path中的keys_zone里的cache_zone
  proxy_no_cache $cookie_name; 
  proxy_cache_key $host$uri;
  proxy_cache_valid 200 5m;
  add_header Nginx-Cache-Status "$upstream_cache_status";
  proxy_pass http://cache_server;
  proxy_cache_use_stale error timeout updating;
  proxy_cache_background_update on;
}