缓存机制
缓存机制可以缓存来自代理的web和应用服务器的静态和动态内容到磁盘上,以加快客户端的请求并减少服务器上的负载。
简单示例
http {
# 需要设置proxy_cache_path 为缓存资源的路径
# keys_zone定义缓存的名称及缓存元数据区域的内存大小
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
server {
# 然后在想要启用缓存的上下文中指定proxy_cache 缓存名
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}
参数解析
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:一次载入后,停顿的时间间隔,默认50ms。
- purger:是否开启purge方式移除数据。
- purger_files:每次移除缓存文件时的数量。
- purger_sleep:每次移除时,允许消耗的最大时间。
- purger_threshold:每次移除完成后,停顿的间隔时间。
迭代加载
-
cache manager定期检查缓存的状态,如果缓存大小超过proxy_cache_path指令的max_size参数设置的限制,则缓存管理器将删除最近访问次数最少的数据。在两次缓存管理器激活之间的时间间隔内,缓存的数据量可能会暂时超过限制。
-
cache loader只在nginx启动之后运行一次,将缓存数据的元数据加载到内存区域。为了避免一次加载整个缓存可能会消耗足够的资源,可以设置如下参数来配置缓存的“慢加载”
- loader_threshold:迭代的持续时间,以毫秒为单位(默认为200毫秒)
- loader_files:在一次迭代期间加载的最大项数(默认为100)
- loader_slept :迭代之间的延迟,以毫秒为单位(默认为50毫秒)
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m loader_threshold=300 loader_files=200;
缓存期限
默认情况下,响应将无限期地保留在缓存中。只有当缓存超过最大配置大小时,它们才会被删除。通过在http{}、server{}或location{}上下文中使用proxy_cache_valid可以设置缓存响应的有效时间。
# 定义200和302的响应 缓存有效时间为10min
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 定义所有的影响 缓存有效时间为5min
proxy_cache_valid any 5m;
http{
# 设置缓存的目录,并且内存中缓存区名为hot_cache,大小为128m,
# 三天未被访问过的缓存自动清楚,磁盘中缓存的最大容量为2GB。
proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=mycache:128m inactive=3d max_size=2g;
server{
location / {
# 使用名为nginx_cache的缓存空间
proxy_cache mycache;
# 对于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;
}
}
}
动静分离
将静态资源单独存放到某个目录下
http {
server {
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
root /soft/nginx/static_resources;
expires 7d;
}
}
}