缓存机制
💡对于性能优化而言,缓存是一种能够大幅度提升性能的方案,属于代理缓存的一种。
代理缓存常用配置
proxy_cache_path:代理缓存的路径
💡语法: 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]
参数项含义如下:
- path: 缓存的路径地址。
- levels: 缓存存储的层次结构,最多允许三层目录。
- use_temp_path: 是否使用临时目录
- keys_zone: 指定一个共享内存空间来存储热点Key(1M可存储8000个Key)
- inactive: 设置缓存多长时间未被访问后删除 (默认是十分钟)
- max_size: 允许缓存的最大存储空间,超出后会基于LRU算法移除缓存,Nginx会创建个Cache manager的进程移除数据,也可以通过purge方式
- manager_files: manager进程每次移除缓存文件数量的上限
- manager_sleep: manager进程每次移除缓存文件的时间上限
- manager_threshold: manager进程每次移除缓存后的间隔时间。
- loader_files: 重启Nginx载入缓存时,每次加载的个数,默认100
- loader_sleep: 每次载入时,允许的最大时间上限,默认200ms
- loader_threshold:一次载入后,停顿的时间间隔,默认50
- mspurger: 是否开启purge方式移除数据
- purger_files: 每次移除缓存文件时的数量
- purger_sleep: 每次移除时,允许消耗的最大时间
- purger_threshold: 每次移除完成后,停顿的间隔时间
proxy_cache: 开启或关闭代理缓存,开启时需要指定一个共享内存区域
💡语法: proxy_cache zone | off
- zone为内存区域的名称,proxy_cache_path中keys_zone设置的名称
proxy_cache key: 定义如何生成缓存的键
💡语法: proxy_cache_key string;
- string为生成Key的规则,如: s c h e m e scheme schemeproxy_host$request_uri
proxy_cache_valid: 缓存生效的状态码与过期时间
💡语法: proxy_cache_valid [code …] time;
- code为状态码,time为有效时间,可以根据状态码设置不同的缓存时间
- 例如: proxy_cache_valid 200 302 30m
proxy_cache_min_uses: 设置资源被请求多少次后被缓存
💡语法: proxy_cache_min_uses number;
- number为次数,默认为1
proxy_cache_use_stale: 当后端出现异常时,是否许Nginx返回缓存作为响应
💡语法: proxy_cache_use_stale error;
error为错误类型,可配置timeoutlinvalid headerlupdating http 500…
proxy_cache_lock: 对于相同的请求,是否开启锁机制,只允许一个请求发往后端.
💡语法: proxy_cache_lock on | off;
proxy_cache_lock_timeout: 配置锁超时机制,超出规定时间后会释放请求
💡语法: proxy_cache_lock_timeout time;
proxy_cache_methods: 设置对于那些HTTP方法开启缓存
💡语法: proxy_cache_methods method
- method为请求方法类型,如GET、HEAD等
proxy_no_cache: 定义不存储缓存的条件,符合时不会保存
💡语法: proxy_no_cache string…;
- string为条件,例如$cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass: 定义不读取缓存的条件,符合时不会从缓存中读取
💡语法: proxy_cache_bypass string…
add_header: 往响应头中添加字段信息。
💡语法: add_header fieldName fieldValue
$upstream cache status: 记录了缓存是否命中的信息,存在多种情况
💡配置内置变量
- MISS: 请求未命中缓存
- HIT: 请求命中缓存
- EXPIRED: 请求命中缓存但缓存已过期
- STALE: 请求命中了陈旧缓存
- REVALIDDATED: Nginx验证陈旧缓存依然有效
- UPDATING: 命中的缓存内容陈旧,但正在更新缓存
- BYPASS: 响应结果是从原始服务器获取的
http{
# 设置缓存的目录,并且内存中缓存区名为hot_cache,大小为128m,
# 三天未被访问过的缓存自动清楚,磁盘中缓存的最大容量为2GB。
proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g;
server{
location / {
# 使用名为nginx_cache的缓存空间
proxy_cache hot_cache;
# 对于200、206、304、301、302状态码的数据缓存1天
proxy_cache_valid 200 206 304 301 302 1d;
# 对于其他状态的数据缓存30分钟
proxy_cache_valid any 30m;
# 定义生成缓存键的规则(请求的url+参数作为key)
proxy_cache_key $host$uri$is_args$args;
# 资源至少被重复访问三次后再加入缓存
proxy_cache_min_uses 3;
# 出现重复请求时,只让一个去后端读数据,其他的从缓存中读取
proxy_cache_lock on;
# 上面的锁超时时间为3s,超过3s未获取数据,其他请求直接去后端
proxy_cache_lock_timeout 3s;
# 对于请求参数或cookie中声明了不缓存的数据,不再加入缓存
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
# 在响应头中添加一个缓存是否命中的状态(便于调试)
add_header Cache-status $upstream_cache_status;
}
}
}
缓冲区
- proxy_buffering: 是否启用缓冲机制,默认为on关闭状态
- client_body_buffer_size: 设置缓冲客户端请求数据的内存大小
- proxy_buffers: 为每个请求/连接设置缓冲区的数量和大小,默认4 4k/8k
- proxy_buffer_size: 设置用于存储响应头的缓冲区大小
- proxy_busy_buffers_size: 在后端数据没有完全接收完成时,Nginx可以将busy状态的缓冲返回给客户端,该参数用来设置busy状态的buffer具体有多大,默认为proxy buffer size*2
- proxy_temp_path: 当内存缓冲区存满时,可以将数据临时存放到磁盘,该参数是设置存储缓冲数据的目录
💡语法: proxy_temp_path path
- path是临时目录的路径 - proxy_temp_file_write_size: 设置每次写数据到临时文件的大小限制
- proxy_max_temp_file_size: 设置临时的缓冲目录中允许存储的最大容量
- 非缓冲参数项:
- proxy_connect_timeout: 设置与后端服务器建立连接时的超时时间
- proxy_read_timeout: 设置从后端服务器读取响应数据的超时时间
- proxy_send_timeout: 设置向后端服务器传输请求数据的超时时间
http{
# 设置与后端服务器建立连接时的超时时间
proxy_connect_timeout 10;
# 设置从后端服务器读取响应数据的超时时间
proxy_read_timeout 120;
# 设置向后端服务器传输请求数据的超时时间
proxy_send_timeout 10;
# 是否启用缓冲机制,默认为on关闭状态
proxy_buffering on;
# 设置缓冲客户端请求数据的内存大小
client_body_buffer_size 512k;
# 为每个请求/连接设置缓冲区的数量和大小
proxy_buffers 4 64k;
# 设置用于存储响应头的缓冲区大小。
proxy_buffer_size 16k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
# 设置存储缓冲数据的目录
proxy_temp_path /soft/nginx/temp_buffer;
}