Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching Varnish缓存使对象过快过期_Caching_Varnish_Varnish Vcl - Fatal编程技术网

Caching Varnish缓存使对象过快过期

Caching Varnish缓存使对象过快过期,caching,varnish,varnish-vcl,Caching,Varnish,Varnish Vcl,我的varnish(v3.0.2)缓存一直存在问题,它在不到60秒的时间内不断重置对象的缓存,尽管TTL为24小时,cookies被剥离,内容编码标准化,非关键头未设置,缓存控制设置为public,s-maxage=86400等 出于某种原因,如果您在一分钟内重复访问以下URL,您可以看到年龄逐渐增加,然后达到零(X-Cache返回未命中): 没有n_lru_裸对象,缓存超过60GB。我看了varnishlog,可能看到了ExpBan的一些情况,但我一辈子都不明白为什么 以下是我的vcl文件的

我的varnish(v3.0.2)缓存一直存在问题,它在不到60秒的时间内不断重置对象的缓存,尽管TTL为24小时,cookies被剥离,内容编码标准化,非关键头未设置,缓存控制设置为public,s-maxage=86400等

出于某种原因,如果您在一分钟内重复访问以下URL,您可以看到年龄逐渐增加,然后达到零(X-Cache返回未命中):

没有n_lru_裸对象,缓存超过60GB。我看了varnishlog,可能看到了ExpBan的一些情况,但我一辈子都不明白为什么

以下是我的vcl文件的一些关键部分:

sub vcl_recv {
  set req.grace = 120s;

   # normalize Accept-Encoding to reduce vary
  if (req.http.Accept-Encoding) {
    if (req.http.User-Agent ~ "MSIE 6") {
      unset req.http.Accept-Encoding;
    } 
    elsif (req.http.Accept-Encoding ~ "gzip") {
      set req.http.Accept-Encoding = "gzip";
    } 
    elsif (req.http.Accept-Encoding ~ "deflate") {
      set req.http.Accept-Encoding = "deflate";
    } 
    else {
      unset req.http.Accept-Encoding;
    }
  }

  # This uses the ACL action called "purge". Basically if a request to
  # PURGE the cache comes from anywhere other than localhost, ignore it.
  if (req.request == "PURGE") 
    {if (!client.ip ~ purge)
      {error 405 "Not allowed.";}
    return(lookup);}

  if (req.http.Upgrade ~ "(?i)websocket") {
    return (pipe);
  }

  # ....

  if ( req.http.host ~ "data\.eyewire\.org" ) {
    unset req.http.Cookie;
    unset req.http.Accept-Language;
    unset req.http.Expires;
    unset req.http.Cache-Control;
    unset req.http.User-Agent;
    return(lookup);
  }

  # ....
}


sub vcl_fetch {
  # ....

  if ( req.http.host ~ "data.eyewire.org" ) {
    if ( req.url ~ "^/volume" ) {
      unset beresp.http.Set-Cookie;
      set beresp.ttl = 24h;
      set beresp.http.Cache-Control = "public, s-maxage=86400";
      set beresp.http.X-TTL = beresp.ttl;
      return(deliver);
    }
    elsif (req.url ~ "^/cell") {
      set beresp.ttl = 1h;
      return(hit_for_pass);
    }
  }
}

# from http://blog.bigdinosaur.org/adventures-in-varnish/
sub vcl_pass {
  set bereq.http.connection = "close";
  if (req.http.X-Forwarded-For) {
      set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
  }
  else {
      set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
  }
}

# from http://blog.bigdinosaur.org/adventures-in-varnish/
sub vcl_pipe {
  #we need to copy the upgrade header
  if (req.http.upgrade) {
      set bereq.http.upgrade = req.http.upgrade;
      set bereq.http.connection = req.http.connection;
  }

  set bereq.http.connection = "close";
  if (req.http.X-Forwarded-For) {
      set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
  }
  else {
      set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
  }
}

# from http://blog.bigdinosaur.org/adventures-in-varnish/
sub vcl_hit {
  if (req.request == "PURGE") {
      purge;
      error 200 "Purged.";
  }
}

# from http://blog.bigdinosaur.org/adventures-in-varnish/
sub vcl_miss {
  if (req.request == "PURGE") {
      purge;
      error 200 "Purged.";
  }
}

sub vcl_deliver {  
    # Display hit/miss info
    if (obj.hits > 0) {
      set resp.http.X-Cache = "HIT";
      set resp.http.X-Cache-Hits = obj.hits;
    }
    else {
        set resp.http.X-Cache = "MISS";
    }

    # Security Non-Disclosure
    remove resp.http.X-Varnish;
    remove resp.http.X-Powered-By;
    remove resp.http.Server;

    return(deliver);
}
谢谢


编辑:仅供参考:为了解决生产中的问题,我不得不恢复对VCL的一些更改,但问题基本上还是一样的

我也经历过同样的行为,命中率上升,而且似乎缓存被清除了,没有任何原因。经过一些研究,我发现原因是vary:Accept Encoding,User-agent头导致每个User-agent保存不同的缓存


试着只为接受编码设置一个vary头。

我刚刚升级到Varnish 4,它似乎解决了这个问题。在升级过程中,我们还删除了vcl_hit和vcl_miss的定义,其中包括一个清除指令,该指令似乎没有被击中,但谁知道呢。

如果这实际上是正在使用的vcl,我觉得很奇怪,X-TTL没有出现在响应中。。。在您到达主机if子句之前是否会返回?(#……我猜这表明你认为不起作用)嘿,克拉伦斯,很抱歉,我应该把那个部分加回去。当我回滚VCL时,我还原了一些调试信息。但是,我可以毫无问题地添加VCL交付部分。现在让我来做。您能确认没有外部进程对内容发出清除请求吗?如果内容没有被LRU nuke逐出,那么它很可能被从缓存中清除/禁止。