文章目录

  • 缓存机制
  • 简单示例
  • 参数解析
  • 迭代加载
  • 缓存期限
  • 动静分离


缓存机制

缓存机制可以缓存来自代理的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;  
           }   
     }
}