Nginx系列(十六):HTTP Vary机制

一、概念

apache在响应头中返回了一个vary:Accept-encoding ,则squid在存储缓存文件时需要将“我的浏览器”发出的请求头信息中的Accept-encoding字段的值(大多情况就是gzip,deflate之类的)作为缓存key的一部分,因此对于不同的Accept-encoding字段值,都需要保存不同的文件。

二、请求阶段

在通过key值获取到缓存文件后(ngx_http_file_cache_read),如果缓存头包含vary信息,则计算该请求的variant,如果计算结果和缓存头中的variant值不一致,说明该节点不匹配。需要将variant值作为key,重新查找缓存节点(如果不存在则新建节点,将variant保存为key)。并设置r->cache->secondary位,表明该请求的是一个variant变化了的节点。

if (h->vary_len) {
/*根据缓存文件保存的响应vary信息,计算请求的variant值*/
    ngx_http_file_cache_vary(r, h->vary, h->vary_len, c->variant);
/*如果variant值不匹配,说明该缓存节点不要要找的。将variant作为key,查找新的缓存节点*/
    if (ngx_memcmp(c->variant, h->variant, NGX_HTTP_CACHE_KEY_LEN) != 0) {
        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                       "http file cache vary mismatch");
        return ngx_http_file_cache_reopen(r, c);
    }
}
三、响应阶段(ngx_http_file_cache_set_header)
   /*根据响应vary和请求,生成variant*/
    if (!c->secondary) {
        return NGX_OK;
    }
     
    /*如果新生成的variant,和保存的key(实际是旧节点的variant)一致,
    则说明响应vary未变化,只是请求variant发生变化,那么保存该variant作为key的节点。否则,说明
    响应vary发生了变化,更新旧节点*/
    if (c->vary.len
        && ngx_memcmp(c->variant, c->key, NGX_HTTP_CACHE_KEY_LEN) == 0)
    {
        return NGX_OK;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值