我正面临着一个相当棘手的问题,它似乎是清漆关闭后端连接,而不是等待来自后端的响应。
我们正在使用Nginx来提供静态内容,下面是消息序列
Varnish将POST请求发送到应用程序发送回500内部服务器错误Varnish解释500内部服务器错误(以显示静态错误页面) Varnish向Nginx服务器(在同一服务器上)发送GET请求以提供静态内容Varnish显示以下错误消息(即使Nginx在毫秒内成功发送响应)
- VCL_call BACKEND_FETCH
- VCL_return fetch
- BackendOpen 38 boot.staticpages 127.0.0.1 82 127.0.0.1 35064
- BackendStart 127.0.0.1 82
- FetchError backend write error: 0 (Success)
- Timestamp Bereq: 1543420795.016075 5.106813 0.000099
- BackendClose 38 boot.staticpages
- Timestamp Beresp: 1543420795.016497 5.107235 0.000422
- Timestamp Error: 1543420795.016503 5.107241 0.000005
- BerespProtocol HTTP/1.1
- BerespStatus 503
- BerespReason Service Unavailable
- BerespReason Backend fetch failed
- BerespHeader Date: Wed, 28 Nov 2018 15:59:55 GMT
- BerespHeader Server: Varnish
- VCL_call BACKEND_ERROR
然后,Varnish再次使用相同的Nginx服务器来显示默认内容。Nginx发送响应,varnish接受并返回给客户
看起来后端连接很快就关闭了
在这方面的任何帮助都是非常感谢的。
谢谢,
发布于 2018-12-03 14:26:14
我们解决了问题,下面是问题的总结以及我们是如何解决它的;
问题摘要:当原始POST请求导致500内部错误且backend_response用于获取静态页面自定义的500内部服务器错误消息时, Varnish显示后端获取错误
VarnishLog Output (只有相关消息):可以看到请求一发出,后台就关闭了。
- VCL_call BACKEND_FETCH
- VCL_return fetch
- BackendOpen 24 boot.staticpages 127.0.0.1 82 127.0.0.1 40696
- BackendStart 127.0.0.1 82
- FetchError backend write error: 0 (Success)
- Timestamp Bereq: 1543416195.877756 5.116981 0.000046
- BackendClose 24 boot.staticpages
- Timestamp Beresp: 1543416195.877888 5.117113 0.000132
- Timestamp Error: 1543416195.877892 5.117117 0.000004
- BerespProtocol HTTP/1.1
- BerespStatus 503
- BerespReason Service Unavailable
- BerespReason Backend fetch failed
- BerespHeader Date: Wed, 28 Nov 2018 14:43:15 GMT
- BerespHeader Server: Varnish
- VCL_call BACKEND_ERROR
根本原因: Varnish无法重试,因为没有要发送的正文。
解决方案:使用std.cache_req_body缓存原始请求的body (10kb);https://varnish-cache.org/docs/trunk/reference/vmod_generated.html#func-cache-req-body
https://stackoverflow.com/questions/53523836
复制相似问题