由于cookie尺寸而导致的500错误故障排除



网站的访问者浏览后浏览后获得500个内部服务器错误每次访问新页面时,都会附加页面名称(。

我可以使用curl带有非常大的cookie有效载荷来复制问题。通过这样做,我已经能够验证500个来自何处(我们从Cloudflare到Varnish到后端WebServer(。我已经证实了失败的请求不会到网络服务器,所以我相信Varnish是为500s服务的一个。我还看过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,但是如果使用HTTPIE,使用HTTP/2的HTTPIE,我会得到200。这是预期的吗?Varnish会根据HTTP版本的不同吗?

*编辑:我认为我已经弄清楚了两个响应状态的差异是一个是将内容交付给清漆,第二个是将内容交付给客户端。

正如日志所说,工作区太小,无法容纳交易(尤其是标题(,请尝试增加它:

varnishadm param.set workspace_client 128k

用于长解释:清漆为每次交易使用" worpspace"。这是用于分配数据的内存的一部分,并且在交易结束时将整个块删除。标题特别被复制到工作区中,每次添加或修改标头,也都会进入那里。

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

最新更新