缓存
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 | 缓存文件的存放路径 |
level | path的目录层级 |
use_temp_path | off直接使用path路径;on使用proxy_temp_path路径 |
keys_zone | name是共享内存名称;size是共享内存大小 |
inactive | 在指定时间内没有被访问缓存会被清理;默认十分钟 |
max_size | 设定最大的缓存文件大小,超过酱油CM清理,CM指缓存管理器进程 。 |
manager_files | CM清理一次缓存文件,最大清理文件数;默认100 |
manager_sleep | CM清理一次后进程的休眠时间;默认200ms |
manager_threshold | CM清理一次最长耗时;默认50ms |
loader_files | CL载入文件到共享内存,每批最多文件数;默认100,CL是缓存加载进程 。 |
loader_sleep | CL加载缓存文件到内存后,进程休眠时间;默认200ms |
loader_threshold | CL每次载入文件到共享内存的最大耗时;默认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 | 命中了陈旧缓存 |
REVALIDDATED | Nginx验证陈旧缓存依然有效 |
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_500 | http响应状态码为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-module
将ngx_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;
}