【问题标题】:Debugging Varnish via headers通过标头调试 Varnish
【发布时间】:2015-11-28 02:08:09
【问题描述】:

Varnish(快速运行)缓存对象的时间超过了我(我认为我)指定的时间。为了调试这个问题,我以以下方式在各处添加标题:

sub vcl_miss {
  set req.http.Debugmiss = "vcl_miss";
#FASTLY miss
  return(fetch);
}
sub vcl_deliver {
#FASTLY deliver
  set resp.http.Debugmiss = req.http.Debugmiss;
  return(deliver);
}

我已经为vcl_recvvcl_hitvcl_missvcl_passvcl_hashvcl_fetch 做过这个;但是,似乎根据标头调用的唯一函数是vcl_recv(进行查找)和vcl_deliver。例如,根据vcl_recv返回lookup代码后的状态图(https://www.varnish-software.com/book/3/_images/vcl.png),应该调用vcr_hash函数。如果是,它似乎没有设置任何标题。

有什么我忽略的吗?

这些是 curl 返回的响应头:

< HTTP/1.1 200 OK
< Server: Cowboy
< X-Frame-Options: SAMEORIGIN
< X-Xss-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Access-Control-Allow-Origin: *
< Content-Type: application/json; charset=utf-8
< Etag: W/"9fbfd39142780bd83fed663b051c83d9"
< X-Request-Id: a2a9b83a-4143-4b40-b788-94969dd5ce91
< X-Runtime: 0.020195
< X-Rack-Cache: miss
< Via: 1.1 vegur
< Content-Length: 434
< Accept-Ranges: bytes
< Date: Wed, 02 Sep 2015 13:41:41 GMT
< Via: 1.1 varnish
< Age: 4
< Connection: keep-alive
< X-Served-By: cache-lhr6332-LHR
< X-Cache: HIT
< X-Cache-Hits: 1
< X-Timer: S1441201301.048931,VS0,VE2
< Cache-Control: no-cache, no-store, private, must-revalidate, max-age=0, max-stale=0, post-check=0, pre-check=0
< Expires: 0
< Pragma: no-cache
< Debugrecv: vcl_recv
< Debugrecvreturn: lookup
< debugme: vcl_deliver; desperate8

完整的vcl可以在这里找到:https://gist.github.com/mdemare/2e0fa52e62691806e0a0

【问题讨论】:

  • 可以添加完整的vcl吗?
  • 当然,我已经添加了 vcl。

标签: varnish varnish-vcl


【解决方案1】:

我认为问题出在 您为 req 设置标头的 vcl 函数中,这是请求对象,而不是响应。所以当你查看响应头时,设置到 req 对象的那些不会显示出来。

您可以尝试查看请求标头,也可以使用 varnishlog (more info)

【讨论】:

  • 在大多数 vcl 函数中,我没有响应对象的写入权限。在vcl_deliver,第 317-323 行,我将请求标头复制到响应标头。该策略似乎至少适用于 vcl_recv 函数。
  • 我强烈建议在这种情况下使用 varnishlog。也许这样你甚至可以找到标题没有出现的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多