【问题标题】:Varnish Backend Handling清漆后端处理
【发布时间】:2018-11-28 16:18:25
【问题描述】:

我遇到了一个相当棘手的问题,似乎清漆正在关闭后端连接而不等待后端的响应。

我们使用 Nginx 来提供静态内容下面是消息序列

Varnish 向 App 发送 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 接受并发送回客户

后端连接似乎很快关闭

非常感谢这方面的任何帮助

谢谢,

【问题讨论】:

  • 您的 varnishlog 似乎不完整(仅后端请求)。你确定不是this
  • 在收到来自后端的响应之前,只有显示连接已关闭的后端请求:(不幸的是,这与链接中提到的问题无关

标签: nginx varnish


【解决方案1】:

我们解决了这个问题,下面是问题是什么以及我们如何解决它的摘要;

问题摘要: 当原始 POST 请求导致 500 内部错误并且 backend_response 用于获取静态页面自定义 500 内部服务器错误消息时,varnish 显示后端获取错误

VarnishLog 输出(仅相关消息): 可以看到请求一发出Backend就被关闭了。

-   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(10KB) 缓存原始请求的正文; https://varnish-cache.org/docs/trunk/reference/vmod_generated.html#func-cache-req-body

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2012-04-22
    • 2017-11-24
    • 2017-07-21
    • 2018-07-18
    • 2014-10-25
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多