varnish - 排除 Cookie 大小导致的 500 错误

标签 varnish

由于跟踪 cookie 将我们域的整体 cookie 大小推到 4kb 以上(这是一个页面查看 cookie,因此每次访问新页面时它都会附加页面名称)。

我可以使用带有非常大的 cookie 有效负载的 curl 来重现该问题。在这样做时,我已经能够验证 500 的确切来源(我们从 Cloudflare 到 Varnish 再到后端网络服务器)。我已经验证失败的请求不会到达网络服务器,所以我相信 Varnish 是为 500 提供服务的请求。我还观看了 varnishlog 并看到了 500 条。

这是来自 varnishlog 的示例响应

--  VCL_return     hash
--  VCL_call       HASH
--  VCL_return     lookup
--  Hit            57254162
--  VCL_call       HIT
--  VCL_return     deliver
--  RespProtocol   HTTP/1.1
--  RespStatus     200
--  RespReason     OK
--  RespHeader     X-Powered-By: Express
--  RespHeader     Date: Thu, 01 Aug 2019 23:05:52 GMT
--  RespHeader     Content-Type: application/json; charset=utf-8
--  RespHeader     Content-Length: 1174
--  RespHeader     X-Varnish: 57156196 57519178
--  RespHeader     Age: 86
--  RespHeader     Via: 1.1 varnish-v4
--  VCL_call       DELIVER
--  RespHeader     X-Cache: HIT
--  RespUnset      X-Powered-By: Express
--  VCL_return     deliver
--  Timestamp      Process: 1564700838.564547 0.000354 0.000354
--  RespHeader     Accept-Ranges: bytes
--  Debug          "RES_MODE 2"
--  RespHeader     Connection: keep-alive
--  Error          workspace_client overflow
--  RespProtocol   HTTP/1.1
--  RespStatus     500
--  RespReason     Internal Server Error
--  Timestamp      Resp: 1564700838.564580 0.000387 0.000033
--  ReqAcct        10063 0 10063 0 0 0
--  End

这是我添加到 vcl_recv 部分以删除有问题的 cookie 的内容
set req.http.Cookie = regsuball(req.http.Cookie, "_loc_[^;]+(; )?", "");

我不明白这里的两个 RespStatus 条目有什么意义。为什么是200,然后是500?我还注意到,如果我使用使用 HTTP/1.1 的 curl,我会得到 500,但如果我使用使用 HTTP/2 的 HTTPie,我会得到 200。这是预期的吗? Varnish 会根据 http 版本以不同的方式处理 cookie 大小吗?

*已编辑:我想我已经弄清楚了两种响应状态的不同之处在于,一种是将内容交付到 Varnish ,第二种是将内容交付给客户端。

最佳答案

正如日志所说,工作空间太小而无法容纳事务(尤其是 header ),请尝试增加它:

varnishadm param.set workspace_client 128k

长篇大论:varnish 为每个事务使用一个“worspace”。这是一 block 用于分配数据的内存,整个 block 在事务结束时被清除。 header 特别是被复制到工作区中,并且每次添加或修改 header 时,它也会去那里。

这里的问题是你没有足够的空间。早期版本只会 panic ,但它现在更聪明了,只会产生一个状态为 500 的合成响应。诀窍是它在复制初始响应后意识到缺少工作空间,因此您可以在日志中看到这两个响应。

关于varnish - 排除 Cookie 大小导致的 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57318306/

相关文章:

ssl - 我怎样才能告诉 Varnish 发送 https 给主人?

caching - Varnish 缓存-缓存403响应

apache - Varnish :可缓存但未缓存

由于 csrf token 未存储 django + varnish 缓存

Varnish http_req_hdr_len 参数不适用于请求 header 大小 > 8KB

ruby-on-rails - 如何使用 Cache-Control : max-age Header in a Rails environment? 控制 Varnish 和浏览器

caching - 缓存数百万网页的最佳方法

apache - 为什么默认情况下Varnish sess_timeout如此之低?

varnish - 如何检查 Varnish 缓存是否正常工作?

php - 如何在 wamp 中安装 Varnish ?