网站的访问者浏览后浏览后获得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个状态的合成响应。诀窍是,它在复制了初始响应后意识到缺乏工作空间,因此您可以在日志中看到两个响应。